Это, вероятно, не ваш обычный "Как мне отображать события отправки формы?" вопрос.
Я пытаюсь понять, как обрабатываются события формы, передаваемые jQuery, ванильным Javascript и браузером (IE/FF/Chrome/Safari/Opera), а также отношения между ними. (См. мой другой вопрос.) После нескольких часов работы в Google и экспериментов я все еще не могу прийти к выводу, из-за раздора или неопределенности.
Я заканчиваю script, который интегрируется с формами веб-сайтов, чтобы формы не могли быть отправлены до тех пор, пока запрос AJAX не вернется.
В идеале:
- Пользователь заполняет форму
- Форма отправляется - но обработчики обработанных ранее привязанных вызовов не вызываются, кроме my
- Мой обработчик делает запрос API (асинхронно, конечно)
- Пользователь подтверждает результаты проверки ответа API
- Подача формы продолжается нормально, автоматически, вызывая другие обработчики, которые до этого были подавлены.
Мое настоящее понимание заключается в следующем: (это может быть неправильно, пожалуйста, исправьте меня, если да)
- jQuery привязывает форму отправки обработчиков событий к кнопке отправки
click
событий - Обработчики событий непосредственно в элементе отправки элемента
click
(будь то в разметке типаonclick=""
или связаны с использованием jQuery) выполняются сначала - Обработчики событий в событиях формы
submit
(будь то в разметке типаonsubmit=""
или связаны с использованием jQuery) выполняются следующим образом - Вызов
$('[type=submit]').click()
не вызывает событие формыsubmit
, поэтому его обработчики не получают вызов - Вызов
$('form').submit()
не вызывает событие отправкиclick
, поэтому его обработчики не получают вызов - Тем не менее, пользователь, который нажимает кнопку отправки, завершает вызов обработчиков, привязанных к событию формы
submit
... (но, как упоминалось выше, вызов на кнопку отправки не делает то же самое) - Фактически, любым способом пользователь отправляет форму (через кнопку отправки или нажав Enter), обработчики, связанные с jQuery в форме
submit
, вызываются...
Сейчас я:
- Отвязывание обработчиков, связанных с jQuery, с кнопкой отправки
click
при сохранении ссылки на них - Привязка моего обработчика к событию отправки
click
, поэтому он выполняет первый - Принимая любые обработчики, связанные в разметке, используя
onclick=""
иonsubmit=""
(по их соответствующим элементам) и повторно привязывая их с помощью jQuery (чтобы они выполнялись после моего), а затем устанавливая атрибутыnull
- Повторное связывание своих обработчиков (с шага 1), чтобы они выполняли последние
На самом деле, это было замечательно эффективно в моем собственном тестировании, так что мой обработчик событий запускается первым (существенным).
Проблема и мои вопросы:
Мой обработчик запускается первым, как и ожидалось (до сих пор). Проблема в том, что мой обработчик является асинхронным, поэтому я должен подавить (preventDefault/stopPropagation/etc) форму submit
или отправить кнопку click
событие, которое вызвало его... до тех пор, пока запрос API не будет выполнен. Затем, когда возвращается запрос API, и все это A-OK, мне нужно повторно вызвать форму submit автоматически. Но из-за моих замечаний выше, как я могу убедиться, что все обработчики событий запущены, как если бы это была естественная форма submit?
Каков самый чистый способ захватить все свои обработчики событий, сначала поставить мой, затем повторно вызвать форму submit, чтобы все вызывалось в правильном порядке?
А какая разница, если таковая имеется, между $('form').submit()
и $('form')[0].submit()
? (И то же самое для $('[type=submit]').click()
и $('[type=submit]')[0].click()
)
tl; dr. Какова каноническая, ясная документация об использовании Javascript/jQuery/браузера form-submit-event-handling? (Я не ищу рекомендации для книги.)
Некоторое объяснение: я пытаюсь компенсировать большое количество Javascript на страницах проверки корзины покупок, где иногда форма отправляется только тогда, когда пользователь нажимает кнопку BUTTON (не кнопку отправки) в нижней части страницы, или есть другие сложные сценарии. До сих пор он был довольно успешным, он просто повторно ссылался на submit, что действительно проблема.