Может ли событие отправки быть отменено?

#javascript #jquery

#javascript #jquery

Вопрос:

Я хочу остановить отправку формы и вместо этого сделать что-то другое ( window.location.href перенаправить на красиво напечатанный URL). Но я не могу даже получить основную часть предотвращения отправки формы.

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

 $(function($){
  $("#search_form").submit(function(e){
    console.log("cancelling submit");
    return false;
  });
});
  

Я также пробовал e.preventDefault() , e.stopPropagation() и различные их комбинации. "cancelling submit" печатается в консоли Firebug (поэтому событие срабатывает), но форма отправляется независимо, что бы я ни делал.

Документация и логика jQuery подразумевают, что это должно сработать, но это не так. Я делаю что-то не так?

Подключение к событию click может быть проще, но формы могут быть отправлены несколькими способами — нажатием кнопок, нажатием Enter и, возможно, чем-то еще, о чем я не подумал, поэтому я пытаюсь просто принять событие отправки.

Я тестирую все это в Firefox.

РЕДАКТИРОВАТЬ: Оказалось, что <button type='submit' onclick='this.form.submit()'>Search</button> было причиной этого. Оглядываясь назад, это кажется глупым. Спасибо всем за помощь.

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

1. Я думаю, весь смысл метода submit() в том, что это происходит ПРИ отправке. По определению, форма уже была отправлена, когда это событие срабатывает, и вы пытаетесь вернуть false .

2. Да, @kennis прав, я полагаю. Можете ли вы вместо этого вызвать событие click на кнопке отправки?

3. Если бы только был метод ohWaitNevermind().

4. Событие .submit() запускается до того, как браузер отправит http-запрос, позволяя вам запустить проверку, обработать форму через ajax и т.д., А затем отменить запрос отправки формы. Предоставленный код работает, в этом вопросе чего-то не хватает, что вызывает проблему.

5. СОВЕТ: исправление проблем .submit () сложно, потому что консоль не сохраняет состояние между страницами. Я бы рекомендовал использовать консоль ошибок (ctrl shift j) для диагностики любых ошибок при решении проблем .submit().

Ответ №1:

Я только что протестировал ваш код по адресу:http://jsfiddle.net/UZwr5 /

Предоставленный вами код работает в этой демонстрации. Скорее всего, у вас где-то в процессе выполнения произошла ошибка, которая мешает return false; запуску.

Ответ №2:

попробуйте их все вместе return false и e.StopPropagation() и e.preventDefault()

но больше похоже на это:

 if(e.stopPropagation)
{
    e.stopPropagation();
}

if(e.preventDefault)
{
    e.preventDefault();
}

return false;
  

Это делает его гораздо более совместимым с другими браузерами.