it-roy-ru.com

Как предотвратить отправку формы?

У меня есть форма, в которой есть кнопка «Отправить».

Тем не менее, я хотел бы как-то «перехватить» событие submit и предотвратить его возникновение.

Есть ли способ, которым я могу сделать это?

Я не могу изменить кнопку отправки, потому что она является частью пользовательского элемента управления.

193
Nathan Osman

В отличие от других ответов, возвращение false является только частью ответа. Рассмотрим сценарий, в котором ошибка JS происходит до оператора return ...

HTML

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

скрипт

function mySubmitFunction()
{
  someBug()
  return false;
}

возвращение false здесь не будет выполнено, и форма будет отправлена ​​в любом случае. Вам также следует вызвать preventDefault, чтобы предотвратить действие формы по умолчанию для отправки формы Ajax.

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

В этом случае даже с ошибкой форма не будет отправлена!

В качестве альтернативы можно использовать блок try...catch.

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}
202
Ben Rowe

Вы можете использовать встроенное событие onsubmit, как это

<form onsubmit="alert('stop submit'); return false;" >

Или же

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

Демо

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

Пожалуйста, узнайте больше о Inline Events vs Event Listeners (addEventListener и IE attachEvent) здесь . Ибо я не могу объяснить это более, чем Крис Бейкер сделал. 

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

130
Reigel

Присоедините прослушиватель событий к форме, используя .addEventListener() , а затем вызовите метод .preventDefault() для event:

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

Я думаю, что это лучшее решение, чем определение обработчика событий submit, встроенного в атрибут onsubmit, поскольку он разделяет логику и структуру веб-страницы. Гораздо проще поддерживать проект, в котором логика отделена от HTML. Смотрите: Ненавязчивый JavaScript .

Использование свойства .onsubmit объекта DOM form не очень хорошая идея, поскольку оно не позволяет вам присоединять несколько обратных вызовов submit к одному элементу. Смотрите addEventListener vs onclick .

82
Michał Perłakowski

Попробуй это...

HTML-код

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

код JQuery

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

или же

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});
11
Sach

На данный момент работает следующее (протестировано в Chrome и Firefox):

<form onsubmit="event.preventDefault(); return validateMyForm();">

где validateMyForm () - это функция, которая возвращает false, если проверка не удалась. Ключевым моментом является использование имени event. Мы не можем использовать, например, для e.preventDefault()

9
Vikram Pudi
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}
8
naikus

Чтобы следовать ненавязчивым правилам JavaScript программирования и в зависимости от того, как быстро будет загружаться DOM , может быть хорошей идеей использовать следующее:

<form onsubmit="return false;"></form>

Затем подключите события, используя onload или DOM ready, если вы используете библиотеку.

$(function() {
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) {
        // quick validation example...
        $form.children('input[type="text"]').each(function(){
            if($(this).val().length == 0) {
                alert('You are missing a field');
                ev.preventDefault();
            }
        });
    });
});
label {
    display: block;
}

#my-form > input[type="text"] {
    background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

Кроме того, я бы всегда использовал атрибут action, так как у некоторых людей может быть запущен такой плагин, как NoScript , который затем нарушит валидацию. Если вы используете атрибут действия, по крайней мере, ваш пользователь будет перенаправлен сервером на основе проверки бэкэнда. Если вы используете что-то вроде window.location, с другой стороны, все будет плохо.

0
user3423894

Для предотвращения отправки формы вам нужно только сделать это.

<form onsubmit="event.preventDefault()">
    .....
</form>

Используя приведенный выше код, это предотвратит отправку вашей формы.

0
Zuhair Taha