Проверка формы HTML с использованием синхронного запроса ajax - PullRequest
0 голосов
/ 02 июля 2011

TLDR : Можно ли каким-либо образом эмулировать событие onreadystatechange для синхронных запросов без зависания браузера, поскольку оно не запускается в Firefox?

~~~~~

Я создал веб-форму, которая требует проверки и получения некоторых элементов с сервера перед отправкой.

Что я делаю сейчас, так это 'onsubmit' Я запускаю ajax-запрос к своемуна сервер, отправьте данные формы, проанализируйте их на стороне сервера и верните в форму уникальный проверочный номер и хэш md5.

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

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

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

Но Firefox не запускает событие onreadystatechange в синхронных запросах.Это поведение наблюдается в версии 1.5 или около того.

Как я уже видел, большинство людей в какой-то момент запускают обработчик - потому что ответ получен и находится в DOM (responseText).просто событие onreadystatechange не запускается.

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

Я испробовал два решения, оба из которых плохие:

  • Используйте синхронный запрос и поместите обработчик в цикл while, ожидая ответа.
  • Использовать асинхронный запрос и иметь некоторое время (myvariable);ждать, пока ответ не придет (myvariable - это ответ, который я получаю от сервера, после обработки responseText.

Оба из них, конечно, приводят к зависанию Firefox в течение довольно долгого времени, так как Javascript ждет вцикл while. В конце концов, он работает нормально, если защита Firefox от замерзания не срабатывает и не говорит, что скрипт на этой странице не отвечает.

Что бы вы предложили? МожетЯ делаю цикл while, не замораживая браузеры? Может быть, опросник, который не опрашивает каждую миллисекунду, как цикл while, но, скажем, каждую 1 секунду, чтобы скрипт не зависал?

Ответы [ 2 ]

1 голос
/ 02 июля 2011

Если ваш запрос является синхронным, то, как только вызов send () вернется, ответ станет полностью доступным. Вот и весь смысл синхронных запросов. Зачем вам вообще нужно делать какие-либо циклы в этом случае?

0 голосов
/ 02 июля 2011

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

  1. Используйте некоторый код JavaScript для отлова действительно очевидных ошибок (пропущенные / пустые поля и т. Д.).
  2. Если явных ошибок нет, отправьте форму. Если проверка на стороне сервера не удалась, сервер отправляет пользователя обратно в ту же форму с ошибками, помеченными / объясненными.

Однако вам не нужен синхронный AJAX-запрос, чтобы получить то, что вы хотите. Все, что вам нужно сделать, это отменить событие onsubmit во время проверки AJAX, а затем вручную отправить форму, как только вы получите ответ от сервера. Таким образом, вы можете настроить свою форму как:

<form id="myForm" onsubmit="doAjaxValidation(); return false;">
    <!-- input fields, etc. -->
</form>

... и тогда ваш обработчик ответа может сделать что-то вроде:

//check the response to make sure everything was valid, add required data to the form, etc.

if (validationWasSuccessful) {
    //validation successful, submit the form
    document.getElementById("myForm").submit();
}

Обратите внимание, что вы, скорее всего, захотите отключить все поля ввода в форме во время обработки проверки. В противном случае, если по какой-либо причине у вашего сервера медленный день, а проверка занимает 10 секунд, пользователь может изменить данные в форме во время их проверки, что приведет к сбою последующей отправки формы. Также обратите внимание, что даже если вы отключите форму, это не помешает определенному пользователю использовать что-то вроде консоли JavaScript в Chrome для редактирования значений полей на этапе проверки.

Обе эти проблемы исчезнут, если вы сможете найти какой-то способ избавиться от метода разделения проверки и отправки. И ваш рабочий процесс также становится более эффективным. Поездки туда и обратно на сервер дороги.

...