Как я могу отложить отправку формы?

#javascript #forms #delay #arduino

#javascript #формы #задержка #arduino

Вопрос:

У меня есть веб-сайт, который использует кнопки отправки для отправки команд на удаленный микропроцессор. Если пользователь нажимает кнопку отправки слишком много раз за короткий промежуток времени, удаленный микропроцессор и программное обеспечение выйдут из строя. Я подумал, что мог бы добавить односекундную задержку между каждым нажатием кнопки «отправить», чтобы она не зависала. Вот что у меня есть для кнопки отправки.

 <form name="test" action="http://mydomain.dyndns.org/?8" target="results" method="POST">
<input type="submit" value=" ← Move Left " />
</form>
  

Я думал, что мог бы использовать что-то подобное onSubmit="setTimeout (1000)" в форме, но, похоже, это не работает. Что я делаю не так?

Пример:

 <form name="test" action="http://mydomain.dyndns.org/?8" target="results" method="POST" onSubmit="setTimeout (1000)">
    <input type="submit" value=" ← Move Left " />
</form>
  

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

1. Я думаю, что лучшее место для этого было бы в серверной части. Если вы используете только JavaScript, его можно легко отключить, что все равно оставит вас открытыми для DoS-атак.

2. Плохой заголовок. Вы не откладываете события отправки, вы предотвращаете их.

Ответ №1:

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

Ответ №2:

Предпочтительнее серверное решение, но если вы хотите сделать это и на стороне клиента (или вместо этого):

Если ваш onsubmit возвращает false, это остановит отправку.

Я был бы склонен решить эту проблему с помощью:

  1. Временное отключение кнопки на секунду, чтобы пользователь не мог снова быстро отправить и / или
  2. Игнорирование последующих попыток отправки, если не прошло хотя бы секунды.

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

Итак, следующее игнорирует дополнительные попытки отправки, сделанные в течение секунды, и отключает кнопку отправки. Зачем делать оба? Если в форме есть поля, пользователь может отправить, нажав клавишу Ввода.

 <form name="test" action="http://mydomain.dyndns.org/?8" target="results"
      method="POST" onSubmit="return testSubmit();">
   <input id="submitButton" type="submit" value=" ← Move Left " />
</form> 

<script>
   var allowSubmit = true;

   function testSubmit() {
      if (!allowSubmit)
         return false;

      allowSubmit = false;
      document.getElementById("submitButton").disabled = true;

      setTimeout(function() {
                    allowSubmit = true;
                    document.getElementById("submitButton").disabled = false;
                 }, 1000);

      return true;
   }
</script>
  

Обратите внимание на этот код: onSubmit="return testSubmit();" — вам нужен «возврат» там, или значение, которое возвращается, testSubmit() отбрасывается, и отправка не будет предотвращена.