Как запретить кнопкам отправлять формы - PullRequest
790 голосов
/ 31 мая 2009

На следующей странице с Firefox кнопка удаления отправляет форму, а кнопка добавления - нет. Как предотвратить отправку формы кнопкой удаления?

<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function addItem() {
  var v = $('form :hidden:last').attr('name');
  var n = /(.*)input/.exec(v);
  var newPrefix;
  if ( n[1].length == 0 ) {
    newPrefix = '1';
  } else {
    newPrefix = parseInt(n[1])+1;
  }
  var oldElem = $('form tr:last');
  var newElem = oldElem.clone(true);
  var lastHidden = $('form :hidden:last');
  lastHidden.val(newPrefix);
  var pat = '=\"'+n[1]+'input';
  newElem.html(newElem.html().replace(new RegExp(pat, 'g'), '=\"'+newPrefix+'input'));
  newElem.appendTo('table');
  $('form :hidden:last').val('');
}
function removeItem() {
  var rows = $('form tr');
  if ( rows.length > 2 ) {
    rows[rows.length-1].html('');
    $('form :hidden:last').val('');
  } else {
    alert('Cannot remove any more rows');
  }
}
</script>
</head>
<body>
<form autocomplete="off" method="post" action="">
<p>Title:<input type="text" /></p>
<button onclick="addItem(); return false;">Add Item</button>
<button onclick="removeItem(); return false;">Remove Last Item</button>
<table>
<th>Name</th>

<tr>
  <td><input type="text" id="input1" name="input1" /></td>
  <td><input type="hidden" id="input2" name="input2" /></td>
</tr>
</table>
<input id="submit" type="submit" name="submit" value="Submit">
</form>
</body>
</html>

Ответы [ 16 ]

1550 голосов
/ 31 мая 2012

Вы используете элемент кнопки HTML5. Помните, причина в том, что эта кнопка имеет стандартное поведение отправки, как указано в спецификации W3, как показано здесь: Кнопка W3C HTML5

Так что вам нужно явно указать его тип:

<button type="button">Button</button>

для переопределения типа отправки по умолчанию. Я просто хочу указать причину, по которой это происходит =)

=)

574 голосов
/ 31 мая 2009

Укажите тип кнопок:

<button type="button" onclick="addItem(); return false;">Add Item</button>
<button type="button" onclick="removeItem(); return false;">Remove Last Item</button>

... это удержит их от запуска действия отправки при возникновении исключения в обработчике событий. Затем исправьте функцию removeItem(), чтобы она не вызывала исключение:

function removeItem() {
  var rows = $('form tr');
  if ( rows.length > 2 ) {
    // change: work on filtered jQuery object
    rows.filter(":last").html('');
    $('form :hidden:last').val('');
  } else {
    alert('Cannot remove any more rows');
  }
}

Обратите внимание на изменение: ваш исходный код извлек элемент HTML из набора jQuery, а затем попытался вызвать для него метод jQuery - это вызвало исключение, что привело к поведению кнопки по умолчанию.

FWIW, есть еще один способ, которым вы могли бы пойти с этим ... Подключите ваши обработчики событий, используя jQuery, и используйте метод protectDefault () для объекта jQuery , чтобы отменить поведение по умолчанию заранее:

$(function() // execute once the DOM has loaded
{

  // wire up Add Item button click event
  $("#AddItem").click(function(event)
  {
    event.preventDefault(); // cancel default behavior

    //... rest of add logic
  });

  // wire up Remove Last Item button click event
  $("RemoveLastItem").click(function(event)
  {
    event.preventDefault(); // cancel default behavior

    //... rest of remove last logic
  });

});

...

<button type="button" id="AddItem" name="AddItem">Add Item</button>
<button type="button" id="RemoveLastItem" name="RemoveLastItem">Remove Last Item</button>

Этот метод хранит всю вашу логику в одном месте, облегчая отладку ... он также позволяет реализовать откат, изменив type на кнопках обратно на submit и обработав событие на стороне сервера - это известно как ненавязчивый JavaScript .

28 голосов
/ 21 марта 2012

Некоторое время назад мне нужно было нечто очень похожее ... и я получил это.

То, что я здесь изложил, это то, как я делаю трюки, чтобы форма могла быть отправлена ​​JavaScript без какой-либо проверки и выполнять проверку только тогда, когда пользователь нажимает кнопку (обычно кнопку отправки).

Для примера я буду использовать минимальную форму, только с двумя полями и кнопкой отправки.

Помните, что нужно: Из JavaScript он может быть отправлен без какой-либо проверки. Однако, если пользователь нажимает такую ​​кнопку, проверка должна быть выполнена, и форма должна отправляться только в том случае, если проверка прошла успешно.

Обычно все начинается примерно с этого (я удалил все лишние вещи, неважно):

<form method="post" id="theFormID" name="theFormID" action="">
   <input type="text" id="Field1" name="Field1" />
   <input type="text" id="Field2" name="Field2" />
   <input type="submit" value="Send" onclick="JavaScript:return Validator();" />
</form>

Посмотрите, как у тега формы нет onsubmit="..." (помните, что это было условие не иметь его).

Проблема в том, что форма всегда отправляется, независимо от того, возвращает ли onclick true или false.

Если я изменю type="submit" на type="button", похоже, что он работает, но не работает. Он никогда не отправляет форму, но это легко сделать.

Итак, наконец, я использовал это:

<form method="post" id="theFormID" name="theFormID" action="">
   <input type="text" id="Field1" name="Field1" />
   <input type="text" id="Field2" name="Field2" />
   <input type="button" value="Send" onclick="JavaScript:return Validator();" />
</form>

И на function Validator, где return True;, я также добавляю предложение отправки JavaScript, что-то похожее на это:

