Загрузка html-входных данных в текстовый файл в локальную папку диска C.

#html

#HTML

Вопрос:

Я только начал, и мы со студентом создали онлайн-рабочую тетрадь, но не можем получить ответы для загрузки в текстовый файл, он загружается, но когда мы открываем файл, он выдает undefined вот мой код.

Это работает с Outlook, но у студентов нет Outlook, у них есть электронная почта Office 365 через Интернет, и мне не разрешено использовать наш smtp-сервер
Электронная почта отображается следующим образом

Имя = Здесь показано имя учащегося
1.1= здесь показаны ответы 1.2= 1.3= 1.4= 1.5= 1.6= И так далее

Вот пример моего кода

 <form onsubmit="download(this['name'].value, ['text'].value, ['id'].value)">


<h4>Students Name<input type="text" name="Name" value="" size="50"><br></h4>
 <br>
<h4>1. Why is it important to think about safety?</h4>

<p><label for="q1"><input type="radio" name="1.1" value=" A" id="q1a" />it identifies where the risks are.</label></p>
<p><label for="q1"><input type="radio" name="1.1" value=" B" id="q1b" />because I may get hurt.</label></p>
<p><label for="q1"><input type="radio" name="1.1" value=" C" id="q1c" />because it may prevent accidents and keep everyone safe.</label></p>
<p><label for="q1"><input type="radio" name="1.1" value=" D" id="q1d"/>because it will keep others safe.</label></p>
<br>


<h4>11. Respirators should be used to prevent?</h4>
<input type="text" name="1.11" id="1.11" size= "120"></p>
<br>
<h4>12. Disposable gloves are optional but do provide a convenient way to avoid?</h4>

<input type="text" name="1.12" id="1.12" size= "120"></p>
<br>
<h4>13. Why should you prevent liquid oil and grease from entering the pores of your skin?</h4>

<input type="text" name="1.13" id="1.13" size= "120"></p>
<br>

<h4>14. Why shouldn't we use hot water to wash off grease and oil off our hands?</h4>


<input type="text" name="1.14" id="1.14" size= "120"></p>
<br>

<h4>15. List 3 things that may cause a fire or act as a fuel?</h4>
<p>a.   <input type="text" name="1.15a" id="1.15a" size= "117"></p>
<p>b.   <input type="text" name="1.15b" id="1.15b" size= "117"></p>
<p>c.   <input type="text" name="1.15c" id="1.15c" size= "117"></p>

  <input type="submit" value="Download">
  </style>
<script language="Javascript" >
function download(filename, text) {
  var pom = document.createElement('a');
  pom.setAttribute('href', 'data:text/plain;charset=utf-8,'   

encodeURIComponent(text));
  pom.setAttribute('download', filename);

  pom.style.display = 'none';
  document.body.appendChild(pom);

 pom.click();

  document.body.removeChild(pom);
}
</script>
  

Комментарии:

1. Спасибо, я действительно новичок в кодировании, как вы можете видеть из моего вопроса. Мы с моими учениками разработали веб-страницу безопасности для использования дома в школе и хотим сохранить входные данные в текстовый файл. Преимущество Outlook в том, что я могу отправить его по электронной почте в Outlook с помощью формы method=post action =mailto, но у моих студентов нет доступа к Outlook, поэтому мы хотим сохранить его в виде загружаемого текстового файла на их компьютерах.

2. Вот пара вопросов <h4> 1. Для предотвращения этого следует использовать респираторы?</h4> <тип ввода= «text» name=»1.1″ id= «1.1» size= «120»></p> <br> <h4>2. Одноразовые перчатки необязательны, но предоставляют удобный способ избежать этого?</h4> <тип ввода= «text» name=»1.2″ id= «1.2» size= «120»></p> <br>

Ответ №1:

