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


246

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

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

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

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


Вы все еще можете получить доступ к кнопке отправки. Рендеринг страницы и захватить его ClientID, просмотрев источник страницы. Затем, используя что-то вроде jQuery, вы можете сделать что-то вроде $ ('# ctl01_cph01_controlBtn1'). Click (function () {return false;});
бунтарь

@Rafael: Верно ... но это было бы последним средством - это очень сложный контроль.
Натан Осман

@Raf, основанный на asp.net, а также не лучшая практика. Но это по существу правильно. Я бы просто не смотрел на источник и не использовал имя элемента управления, так как оно может измениться, если кто-то отредактирует страницу. Непреднамеренные побочные эффекты и тому подобное.

Ответы:


261

В отличие от других ответов, возвращение 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;
}

4
Почему бы не вернуться falseпрямо из onsumbit?
ProfK

1
Возможно, вы захотите показать сообщение об ошибке пользователю в onsubmit. Например, «заполните это обязательное поле и отправьте». В этом случае event.preventDefault очень пригодится
Марк Чорли

1
@ProfK, если вы используете event.preventDefault (), это не будет иметь значения, try / catch будет просто частью вашей обработки ошибок
Бен Роу,

11
<form onsubmit = "return mySubmitFunction (event)"> сработало ... пришлось использовать слово event в скобках в firefox
danday74

5
@BenRowe Вы должны добавить параметр evt к вызываемому методу. (<form onsubmit="return mySubmitFunction(evt)">). В противном случае это дает неопределенную ошибку.
UfukSURMEN

143

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

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

Или

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

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

демонстрация

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

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

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


Хорошее, быстрое решение на дороге.
Фернандо Торрес

у <form onsubmit="return false;" >меня почему то не работает.
Руан

102

Присоедините слушатель события к форме, используя, .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свойства formобъекта DOM не является хорошей идеей, поскольку оно не позволяет вам присоединять несколько обратных вызовов submit к одному элементу. Смотрите addEventListener против onclick .


1
и для jquery: $("button").click(function(e) { e.preventDefault() });
Nixen85

2
+1 Не знаю, почему все остальные ответы продолжают использовать встроенные сообщения, так как OP упомянул, что он не может изменить кнопку (что означает, что он, вероятно, также не может изменить форму). Хотите знать, если есть способ получить «форму», если у нас есть идентификатор кнопки
Роберт Синклер

16

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

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.");
    });
});

18
В этом вопросе нет тега jQuery.
Михал Перлаковский

6
@ Gothdo и все же решение остается тем же. сумасшедший, верно?
Кевин Б.

7
@ Да, да, точно так же. eventObject.preventDefault. То, как вы связываете обработчик, не меняет решение. Я бы даже сказал, что ваш ответ ничем не отличается от принятого.
Кевин Б.

stopPropagationбыло единственным, что сработало в моем случае. Спасибо! :)
cregox

13

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

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

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


1
onsubmit = "return validateMyForm ();" достаточно, но validateMyForm () должен возвращать true или false.
Адриан П.

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

2
Я думаю, что использование .onsubmitэто плохая идея, потому что она мешает вам присоединить несколько submitобратных вызовов к одному элементу. Я рекомендую использовать .addEventListener().
Михал Перлаковский

3
Даже если вы установили обработчик события через свойство .onsubmit, вы все равно можете добавить дополнительные обработчики через .addEventListener (). Обработчик, зарегистрированный свойством, будет вызываться первым, а затем обработанным .addEventListener () в том порядке, в котором они были зарегистрированы.
Даниэль Грейнджер

2

Чтобы следовать ненавязчивым соглашениям по программированию 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, с другой стороны, все будет плохо.


2

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

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

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


0

Вот мой ответ:

<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
    e.preventDefault();
    const name = e.target.name.value;
    renderSearching();

    return false;
}
</script>

Добавить event.preventDefault();на onsubmitи она работает.


0

Вы можете добавить eventListner к форме preventDefault()и преобразовать данные формы в JSON, как показано ниже:

const formToJSON = elements => [].reduce.call(elements, (data, element) => {
  data[element.name] = element.value;
  return data;

}, {});

const handleFormSubmit = event => {
    event.preventDefault();
    const data = formToJSON(form.elements);
    console.log(data);
  //  const odata = JSON.stringify(data, null, "  ");
  const jdata = JSON.stringify(data);
    console.log(jdata);

    (async () => {
      const rawResponse = await fetch('/', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: jdata
      });
      const content = await rawResponse.json();

      console.log(content);
    })();
};

const form = document.forms['myForm']; 
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
    <label>Checkbox:
        <input type="checkbox" name="checkbox" value="on">
    </label><br /><br />

    <label>Number:
        <input name="number" type="number" value="123" />
    </label><br /><br />

    <label>Password:
        <input name="password" type="password" />
    </label>
    <br /><br />

    <label for="radio">Type:
        <label for="a">A
            <input type="radio" name="radio" id="a" value="a" />
        </label>
        <label for="b">B
            <input type="radio" name="radio" id="b" value="b" checked />
        </label>
        <label for="c">C
            <input type="radio" name="radio" id="c" value="c" />
        </label>
    </label>
    <br /><br />

    <label>Textarea:
        <textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
    </label>
    <br /><br />

    <label>Select:
        <select name="select">
            <option value="a">Value A</option>
            <option value="b" selected>Value B</option>
            <option value="c">Value C</option>
        </select>
    </label>
    <br /><br />

    <label>Submit:
        <input type="submit" value="Login">
    </label>
    <br /><br />


</form>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.