Як запобігти натискання клавіші ENTER для надсилання веб-форми?


207

Як ви запобігаєте ENTERнатисканню клавіш у поданні форми у веб-програму?

Відповіді:


99

[ редакція 2012 р., немає вбудованого обробника, збережіть текстові тексти

function checkEnter(e){
 e = e || event;
 var txtArea = /textarea/i.test((e.target || e.srcElement).tagName);
 return txtArea || (e.keyCode || e.which || e.charCode || 0) !== 13;
}

Тепер ви можете визначити обробник клавіш за формою:
<form [...] onkeypress = "повернути checkEnter (подія)">

document.querySelector('form').onkeypress = checkEnter;

3
До речі: ви можете додати чек на тип введення (через джерело події) у функції checkEnter, щоб виключити текстові області.
KooiInc

1
Працює. Я додав це до одного вводу, тому що хотів уникнути <enter> подання форми. У нього була кнопка для внутрішнього пошуку, і це фактично покращує зручність використання.
Фоксинні

1
Одна з проблем цього підходу (використання цієї функції з обробником подій у формі в цілому) полягає в тому, що він також запобігає появі входів у текстових областях, які також є у формі (де введення зазвичай бажано).
Lonnie Best

1
@LonnieBest: дякую, що помітили. Ви ж читали мій коментар на цю відповідь (дивись вище), що не так чи що? У всякому разі, я переглянув цю досить стару відповідь.
KooiInc

1
@Jonathan: ви можете приєднати обробник до одиничних полів введення або до якогось діва, що містить колекцію полів введення (але не кнопок) замість усієї форми.
KooiInc

57

Ось обробник jQuery, який можна використовувати для зупинки введення подання, а також зупинки клавіші зворотної області -> назад. Пари (keyCode: selectorString) в об'єкті «keyStop» використовуються для узгодження вузлів, які не повинні запускати дію за замовчуванням.

Пам'ятайте, що Інтернет повинен бути доступним місцем, і це порушує очікування користувачів клавіатури. Однак, у моєму випадку веб-додаток, над яким я працюю, все одно не подобається кнопки повернення, тому відключити її клавішу швидкого доступу. Дискусія "слід ввести -> подати" важлива, але не пов'язана з фактично заданим питанням.

Ось код, вам потрібно подумати про доступність і чому ви насправді хотіли б це зробити!

$(function(){
 var keyStop = {
   8: ":not(input:text, textarea, input:file, input:password)", // stop backspace = back
   13: "input:text, input:password", // stop enter = submit 

   end: null
 };
 $(document).bind("keydown", function(event){
  var selector = keyStop[event.which];

  if(selector !== undefined && $(event.target).is(selector)) {
      event.preventDefault(); //stop event
  }
  return true;
 });
});

12
Найпростішим способом: $ ("# myinput"). Keydown (функція (e) {if (e.which == 13) e.preventDefault ();}); Ключовим моментом є спільне використання "keydown" та event.preventDefault (). Це не працює з "клавіатурою".
lepe

Це має перевагу перед іншими рішеннями, які просто блокують клавішу 13, що автоматична пропозиція веб-переглядача продовжить працювати належним чином.
jsalvata

52

Просто поверніть false з оброблювача, що надсилається

<form onsubmit="return false;">

або якщо ви хочете обробник посередині

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">

5
Це здається найпростішою відповіддю. Я спробував це на Google Chrome, і він чудово працює. Ви протестували це в кожному браузері?
стиле

22
Це не гарна ідея, якщо ви хочете, щоб ваша форма була подана натисканням submitкнопки
AliBZ

13
Не працює, оскільки кнопка "Надіслати" більше не надсилає форму
paullb

39
@Paul, як це отримало 38 результатів? Якщо взагалі не <form>отримувати подання, це викидати дитину разом з водою.
Pacerier

8
@Pacerier У контексті SPA, ви майже завжди хочете обробляти подання форми вручну. Завжди зупиняти браузер від подання форми (та оновлення сторінки, яка перезапускає програму) в цьому випадку доцільно.
Друг Натан

44
//Turn off submit on "Enter" key

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        $("#btnSearch").attr('value');
        //add more buttons here
        return false;
    }
});