Если я правильно понял ваш вопрос, проблема в том, что вы вызываете функцию загрузки с неопределенными аргументами. Чтобы получить данные из вашей формы, вы можете выполнить цикл

 document.getElementById('yourFrom').elements
  

и сохраняйте пары имя-значение в объекте. А затем вы можете передать этот объект своей функции загрузки.

Мой пример кода собирает данные формы в функции

 getFormData()
  

это вызывается нажатием кнопки вместо отправки формы.

Поскольку у вас есть переключатели в форме вопросов, цикл должен проверять наличие этого и сохранять только выбранное значение. Я добавляю комментарии в свой пример кода, чтобы объяснить, как это делается.

Я прокомментировал функцию

 download()
  

потому что я думаю, что было бы не очень хорошей идеей заставлять людей здесь скачивать файл.
Но вы можете увидеть, что сохранено в файле, когда вы открываете инструменты разработки вашего
браузер. Для этого я поместил строку

 console.log(...);
  

Я также поместил несколько примеров значений в форму здесь, во фрагменте кода, для удобства.

 function download(filename, text) {
  /*var pom = document.createElement('a');
  pom.setAttribute('href', 'data:text/plain;charset=utf-8,'   encodeURIComponent(text));
  pom.setAttribute('download', filename);
  pom.setAttribute('target', new Date());
  pom.style.display = 'none';
  document.body.appendChild(pom);
  pom.click();
  document.body.removeChild(pom);*/
  console.log('filename: '   filename);
  console.log('text: '   text);
}

/* get the Data from questions form */
function getFormData() {
  var form = document.getElementById("questionsForm");
  var questions = form.elements;
  var ret_obj ={};
  var radios = [];
  for(var i = 0 ; i < questions.length ; i  = 1){
    var item = questions.item(i);
    if (item.type == 'radio') {
      /* if question input type is radio */
      if (radios.indexOf(item.name) == -1) {
         /* safe radio group name in array radios
         to prevent check on other radios of the same group */
        radios.push(item.name);
        /* safe radio group name and checked value in ret_obj */
        ret_obj[item.name] = document.querySelector('input[name="'   item.name   '"]:checked').value;
      }
    } else {
      /* if question input is different from radio
         safe the name-value pair in ret_obj */
      ret_obj[item.name] = item.value;        }
    }
    console.log(JSON.stringify(ret_obj));
    download('yourFilename', JSON.stringify(ret_obj));
  }  
 <div>
<form id="questionsForm">

<h4>Students Name<input type="text" name="Name" value="TheStudentsName" size="50"></h4>

<h4>1. Why is it important to think about safety?</h4>
<p><label for="q1"><input type="radio" name="1.1" value="A" id="q1a" />it identifies where the risks are.</label></p>
<p><label for="q1"><input type="radio" name="1.1" value="B" id="q1b" checked/>because I may get hurt.</label></p>
<p><label for="q1"><input type="radio" name="1.1" value="C" id="q1c" />because it may prevent accidents and keep everyone safe.</label></p>
<p><label for="q1"><input type="radio" name="1.1" value="D" id="q1d"/>because it will keep others safe.</label></p>


<h4>11. Respirators should be used to prevent?</h4>
<p><input type="text" name="1.11" id="1.11" size= "120" value="answer11"></p>

<h4>12. Disposable gloves are optional but do provide a convenient way to avoid?</h4>
<p><input type="text" name="1.12" id="1.12" size= "120" value="answer12"></p>

<h4>13. Why should you prevent liquid oil and grease from entering the pores of your skin?</h4>
<p><input type="text" name="1.13" id="1.13" size= "120" value="answer13"></p>

<h4>14. Why shouldn't we use hot water to wash off grease and oil off our hands?</h4>
<p><input type="text" name="1.14" id="1.14" size= "120" value="answer14"></p>