function Validator(){
   //  ...bla bla bla... the checks
   if(                              ){
      document.getElementById('theFormID').submit();
      return(true);
   }else{
      return(false);
   }
}

id="" только для JavaScript getElementById, name="" только для того, чтобы оно появлялось в данных POST.

Таким образом, он работает так, как мне нужно.

Я поместил это только для людей, которым не нужна функция onsubmit в форме, но сделайте некоторую проверку, когда пользователь нажимает кнопку.

Почему мне не нужно отправлять данные в тег формы? Легко, на других частях JavaScript мне нужно выполнить отправку, но я не хочу, чтобы была какая-либо проверка.

Причина: если пользователь - тот, кто выполняет отправку, которую я хочу, и мне нужно выполнить проверку, но если это JavaScript, иногда мне нужно выполнить отправку, в то время как такие проверки будут избегать этого.

Это может звучать странно, но не при мысли, например: при входе в систему ... с некоторыми ограничениями ... например, не разрешать использовать сеансы PHP, и ни один из файлов cookie не разрешен!

Таким образом, любая ссылка должна быть преобразована в такую ​​форму отправки, чтобы данные для входа не были потеряны. Когда еще не выполнен вход, он также должен работать. Поэтому проверка ссылок не должна выполняться. Но я хочу представить сообщение пользователю, если пользователь не ввел оба поля, user и pass. Поэтому, если кто-то отсутствует, форма не должна быть отправлена! есть проблема.

См. Проблему: форму нельзя отправлять, когда одно поле пусто, только если пользователь нажал кнопку, если это код JavaScript, он должен быть в состоянии отправить.

Если я сделаю работу с onsubmit над тегом формы, мне нужно знать, пользователь это или другой JavaScript. Поскольку никакие параметры не могут быть переданы, это невозможно напрямую, поэтому некоторые люди добавляют переменную, чтобы сказать, должна ли быть выполнена проверка или нет. Первое, что нужно сделать в функции проверки, - это проверить значение этой переменной и т. Д. Слишком сложно, и код не говорит о том, что действительно нужно.

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

С другой стороны, зачем ставить код отправки, поскольку концептуально я не хочу проверять передачу. Я действительно хочу подтверждение кнопки.

Не только код более понятен, но и там, где он должен быть. Просто запомните это: - Я не хочу, чтобы JavaScript проверял форму (это всегда должно быть сделано PHP на стороне сервера) - Я хочу показать пользователю сообщение о том, что все поля не должны быть пустыми, что требует JavaScript (на стороне клиента)

Так почему некоторые люди (подумайте или скажите мне), что это должно быть сделано при проверке на месте? Нет, концептуально я не делаю проверку на стороне клиента. Я просто что-то нажимаю на кнопку, так почему бы просто не позволить этому быть реализованным?

Ну, этот код и стиль отлично справляются с задачей. На любой JavaScript, который мне нужен, чтобы отправить форму, я просто поставил:

document.getElementById('theFormID').action='./GoToThisPage.php'; // Where to go
document.getElementById('theFormID').submit(); // Send POST data and go there

И это пропускает проверку, когда она мне не нужна. Он просто отправляет форму и загружает другую страницу и т. Д.

Но если пользователь нажимает кнопку отправки (также известную как type="button", а не type="submit"), проверка выполняется до того, как форма будет отправлена ​​и, если она недействительна, не отправлена.

Надеюсь, это поможет другим не пытаться использовать длинный и сложный код. Просто не используйте onsubmit, если не нужно, и используйте onclick. Но просто не забудьте изменить type="submit" на type="button" и, пожалуйста, не забудьте сделать submit() с помощью JavaScript.

25 голосов
/ 31 мая 2009

Я согласен с Shog9, хотя вместо этого могу использовать:

<input type = "button" onClick="addItem(); return false;" value="Add Item" />

Согласно w3schools , тег <button> ведет себя по-разному в разных браузерах.

17 голосов
/ 24 июня 2015

Предположим, ваша HTML-форма имеет id="form_id"

<form id="form_id">
<!--your HTML code-->
</form>

Добавьте этот фрагмент jQuery в свой код, чтобы увидеть результат,

$("#form_id").submit(function(){
  return false;
});
14 голосов
/ 27 июня 2012

$("form").submit(function () { return false; }); это предотвратит отправку кнопки или вы можете просто изменить тип кнопки на «кнопку» <input type="button"/> вместо <input type="submit"/> Который будет работать, только если эта кнопка не единственная кнопка в этой форме.

12 голосов
/ 26 мая 2018

Вы можете просто получить ссылку на свои кнопки, используя jQuery, и предотвратить ее распространение, как показано ниже:

 $(document).ready(function () {
    $('#BUTTON_ID').click(function(e) {

            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();

            return false;
    });});
10 голосов
/ 17 января 2014

Это ошибка html5, как уже было сказано, вы все равно можете использовать кнопку в качестве отправки (если вы хотите охватить как пользователей javascript, так и не являющихся пользователями javascript), используя ее следующим образом:

     <button type="submit" onclick="return false"> Register </button>

Таким образом, вы отмените отправку, но по-прежнему будете делать то, что вы делаете в функциях jquery или javascript, и будете выполнять отправку для пользователей, у которых нет javascript.

7 голосов
/ 31 мая 2009

Я уверен, что на ФФ

removeItem 

функция встречает ошибку JavaScript, это не происходит в IE

Когда появляется ошибка javascript, код возврата «false» не запускается, что заставляет страницу отправить обратно

3 голосов
/ 09 апреля 2018

Установите вашу кнопку обычным способом и используйте event.preventDefault как ..

   <button onclick="myFunc(e)"> Remove </button>  
   ...
   ...

   In function...

   function myFunc(e){
       e.preventDefault();
   }
...