5
Це чудово працює. e.preventDefault()замість того, return falseщоб досягти тієї самої мети, але дозволити події охопити обробники в батьківських елементах. Дія за замовчуванням (формуляризація форми) все ще буде попереджена
підписано

24

Вам потрібно буде зателефонувати на цю функцію, яка просто скасує поведінку форми за замовчуванням. Ви можете приєднати його до будь-якого поля введення чи події.

function doNothing() {  
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if( keyCode == 13 ) {


    if(!e) var e = window.event;

    e.cancelBubble = true;
    e.returnValue = false;

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

2
повинен бути аргументом, і тоді ви повинні перевірити вікно.event. Крім того, вам слід отримати код коду від події. Нарешті, вам слід повернути помилкове.
ntownsend

9
Чи можете ви пояснити, де і як викликати цю функцію?
mydoghasworms

17

Клавіша ENTER просто активує кнопку подання за замовчуванням форми, яка буде першою

<input type="submit" />

браузер знаходить у формі.

Тому у вас немає кнопки подання, але щось подібне

<input type="button" value="Submit" onclick="submitform()" /> 

EDIT : У відповідь на обговорення в коментарях:

Це не працює, якщо у вас є лише одне текстове поле, але, можливо, саме в цьому випадку потрібна поведінка.

Інша проблема полягає в тому, що для надсилання форми покладається Javascript. Це може бути проблемою з точки зору доступності. Це можна вирішити, записавши на <input type='button'/>javascript, а потім помістити <input type='submit' />в <noscript>тег. Недолік цього підходу полягає в тому, що для браузерів з обмеженим JavaScript ви матимете подання форми на ENTER. ОП залежить від того, якою є бажана поведінка в даному випадку.

Я не знаю, як це зробити, без посилань на JavaScript.


Дивно це не працює у Firefox, якщо є лише одне поле.
DanSingerman

5
Жахливий для доступності? Може бути. Однак це дійсно відповідь вони хлопець питання, що і SO для ... Можливо, змінити у відповідь вказати на питання доступності є хорошим компромісом?
Ніл Барнвелл,

1
@bobince - можливо, питання заслуговує -1 через доступність, але ця точна відповідь на питання? Не думай так. Також є дійсні випадки використання, коли ви хочете це зробити.
DanSingerman

Не потрібно робити форму неможливою для надсилання без JavaScript, хоча, е. Це якщо він працював, але цього немає, тому що браузери із задоволенням подають форму, яка не містить кнопки для подання.
bobince

2
Перевірено у всіх цих програмах плюс Opera з одним введенням тексту та однією кнопкою введення: всі ще подали форму на Enter. Вам, очевидно, потрібен JavaScript, щоб "вирішити" проблему Enter, але фокус у тому, щоб зробити це, не роблячи сторінку повністю непрацездатною там, де JS недоступний.
bobince

12

Коротка відповідь у чистому 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" для введення type = 'text'. Відвідувачі можуть користуватися клавішею "Enter" на всьому веб-сайті.

Якщо ви хочете відключити "Enter" і для інших дій, ви можете додати console.log (e); для ваших тестових цілей і натисніть F12 в хромі, перейдіть на вкладку "консоль" і натисніть "назад" на сторінці та загляньте всередину, щоб побачити, які значення повертаються, тоді ви можете націлити всі ці параметри для подальшого покращення коду. вище, щоб відповідати вашим потребам у "e.target.nodeName" , "e.target.type" та багатьох інших ...

Дивіться мою детальну відповідь на подібне запитання тут


3
Насправді так і має бути e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. За допомогою вказаного коду він дозволить надсилати форми, якщо радіо чи прапорець зосереджені.
afnpires

1
Це найефективніше та зручніше для використання рішення. Дякую @AlexandrePires! Ось мій повний робочий сценарій: stackoverflow.com/a/40686327/1589669
ЕА

1
Єдине робоче рішення; принаймні в моїй ситуації.
hex494D49

9

У всіх відповідях, які я знайшов на цю тему, тут чи в інших публікаціях, є один недолік, і це перешкоджає фактичному запуску змін і на елементі форми. Тож якщо ви запускаєте ці рішення, подія onchange також не спрацьовує. Для подолання цієї проблеми я змінив ці коди і розробив наступний код для себе. Я сподіваюся, що це стане в нагоді для інших. Я дав клас моїй формі "preven_auto_submit" і додав наступний JavaScript:

$(document).ready(function() 
{
    $('form.prevent_auto_submit input,form.prevent_auto_submit select').keypress(function(event) 
    { 
        if (event.keyCode == 13)
        {
            event.preventDefault();
            $(this).trigger("change");
        }
    });
});

7

У минулому я завжди робив це за допомогою обробника клавіш, як описано вище, але сьогодні вдалося простіше рішення. Клавіша введення просто запускає першу кнопку відсилання не відключеної форми, тому насправді все, що потрібно, це перехопити цю кнопку, намагаючись подати:

<form>
  <div style="display: none;">
    <input type="submit" name="prevent-enter-submit" onclick="return false;">
  </div>
  <!-- rest of your form markup -->
</form>

Це воно. Натискання клавіш буде оброблятися, як зазвичай, браузером / полями і т.д. І обробник javascript потім запобіжить подання.


1
Зазвичай мені не подобаються хаки, але цей дійсно ефективний.
TechWisdom

1
видалення div і просто поставити attr hiddenна введення буде коротше. nice hack :)
Nik

5

Я витратив деякий час на створення цього крос-браузера для IE8,9,10, Opera 9+, Firefox 23, Safari (PC) та Safari (MAC)

Приклад JSFiddle: http://jsfiddle.net/greatbigmassive/ZyeHe/

Базовий код - зателефонуйте до цієї функції за допомогою "onkeypress", прикріпленого до вашої форми, та передайте їй "window.event".

function stopEnterSubmitting(e) {
    if (e.keyCode == 13) {
        var src = e.srcElement || e.target;
        if (src.tagName.toLowerCase() != "textarea") {
            if (e.preventDefault) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        }
    }
}

4
stopSubmitOnEnter (e) {
  var eve = e || window.event;
  var keycode = eve.keyCode || eve.which || eve.charCode;

  if (keycode == 13) {
    eve.cancelBubble = true;
    eve.returnValue = false;

    if (eve.stopPropagation) {   
      eve.stopPropagation();
      eve.preventDefault();
    }

    return false;
  }
}

Потім у формі:

<form id="foo" onkeypress="stopSubmitOnEnter(e);">

Хоча було б краще, якби ви не використовували нав'язливий JavaScript.


Мені подобається ця версія, тому що вона легше читається, ніж версія від @hash. Одна з проблем, ви повинні повернути помилку в блоці "if (keycode == 13)". Як тільки у вас є, ця функція запобігає будь-якому введенню клавіатури в поле. Також версія @ hash включає в себе e.keyCode, e.which і e.charCode ... не впевнений, чи e.charCode важливий, але я все-таки розміщую його там: "var keycode = eve.keyCode || eve.which || eve.charCode; ".
Джек Сенехал

Дякую, Джеку. Я відредагував відповідь, щоб перевірити charCode. Я також перемістив return falseвсередину if-блок. Хороший улов.
ntownsend

3

У моєму випадку ця jQuery JavaScript вирішила проблему

jQuery(function() {
            jQuery("form.myform").submit(function(event) {
               event.preventDefault();
               return false;
            });
}

Дивовижне, дякую @Kirby! Оскільки ключ введення зараз відключений у формі, як ви могли б потім включити ключ введення для всіх <input>полів форми?
Ян Кемпбелл

3

Запобігання "ENTER" надіслати форму може доставити незручність для деяких користувачів. Тож було б краще, якщо ви дотримуєтесь наведеної нижче процедури:

Напишіть подію "onSubmit" у тег форми:

<form name="formname" id="formId" onSubmit="return testSubmit()" ...>
 ....
 ....
 ....
</form>

написати функцію Javascript так:

function testSubmit(){
  if(jQuery("#formId").valid())
      {
        return true;
      }
       return false;

     } 

     (OR)

У чому причина, якщо ви хочете не допустити подання форми при натисканні клавіші Enter, ви можете написати наступну функцію в javascript:

    $(document).ready(function() {
          $(window).keydown(function(event){
          if(event.keyCode == 13) {
               event.preventDefault();
               return false;
              }
           });
         });

Дякую.


3

Додайте цей тег до своєї форми - onsubmit="return false;" тоді ви можете надіслати свою форму лише за допомогою якоїсь функції JavaScript.


ОП (як і більшість тих, кого покусала ця функція браузера), ймовірно, хотів все-таки дозволити надсилати натисканням миші, що цей (на жаль, часто рекомендований) метод також буде відключений. Немає приємного способу вирішити це, але, наприклад, відповідь вище (в цей момент) від Адама робить кращу роботу в цьому.
Sz.

3

Щоб запобігти надсиланню форми при натисканні enterна a textareaабо inputполе, перевірте подію надіслати, щоб знайти, який тип елемента надіслав подію.

Приклад 1

HTML

<button type="submit" form="my-form">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.type!=="submit") {
        e.preventDefault();
    }
});