<h4>15. List 3 things that may cause a fire or act as a fuel?</h4>
<p>a.   <input type="text" name="1.15a" id="1.15a" size= "117" value="answer15a"></p>
<p>b.   <input type="text" name="1.15b" id="1.15b" size= "117" value="answer15b"></p>
<p>c.   <input type="text" name="1.15c" id="1.15c" size= "117" value="answer15c"></p>

</form>
<button onclick="getFormData()">getFormData</button>
</div>  

Кстати: вместо устаревшего

 <script language="Javascript"></script>
  

вы должны использовать

 <script type="text/javascript"></script>
  

Чтобы сделать текст в файле более читабельным, вы можете использовать третий параметр JSON.stringify.

 JSON.stringify(ret_obj, null, 't')
  

Обновить

В приведенном выше примере вопрос без ответа из полей ввода просто не защищен. Чтобы запросить ответ, вы можете использовать требуемый атрибут <input>.

 <!-- example for required attribute of input element -->
<h4>11. Respirators should be used to prevent?</h4>
<p><input type="text" name="1.11" id="1.11" size= "120" required></p>
  

Однако требуются вопросы от переключателей, иначе скрипт выдаст ошибку, поскольку в строке

 ret_obj[item.name] = document.querySelector('input[name="'   item.name   '"]:checked').value;
  

document.querySelector('input[name="' item.name '"]:checked') имеет значение null, если ни один переключатель группы не установлен и null не имеет значения свойства.

Как w3.org состояния:

Чтобы избежать путаницы относительно того, требуется ли группа переключателей или нет, авторам рекомендуется указывать атрибут для всех переключателей в группе. Действительно, в целом авторам рекомендуется избегать использования групп переключателей, в которых изначально нет проверенных элементов управления, поскольку это состояние, в которое пользователь не может вернуться, и поэтому обычно считается плохим пользовательским интерфейсом.

Фактически только для одной из переключателей группы требуется атрибут required, чтобы сделать группу обязательной. Или должен быть предварительно выбранный переключатель, как в следующем примере.

 <h4>1. Who is the owner of my socks?</h4>
<p><label for="q1a">
  <input type="radio" name="socksOwner" value="me" id="q1a">me
</label></p>
<p><label for="q1b">
  <input type="radio" name="socksOwner" value="JohnDoe" id="q1b" />John Doe
</label></p>
<p><label for="q1c">
  <input type="radio" name="socksOwner" value="NA" id="q1c" checked/>I don't know
</label></p>
  

Однако, если вы не хотите, чтобы ответ на вопрос с переключателями был обязательным или предварительно выбран, нам нужно обработать это в скрипте. Для этого мы проверяем, выбран ли один элемент группы, и только в этом случае сохраняем значение. Для достижения этого измените эту строку

 ret_obj[item.name] = document.querySelector('input[name="'   item.name   '"]:checked').value;
  

для этого:

 /* checked item in radio group*/
var selRadio = document.querySelector('input[name="'   item.name   '"]:checked');
/* if one of the radio buttons in the group is checked, safe value */
if (selRadio !== null) {
  ret_obj[item.name] = selRadio.value;
}
  

Комментарии:

1. Спасибо за помощь, она мне нужна! Я собирался попросить студентов загрузить их, чтобы они могли отправлять их мне по электронной почте через свои учетные записи office 365 в виде вложения.

2. Если мой ответ полезен, пожалуйста, рассмотрите возможность его принятия.

3. Не забудьте еще раз прокомментировать ту часть функции загрузки, которую я закомментировал.

4. Если учащиеся могут сохранять свои файлы, не отвечая на все вопросы. Тогда вопросов, на которые нет ответов, в файле нет. Чтобы сделать выходные данные более удобочитаемыми, вы можете использовать третий параметр JSON.stringify . Я добавлю пример к своему ответу.

5. Извините, я не понимаю. Если у вас есть дополнительные вопросы, пожалуйста, задайте новый вопрос. Вы можете поместить здесь ссылку на новый вопрос, если хотите.