Есть ли способ узнать, отправляет ли в настоящее время HTML-форму? - PullRequest
2 голосов
/ 03 ноября 2010

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

Я бы не хотел менять код для формы.

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

Затем перед вызовом AJAX убедитесь, что счетчик равен нулю, прежде чем запустить.

Однако есть более простой способ, например (псевдокод):

form.isSubmitting 

EDIT:

Состояние гонки не из-за высказывания JavaScript. Это вызвано тем, что происходит на стороне сервера в ответ на порядок этих действий.

Чтобы дать вам представление о более широкой проблеме:

Файл cookie устанавливается при возврате сообщения формы. При вызове AJAX (должен происходить каждые X секунд) ... серверная сторона (если произошла публикация формы) ожидает установки файла cookie.

Иногда ....

Если имеется задержка в возврате отправки формы (и настройке стороны клиента cookie), вызов AJAX запускается без отправки cookie обратно.

Сервер ожидает cookie, потому что пост в форме был успешным.

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

Так что правильный JavaScript сам по себе не может вызывать условия гонки, но (насколько показал мой тест) - отправка и возврат вызовов POST / AJAX вызывает условие гонки в моем конкретном случае.

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Вы можете добавить это к тегу формы:

<form ... onsubmit="this.setAttribute('isSubmitting', 'true');">

И вы сможете увидеть, «отправляет» ли он, проверив этот атрибут.

1 голос
/ 03 ноября 2010

В Javascript на веб-странице нет "условий гонки", потому что есть только один поток выполнения. Если вы хотите, чтобы обработчики событий не делали что-либо после отправки формы (или, в действительности, в любое время), самое простое, что нужно сделать, - установить какой-либо глобально доступный флаг. Процедуры обработчика просто должны проверить это. Конечно, важно, чтобы флаг был сброшен при необходимости.

изменить & mdash; Хорошо, после редактирования немного яснее, что вы делаете, но одно не ясно: как именно форма публикуется? Это «естественная» форма поста? Если это так, ответом будет перезагружена вся страница. Является ли цель отдельной <iframe> возможно?

Или форма представляется каким-то другим AJAX-кодом?

  1. Если форма отправляется браузером "естественно", и мы говорим о перезагрузке всей страницы, то это, вероятно, самый простой случай. Обработчик отправки формы должен просто установить глобальный флаг, а код, выполняемый через интервальный таймер, не должен ничего делать с интервалами, когда этот флаг установлен. Нет необходимости беспокоиться о снятии флажка, потому что ответ все равно будет взорван страницей.

  2. Если форма публикуется в пределах <iframe> на странице или размещается на скрытом <iframe>, то это почти то же самое, что (1), за исключением того, что страница ответа будет нужно очистить глобальный флаг. Как именно это сделать, зависит от того, что включает в себя настройка приложения, но в основном это будет просто какой-то Javascript в ответе, который устанавливает top.postingFlag в false (или что угодно).

  3. Если это отдельный код AJAX, который публикует форму, тогда вы установите флаг при запуске XMLHttpRequest и очистите его в обработчике (ях) для успеха / неудачи.

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

0 голосов
/ 03 ноября 2010

Да, это сработало бы.

Вы можете отправить форму через звонок AJAX. Таким образом, вы можете управлять событиями ajaxSend и ajaxComplete и иметь глобальную переменную, скажем, var formIsSubmiting = false, служащую флагом.

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

...