Возврат false в первом из нескольких обработчиков представления формы
У меня есть два обработчика отправки, один из которых проверяет форму и один представляет форму:
// validates the form but does not submit it
$("form").submit(function() {
// perform validation here and set "validationFails" appropriately
// ...
if (validationFails) {
return false;
}
});
// submits the form via ajax
$("form").submit(function(event) {
event.preventDefault();
// submit the form via ajax here
// ...
});
Кажется, что форма не должна быть отправлена через ajax, если проверка не выполняется, потому что используется return false
, и поэтому последующий обработчик submit
в цепочке не должен вызываться. Однако, даже если проверка не выполняется, форма отправляется через ajax. Почему?
Ответы
Ответ 1
Возврат false
из обработчика событий является эквивалентом вызова как event.preventDefault()
, так и event.stopPropagation()
, то есть он предотвращает действие по умолчанию для события происходит, и оно останавливает событие, пузырящее дерево DOM. Он не останавливает выполнение других обработчиков одного и того же элемента.
Вам нужно вызвать метод event.stopImmediatePropagation()
, который останавливает выполнение других обработчиков, связанных с тем же элементом, отмечая, что обработчики будут выполняются в том же порядке, в котором они связаны, поэтому вы (очевидно) должны сначала привязать ваш обработчик проверки.
$("form").submit(function(event) {
// perform validation here and set "validationFails" appropriately
// ...
if (validationFails) {
event.stopImmediatePropagation();
return false;
}
});
Ответ 2
Отсутствует аргумент event
во втором обработчике submit
, а также необходимо прекратить распространение события с первого обработчика submit
, когда проверка не выполняется.
$("form").submit(function(event) {
// validate...
if (validationFails) {
event.stopPropagation();
return false;
}
});
$("form").submit(function(event) {
event.preventDefault();
// submit the form via ajax
});
Ответ 3
Ваша логика неверна, что два обработчика разговаривают друг с другом. Используйте только один обработчик. Возвращайте false, если проверка не выполняется, отправляйте через ajax, если она не терпит неудачу.