Краще рішення - якщо у вас немає кнопки подання, і ви запускаєте подію звичайною кнопкою. Це краще, тому що в першому прикладі 2 події подання запускаються, але у другому прикладі лише 1 подія подання.

Приклад 2

HTML

<button type="button" onclick="$('#my-form').submit();">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.localName!=="button") {
        e.preventDefault();
    }
});

3

Ви знайдете це більш простим і корисним: D

$(document).on('submit', 'form', function(e){
    /* on form submit find the trigger */
    if( $(e.delegateTarget.activeElement).not('input, textarea').length == 0 ){
        /* if the trigger is not between selectors list, return super false */
        e.preventDefault();
        return false;
    } 
});


2

Перевірте цю статтю Як запобігти натискання клавіші ENTER для надсилання веб-форми?

$(“.pc_prevent_submit”).ready(function() {
  $(window).keydown(function(event) {
    if (event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class=”pc_prevent_submit” action=”” method=”post”>
  <input type=”text” name=”username”>
  <input type=”password” name=”userpassword”>
  <input type=”submit” value=”submit”>
</form>


1

Ви можете зафіксувати натискання клавіші на формі в javascript і запобігти рівномірному барботажу, я думаю. Вхід на веб-сторінці в основному просто подає форму, в яку розміщено поточний вибраний елемент керування.


залежить від контрольного Тхо;) у текстовій області вона просто переходить до наступного рядка. Отже, ловити всі події "натискання клавіш" - це не дуже гарна ідея.
Кендер

Можливо, але в такому випадку форма все-таки мала б пошкодження?
Ніл Барнвелл,

Ви б робили це безпосередньо на всіх текстах вводу та інших подібних елементів керування. Це болить і не дуже варто турбуватися в більшості випадків, але якщо вам доведеться ...
bobince

1

Це посилання надає рішення, яке працювало для мене в Chrome, FF та IE9 плюс емулятор для IE7 та 8, що постачається із інструментом для розробників IE9 (F12).

http://webcheatsheet.com/javascript/disable_enter_key.php


Якщо посилання розірвано, додайте цей код до області заголовка вашої сторінки. <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")) {return false;} } document.onkeypress = stopRKey; </script>
Міака

1

Інший підхід полягає в тому, щоб додати кнопку введення до форми лише тоді, коли вона повинна бути представлена ​​і замінити її простим дівом під час заповнення форми


1

Просто додайте цей атрибут у свій тег FORM:

onsubmit="return gbCanSubmit;"

Потім у тег SCRIPT додайте це:

var gbCanSubmit = false;

Потім, коли ви створюєте кнопку або з будь-якої іншої причини (наприклад, у функції), ви нарешті дозволяєте подати, просто переверніть глобальний булевий сигнал і зробіть дзвінок .submit (), подібний до цього прикладу:

function submitClick(){

  // error handler code goes here and return false if bad data

  // okay, proceed...
  gbCanSubmit = true;
  $('#myform').submit(); // jQuery example

}

1

Я сам натрапив на це, тому що у мене є кілька кнопок подання з різними значеннями 'name', так що при надходженні вони роблять різні речі в одному файлі php. Кнопка enter/ returnрозбиває це, оскільки ці значення не надсилаються. Тому я думав, чи кнопка enter/ returnактивує першу кнопку подання у формі? Таким чином у вас може бути кнопка "vanilla" для подання, яка є прихованою або має значення "name", яке повертає виконуваний файл php назад на сторінку з формою в ній. Або ж за замовчуванням (приховане) значення "ім'я", яке активується натискання клавіші, а кнопки подання перезаписуються власними значеннями "ім'я". Просто думка.


1

Як щодо:

<script>
function isok(e) {
  var name = e.explicitOriginalTarget.name;
  if (name == "button") {
    return true
  }
  return false;
}
</script>
<form onsubmit="return isok(event);">
<input type="text" name="serial"/>
<input type="submit" name="button" value="Create Thing"/>
</form>

І просто вкажіть свою кнопку праворуч, і вона все одно буде подана, але текстові поля, тобто явнийOriginalTarget, коли ви натиснете кнопку повернення в одну, не буде мати правильного імені.


0

Це працювало для мене.
onkeydown = "повернутися! (event.keyCode == 13)"

    <form id="form1" runat="server" onkeydown="return !(event.keyCode==13)">

   </form>

1
Якщо у вас є textarea, ви не можете перейти до наступного рядка при введенні в тій же формі
Aamir Afridi

0

Ось як я це зробив:

window.addEventListener('keydown', function(event)
{
    if (event.key === "Enter")
    {
        if(event.target.type !== 'submit')
        {
            event.preventDefault();
            return false;
        }
    }
}

-1

помістити у зовнішній файл JavaScript

   (function ($) {
 $(window).keydown(function (event) {  

    if (event.keyCode == 13) {

        return false;
    }
});

 })(jQuery);

або десь усередині тегу тіла

<script>


$(document).ready(function() {
    $(window).keydown(function(event) {
        alert(1);

        if(event.keyCode == 13) {

            return false;
        }
    });
});

</script>

-2

У мене була така ж проблема (форми з тоннами текстових полів та некваліфікованими користувачами).

Я вирішив це таким чином:

function chkSubmit() {
    if (window.confirm('Do you want to store the data?')) {
        return true;
    } else {
        // some code to focus on a specific field
        return false;
    }
}

використовуючи це в коді HTML:

<form
    action="go.php" 
    method="post"
    accept-charset="utf-8"  
    enctype="multipart/form-data"
    onsubmit="return chkSubmit()"
>

У такий спосіб ENTERключ працює, як було заплановано, але ENTERпотрібне підтвердження (як правило, другий дотик).

Я залишаю читачам пошуки сценарію, який надсилає користувача в поле, де він натиснув, ENTERякщо він вирішить залишитися на формі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.