JQuery отключить форму отправки на ввод

208

У меня есть следующий javascript на моей странице, который, кажется, не работает.

$('form').bind("keypress", function(e) {
  if (e.keyCode == 13) {               
    e.preventDefault();
    return false;
  }
});

Я хотел бы отключить отправку формы при вводе, или еще лучше, чтобы вызвать мою форму отправки AJAX. Любое решение приемлемо, но код, который я включил выше, не препятствует отправке формы.

Адам Левитт
источник
3
Вот простое решение только для HTML: stackoverflow.com/a/51507806/337934
SamB

Ответы:

421

Если keyCodeне пойман, лови which:

$('#formid').on('keyup keypress', function(e) {
  var keyCode = e.keyCode || e.which;
  if (keyCode === 13) { 
    e.preventDefault();
    return false;
  }
});

РЕДАКТИРОВАТЬ: пропустил, лучше использовать keyupвместоkeypress

РЕДАКТИРОВАТЬ 2: Поскольку в некоторых более новых версиях Firefox отправка формы не запрещена, безопаснее также добавить событие нажатия клавиши в форму. Также это не работает (больше?), Просто связывая событие с формой «имя», но только с идентификатором формы. Поэтому я сделал это более очевидным, изменив пример кода соответствующим образом.

РЕДАКТИРОВАТЬ 3: изменено bind()наon()

zessx
источник
15
jQuery нормализует его e.which, поэтому вам не нужно проверять e.keyCode, но +1 для наиболее вероятной причины этой проблемы.
Bojangles
4
Вам нужно return false;для этого? e.preventDefault();кажется достаточно
Chromigo
10
Важный! Этот блок решений разрывается в текстовой области.
Герман Хохлов
4
Проблема в том, что если у меня в той же форме есть текстовое поле, теперь я не могу добавить ввод (чтобы создать новую строку) в текстовое поле.
Tikky
3
keyCode === 13 && !$(e.target).is('textarea')
Теран
62

Обычно форма отправляется, Enterкогда вы сосредоточены на элементах ввода.

Мы можем отключить Enterключ (код 13) для элементов ввода в форме:

$('form input').on('keypress', function(e) {
    return e.which !== 13;
});

ДЕМО: http://jsfiddle.net/bnx96/325/

зрение
источник
Кнопка iOS Go была моей проблемой в пользовательском поле ввода автозаполнения. Это решило это.
Дилан Валаде
11
Это предотвращает использование клавиши вводаtextareas в той же форме. Использование $("form input")вместо, $("form :input")кажется, исправить это. ДЕМО: jsfiddle.net/bnx96/279
shaneparsons,
43

Еще короче

$('myform').submit(function() {
  return false;
});
user1017926
источник
35
Но это также предотвратит щелчок пользователя?
haibuihoang
5
@haibuihoang Да, это отключит отправку формы.
Том
7
Вы должны использовать, function(e) {e.preventDefault();}поскольку возвращаемые значения в обработчиках событий устарели: stackoverflow.com/a/20045473/601386
грипп
6
@ user1111929 Это прекрасно работает, но это не должен быть лучший ответ, потому что вопрос задан только о, Enterа не об отключении отправки формы с помощью Submitкнопки.
daveslab
Распространенная ситуация, в которой вы можете сохранить отправку формы, но отключить ее при нажатии клавиши «Ввод», - это если вы решите использовать onClickсобытие jQuery для проверки формы и по-прежнему отправлять с использованием jQuery. Другими словами, есть случаи, когда вы хотите отправить только через javascript / jQuery. Хотя вы все еще можете использовать AJAX с этим решением, оно отключает базовую функциональность submitметода.
JRad the Bad
23
$('form').keyup(function(e) {
  return e.which !== 13  
});

Свойство event.which нормализует event.keyCode и event.charCode. Рекомендуется следить за событием, которое для ввода с клавиатуры.

which Docs.

Гдорон поддерживает Монику
источник
14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 13) {
    e.preventDefault();
    return false;
  }
});

Это решение работает со всеми формами на веб-сайте (также с формами, вставленными с помощью AJAX), предотвращая только ввод текста. Поместите это в функцию готовности документа и забудьте эту проблему на всю жизнь.

Бузоганы Ласло
источник
9

Большинство ответов выше не позволит пользователям добавлять новые строки в поле textarea. Если это то, чего вы хотите избежать, вы можете исключить этот конкретный случай, проверив, какой элемент в данный момент имеет фокус:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}
Жан-Батист
источник
8

Излишняя необходимость записывать и тестировать каждое нажатие клавиши ВВОД меня действительно беспокоит, поэтому мое решение основано на следующем поведении браузера:

Нажатие ENTER вызовет событие щелчка на кнопке отправки (протестировано в IE11, Chrome 38, FF 31) ** (ссылка: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Поэтому мое решение состоит в том, чтобы удалить стандартную кнопку отправки (т. Е. <input type="submit">), Чтобы вышеуказанное поведение не выполнялось, потому что нет кнопки отправки, которая бы волшебным образом нажималась при нажатии клавиши ВВОД. Вместо этого я использую обработчик щелчков jQuery на обычной кнопке, чтобы отправить форму с помощью .submit()метода jQuery .

<form id="myform" method="post">
  <input name="fav_color" type="text">
  <input name="fav_color_2" type="text">
<button type="button" id="form-button-submit">DO IT!</button>
</form>

<script>
 $('#form-button-submit').click(function(){
    $('#myform').submit();
  });
</script>

Демо: http://codepen.io/anon/pen/fxeyv?editors=101

** это поведение не применимо, если форма имеет только 1 поле ввода, и это поле является текстовым; в этом случае форма будет отправлена ​​после нажатия клавиши ВВОД, даже если в разметке HTML нет кнопки отправки (например, поле поиска). Это стандартное поведение браузера с 90-х годов.

ребро
источник
Я добавил невидимое поле ввода в счетчик «форма будет отправлена ​​после нажатия клавиши ВВОД», вызванной «форма имеет только 1 поле ввода, и это поле является« текстовым »вводом».
Ло Цзюн Хуэй
6

если вы просто хотите отключить отправку при входе и кнопку отправки, используйте событие onsubmit формы

<form onsubmit="return false;">

Вы можете заменить «return false» на вызов функции JS, которая будет делать все необходимое, а также отправлять форму в качестве последнего шага.

Перика Живкович
источник
1
Это отключит отправку всех форм, включая нажатие кнопки отправки.
Ник
не 100% ... работайте регулярно, отправляйте ключ ... лучше всего использовать jquery для предотвращения
KingRider
Хороший альтернативный ответ (с оговорками выше), потому что ... ну, иногда это все, что вам нужно.
emilys
это именно то, что мне нужно для ситуации, спасибо
shababhsiddique
4

Вы можете сделать это идеально в чистом Javascript, простом и не требующем библиотеки. Вот мой подробный ответ на похожую тему: Отключение клавиши ввода для формы

Короче, вот код:

<script type="text/javascript">
window.addEventListener('keydown',function(e){if(e.keyIdentifier=='U+000A'||e.keyIdentifier=='Enter'||e.keyCode==13){if(e.target.nodeName=='INPUT'&&e.target.type=='text'){e.preventDefault();return false;}}},true);
</script>

Этот код запрещает вводить клавишу «Ввод» только для типа ввода = «текст». (Поскольку посетителю может потребоваться нажать Enter на странице). Если вы хотите отключить «Enter» и для других действий, вы можете добавить console.log (e); для ваших целей тестирования и нажмите F12 в Chrome, перейдите на вкладку «консоль» и нажмите «Backspace» на странице и загляните внутрь нее, чтобы увидеть, какие значения возвращаются, затем вы можете настроить все эти параметры для дальнейшего улучшения кода выше, чтобы удовлетворить ваши потребности для "e.target.nodeName" , "e.target.type" и многих других ...

Тарик
источник
2
На самом деле так и должно быть e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. С указанным кодом это позволит отправлять формы, если установлен флажок радио или флажок.
afnpires
3

Я не знаю, если вы уже решили эту проблему, или кто-то пытается решить это прямо сейчас, но вот мое решение для этого!

$j(':input:not(textarea)').keydown(function(event){
    var kc = event.witch || event.keyCode;
    if(kc == 13){
    event.preventDefault();
        $j(this).closest('form').attr('data-oldaction', function(){
            return $(this).attr('action');
        }).attr('action', 'javascript:;');

        alert('some_text_if_you_want');

        $j(this).closest('form').attr('action', function(){
            return $(this).attr('data-oldaction');
        });
        return false;
    }
});
Дон Маркон Невес
источник
2

Простой способ - изменить тип кнопки на кнопку - в HTML, а затем добавить событие в JS ...

Изменить от этого:

<form id="myForm">
   <button type="submit">Submit</button>
</form>

к

<form id="myForm">
   <button type="button" id="btnSubmit">Submit</button>
</form>

И в JS или JQuery добавить:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});
Цви Редлер
источник
1

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

<script type="text/javascript">
        function stopRKey(evt) {
          var evt = (evt) ? evt : ((event) ? event : null);
          var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
          if ((evt.keyCode == 13) && ((node.type=="text") || (node.type=="radio") || (node.type=="checkbox")) )  {return false;}
        }

        document.onkeypress = stopRKey;
</script> 
редис
источник
1

В Firefox, когда вы вводите и нажимаете ввод, он отправляет свою верхнюю форму. Решение в форме отправки и добавить это:

<input type="submit" onclick="return false;" style="display:none" />
брод
источник
1

Спустя 3 года ни один человек не ответил на этот вопрос полностью.

Запрашивающий хочет отменить отправку формы по умолчанию и вызвать свой собственный Ajax. Это простой запрос с простым решением. Нет необходимости перехватывать каждый символ, введенный в каждый ввод.

Предполагая, что форма имеет кнопку отправки, a <button id="save-form">или an <input id="save-form" type="submit">, выполните:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});
derekm
источник
-2

Когда файл закончен (загрузка завершена), скрипт обнаруживает каждое событие для ключа «Ввод» и отключает событие позади.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>
McNavy
источник
добавить объяснение
HaveNoDisplayName
@HaveNoDisplayName: обновлено.
Макнави
-4

Полное решение на JavaScript для всех браузеров

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

Вот и весь ответ. в JavaScript с собственной поддержкой IE 7.

var form = document.getElementById("testForm");
form.addEventListener("submit",function(e){e.preventDefault(); return false;});

Это решение теперь запрещает пользователю отправлять сообщения, используя клавишу ввода, и не будет перезагружать страницу или переместит вас в верхнюю часть страницы, если ваша форма находится где-то ниже.

Тарандип Сингх
источник
8
Это также предотвращает отправку формы, если вы нажмете кнопку «Отправить».
Марио Вернер
-10

Как насчет этого:

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

Это должно отключить все формы с кнопками отправки в вашем приложении.

Шрикар Патель
источник