Jak zapobiec naciśnięciu klawisza ENTER, aby przesłać formularz internetowy?

207

Jak zapobiegać ENTERprzesyłaniu formularza przez naciśnięcie klawisza w aplikacji internetowej?

użytkownik67722
źródło

Odpowiedzi:

99

[ wersja 2012, brak wbudowanego modułu obsługi, zachowaj obsługę pól tekstowych]

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;
}

Teraz możesz zdefiniować moduł obsługi klawiszy w formularzu:
<form [...] onkeypress = "return checkEnter (event)">

document.querySelector('form').onkeypress = checkEnter;
KooiInc
źródło
3
Nawiasem mówiąc: możesz dodać kontrolę typu danych wejściowych (za pośrednictwem źródła zdarzeń) w funkcji checkEnter, aby wykluczyć obszary tekstowe.
KooiInc
1
Pracuje. Dodałem to do pojedynczego wejścia, ponieważ chciałem uniknąć przesłania formularza przez <enter>. Miał przycisk do przeprowadzenia wewnętrznego wyszukiwania i faktycznie poprawia użyteczność.
Foxinni
1
Jednym z problemów związanych z tym podejściem (używanie tej funkcji z modułem obsługi zdarzeń w formularzu jako całości) jest to, że zapobiega on również pojawianiu się wpisów w obszarach tekstowych, które również mają postać (tam, gdzie zwykle jest to pożądane).
Lonnie Best
1
@LonnieBest: dzięki za zauważenie. Państwo nie przeczytać mój komentarz na tej odpowiedzi (patrz wyżej), prawda? W każdym razie poprawiłem tę dość starą odpowiedź.
KooiInc,
1
@Jathanathan: możesz dołączyć moduł obsługi do pojedynczych pól wejściowych lub jakiegoś div zawierającego kolekcję pól wejściowych (ale nie przycisków) zamiast całej formy.
KooiInc
57

Oto moduł obsługi jQuery, którego można użyć do zatrzymania wprowadzania wpisów, a także do zatrzymania klawisza Backspace -> wstecz. Pary (keyCode: selectorString) w obiekcie „keyStop” służą do dopasowania węzłów, które nie powinny uruchamiać domyślnej akcji.

Pamiętaj, że internet powinien być dostępnym miejscem, a to łamie oczekiwania użytkowników klawiatury. To powiedziawszy, w moim przypadku aplikacja internetowa, nad którą pracuję, i tak nie lubi przycisku Wstecz, więc wyłączenie skrótu klawiszowego jest OK. Dyskusja „powinien wejść -> prześlij” jest ważna, ale nie jest związana z faktycznie zadanym pytaniem.

Oto kod, który możesz pomyśleć o dostępności i dlaczego tak naprawdę chcesz to zrobić!

$(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;
 });
});
thetoolman
źródło
12
W najprostszy sposób: $ ("# myinput"). Keydown (function (e) {if (e.which == 13) e.preventDefault ();}); Kluczem jest jednoczesne użycie „keydown” i event.preventDefault (). Nie działa z „keyup”.
lepe
Ma to tę przewagę nad innymi rozwiązaniami, które po prostu blokują klucz 13, że automatyczne sugerowanie przeglądarki będzie nadal działać poprawnie.
jsalvata
52

Po prostu zwróć false z modułu obsługi onsubmit

<form onsubmit="return false;">

lub jeśli chcesz obsługiwać w środku

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">
Paul Tarjan
źródło
5
To wydaje się być najprostszą odpowiedzią. Wypróbowałem to w Google Chrome i działa dobrze. Czy przetestowałeś to w każdej przeglądarce?
styfle
22
To nie jest dobry pomysł, jeśli chcesz, aby formularz został przesłany przez naciśnięcie submitprzycisku
AliBZ
13
Nie działa, ponieważ przycisk Prześlij nie przesyła już formularza
paullb
39
@Paul, Jak to uzyskało 38 głosów pozytywnych? W ogóle powstrzymanie się <form>od poddania się to wyrzucenie dziecka z kąpielą.
Pacerier
8
@Pacerier W kontekście SPA prawie zawsze będziesz chciał ręcznie przesyłać formularze. W takim przypadku uzasadnione jest zawsze powstrzymywanie przeglądarki przed przesłaniem formularza (i odświeżanie strony, która ponownie uruchamia aplikację).
Nathan Friend
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;
    }
});
mtntrailrunner
źródło
5
To działa świetnie. e.preventDefault()zamiast return falseosiągnąć ten sam cel, ale pozwolić zdarzeniu dotrzeć do procedur obsługi w elementach nadrzędnych. Domyślne działanie (zebranie formularza) będzie nadal uniemożliwione
skrypty napisane
24

Będziesz musiał wywołać tę funkcję, która po prostu anuluje domyślne zachowanie formularza podczas przesyłania. Możesz dołączyć go do dowolnego pola wejściowego lub zdarzenia.

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();
    }
}
haszysz
źródło
2
e powinien być argumentem, a następnie powinieneś sprawdzić window.event. Powinieneś również uzyskać kod dostępu od zdarzenia. Wreszcie powinieneś zwrócić wartość false.
ntownsend
9
Czy możesz wyjaśnić, gdzie i jak wywołać tę funkcję?
mydoghasworms,
17

Klawisz ENTER aktywuje jedynie domyślny przycisk przesyłania formularza, który będzie pierwszy

<input type="submit" />

przeglądarka znajdzie w formularzu.

Dlatego nie mam przycisku wysyłania, ale coś podobnego

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

EDYTOWAĆ : W odpowiedzi na dyskusję w komentarzach:

Nie działa to, jeśli masz tylko jedno pole tekstowe - ale w takim przypadku może to być pożądane zachowanie.

Innym problemem jest to, że polega on na JavaScript do przesłania formularza. Może to stanowić problem z punktu widzenia dostępności. Można to rozwiązać, pisząc za <input type='button'/>pomocą javascript, a następnie wstawiając w <input type='submit' />ciągu<noscript> tagu. Wadą tego podejścia jest to, że w przeglądarkach z wyłączoną obsługą javascript będziesz mieć przesyłane formularze na ENTER. Od OP zależy, jakie zachowanie będzie pożądane w tym przypadku.

Nie znam żadnego sposobu, aby to zrobić bez inwokowania javascript.

DanSingerman
źródło
Dziwnie, to nie działa w Firefoksie, jeśli jest tylko jedno pole.
DanSingerman
5
Straszna dla dostępności? Może. Jednak to nie odpowie, że facet, który jest pytanie, co tak jest ... Może edit do odpowiedzi podkreślić problem dostępność jest dobrym kompromisem?
Neil Barnwell,
1
@ Bobin - może pytanie zasługuje na -1 ze względu na dostępność, ale ta dokładna odpowiedź na pytanie? Nie myśl tak Istnieją również przypadki użycia, w których chcesz to zrobić.
DanSingerman
Nie musisz jednak uniemożliwiać przesyłania formularza bez JavaScript. Tak jest, jeśli zadziałało, a nie działa, ponieważ przeglądarki chętnie prześlą formularz, który nie zawiera przycisku przesyłania.
bobince
2
Przetestowane we wszystkich tych plus Opera z jednym wejściem tekstowym i jednym przyciskiem wejściowym: wszyscy nadal przesyłali formularz na Enter. Oczywiście potrzebujesz JavaScript, aby „rozwiązać” problem Enter, ale sztuczka polega na tym, aby nie powodować, że strona jest całkowicie nieoperacyjna, gdy JS jest niedostępny.
bobince
12

Krótko mówiąc w czystym JavaScript jest:

<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>

Wyłącza to tylko naciśnięcie klawisza „Enter” dla typu wprowadzania = „tekst”. Użytkownicy mogą nadal korzystać z klawisza „Enter” w całej witrynie.

Jeśli chcesz wyłączyć „Enter” także dla innych działań, możesz dodać console.log (e); dla celów testowych i wciśnij F12 w chrome, przejdź do zakładki „konsola” i wciśnij „backspace” na stronie i zajrzyj do środka, aby zobaczyć, jakie wartości są zwracane, a następnie możesz kierować wszystkie te parametry, aby dodatkowo ulepszyć kod powyżej, aby spełnić Twoje potrzeby dotyczące „e.target.nodeName” , „e.target.type” i wielu innych ...

Zobacz moją szczegółową odpowiedź na podobne pytanie tutaj

Tarik
źródło
3
Właściwie to powinno być e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Podany kod pozwoli na przesyłanie formularzy, jeśli radio lub pole wyboru są skoncentrowane.
afnpires
1
Jest to najbardziej skuteczne i przyjazne dla środowiska rozwiązanie. Dziękuję @AlexandrePires do! Oto mój w pełni działający skrypt: stackoverflow.com/a/40686327/1589669
eapo
1
Jedyne działające rozwiązanie; przynajmniej w mojej sytuacji.
hex494D49,
9

Wszystkie odpowiedzi, które znalazłem na ten temat, tutaj lub w innych postach, mają jedną wadę, to znaczy, że zapobiegają również faktycznemu wyzwalaniu zmian w elemencie formularza. Więc jeśli uruchomisz te rozwiązania, zdarzenie onchange również nie zostanie wyzwolone. Aby rozwiązać ten problem, zmodyfikowałem te kody i opracowałem dla siebie następujący kod. Mam nadzieję, że stanie się to przydatne dla innych. Dałem klasę do mojego formularza „prevent_auto_submit” i dodałem następujący 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");
        }
    });
});
Mahdi Mehrizi
źródło
7

W przeszłości zawsze robiłem to z obsługą klawiszy, jak wyżej, ale dziś wpadłem na prostsze rozwiązanie. Klawisz Enter uruchamia tylko pierwszy nie wyłączony przycisk przesyłania w formularzu, więc właściwie wszystko, co jest wymagane, to przechwycenie tego przycisku podczas próby przesłania:

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

Otóż ​​to. Naciskanie klawiszy będzie obsługiwane jak zwykle przez przeglądarkę / pola / itp. Jeśli zostanie uruchomiona logika Enter-Submit, przeglądarka znajdzie ukryty przycisk Wyślij i uruchomi go. Program obsługi javascript zapobiegnie następnie przesłaniu.

Acoulton
źródło
1
Zwykle nie lubię hacków, ale ten jest naprawdę skuteczny.
TechWisdom
1
usunięcie div i po prostu wstawienie attr hiddenna wejściu byłoby krótsze. niezły hack :)
Nik
5

Spędziłem trochę czasu, tworząc tę ​​przeglądarkę dla IE8,9,10, Opera 9+, Firefox 23, Safari (PC) i Safari (MAC)

Przykład JSFiddle: http://jsfiddle.net/greatbigmassive/ZyeHe/

Kod podstawowy - wywołaj tę funkcję poprzez „onkeypress” dołączony do formularza i przekaż do niego „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;
            }
        }
    }
}
Adam
źródło
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;
  }
}

Następnie w formularzu:

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

Jednak byłoby lepiej, gdybyś nie używał natrętnego JavaScript.

ntownsend
źródło
Podoba mi się ta wersja, ponieważ jest bardziej czytelna niż ta autorstwa @hash. Jednym z problemów jest zwrócenie wartości false w bloku „if (keycode == 13)”. W tej chwili ta funkcja zapobiega wprowadzaniu klawiatury w terenie. Również wersja @ hash zawiera e.keyCode, e.which i e.charCode ... nie jestem pewien, czy e.charCode jest ważny, ale i tak go tam umieściłem: "var keycode = eve.keyCode || eve.which || eve.charCode; ".
Jack Senechal
Dzięki, Jack. Zredagowałem odpowiedź, by sprawdzić charCode. Przesunąłem również return falsewnętrze bloku if. Dobry chwyt
ntownsend
3

W moim przypadku ten jQuery JavaScript rozwiązał problem

jQuery(function() {
            jQuery("form.myform").submit(function(event) {
               event.preventDefault();
               return false;
            });
}
Kirby
źródło
Wspaniale, dzięki @Kirby! Ponieważ klawisz Enter jest teraz wyłączony w formularzu, w jaki sposób możesz włączyć klawisz Enter dla wszystkich <input>pól w formularzu?
Ian Campbell,
3

Zapobieganie przesłaniu formularza przez „ENTER” może powodować niedogodności dla niektórych użytkowników. Byłoby lepiej, jeśli wykonasz poniższą procedurę:

Napisz zdarzenie „onSubmit” w tagu formularza:

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

napisz funkcję JavaScript w następujący sposób:

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

     } 

     (OR)

Niezależnie od przyczyny, jeśli chcesz uniemożliwić przesłanie formularza po naciśnięciu klawisza Enter, możesz napisać następującą funkcję w javascript:

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

dzięki.

venky
źródło
3

Dodaj ten tag do formularza - onsubmit="return false;" wtedy możesz przesłać formularz tylko za pomocą funkcji JavaScript.

Rajveer
źródło
OP (podobnie jak większość osób, które zostały ugryzione przez tę funkcję przeglądarki) prawdopodobnie chciał nadal zezwalać na przesyłanie za pomocą kliknięcia myszą, co ta (niestety często zalecana) metoda również wyłączałaby. Nie ma fajnego sposobu na rozwiązanie tego, ale np. Powyższa odpowiedź (w tej chwili) od Adama lepiej sobie z tym radzi.
Sz.
3

Aby zapobiec przesyłania formularza po naciśnięciu enterw sposób textarealub inputzakresie, sprawdzić przedstawić zdarzenie, aby znaleźć to rodzaj elementu wysłał zdarzenie.

Przykład 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();
    }
});

Lepszym rozwiązaniem jest, jeśli nie masz przycisku wysyłania i odpalasz wydarzenie zwykłym przyciskiem. Jest lepiej, ponieważ w pierwszym przykładzie uruchamiane są 2 zdarzenia wysyłania, ale w drugim przykładzie uruchamiane jest tylko 1 zdarzenie wysyłania.

Przykład 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();
    }
});
Adam Mester
źródło
3

Przekonasz się, że jest to prostsze i przydatne: 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;
    } 
});
Mike OO
źródło
2

Co powiesz na:

<asp:Button ID="button" UseSubmitBehavior="false"/>
P diddy
źródło
2

Sprawdź ten artykuł Jak zapobiec naciśnięciu klawisza ENTER w celu przesłania formularza internetowego?

$(“.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>

pranabesh chand
źródło
1

Myślę, że możesz uwięzić keydown na formularzu w javascript i zapobiec nawet bulgotaniu. ENTER na stronie internetowej po prostu przesyła formularz, w którym znajduje się obecnie wybrany element sterujący.

Neil Barnwell
źródło
zależy od kontroli;) w obszarze tekstowym po prostu przechodzi do następnej linii. Tak więc łapanie wszystkich zdarzeń naciśnięcia klawisza „enter” nie jest dobrym pomysłem.
kender
Być może, ale w takim przypadku czy formularz miałby zdarzenie keydown?
Neil Barnwell,
Zrobiłbyś to bezpośrednio na wszystkich wejściowych tekstach i innych podobnych kontrolkach. Jest to trochę bolesne i w większości przypadków nie warto się tym przejmować, ale jeśli musisz ...
Bob
1

Ten link zapewnia rozwiązanie, które działało dla mnie w Chrome, FF i IE9 oraz emulator dla IE7 i 8, który jest dostarczany z narzędziem programistycznym IE9 (F12).

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

Miaka
źródło
W przypadku zerwania linku dodaj ten kod do obszaru nagłówka swojej strony. <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>
Miaka,
1

Innym podejściem jest dodanie przycisku wprowadzania danych do formularza tylko wtedy, gdy ma zostać przesłany, i zastąpienie go zwykłym div podczas wypełniania formularza

Nicolas Manzini
źródło
1

Po prostu dodaj ten atrybut do tagu FORM:

onsubmit="return gbCanSubmit;"

Następnie w tagu SCRIPT dodaj to:

var gbCanSubmit = false;

Następnie, kiedy tworzysz przycisk lub z innego powodu (np. W funkcji), w końcu zezwalasz na przesłanie, po prostu odwróć globalną wartość logiczną i wykonaj wywołanie .submit (), podobnie jak w tym przykładzie:

function submitClick(){

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

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

}
Volomike
źródło
1

Natknąłem się na to sam, ponieważ mam wiele przycisków przesyłania z różnymi wartościami „nazwa”, więc po przesłaniu robią różne rzeczy na tym samym pliku php. Przycisk enter/ returnpsuje to, ponieważ te wartości nie zostały przesłane. Zastanawiałem się więc, czy przycisk enter/ returnaktywuje pierwszy przycisk przesyłania w formularzu? W ten sposób możesz mieć przycisk przesyłania „waniliowy”, który jest albo ukryty, albo ma wartość „nazwa”, która zwraca wykonywany plik php z powrotem na stronę z formularzem. Albo też domyślna (ukryta) wartość „nazwa”, którą aktywuje naciśnięcie klawisza, a przyciski wysyłania zastępują własne wartości „nazwa”. Tylko myśl.

Gavin
źródło
1

Co powiesz na:

<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>

I po prostu nazwij swój przycisk w prawo, a on nadal będzie się przesyłać, ale pola tekstowe, tj. WyraźnyOriginalTarget po wciśnięciu return w jednym, nie będą miały właściwej nazwy.

Andrew Arrow
źródło
0

To zadziałało dla mnie.
onkeydown = "return! (event.keyCode == 13)"

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

   </form>
krzykliwy
źródło
1
Jeśli masz textarea, nie możesz przejść do następnej linii przy wejściu w tej samej formie
Aamir Afridi
0

Oto jak bym to zrobił:

window.addEventListener('keydown', function(event)
{
    if (event.key === "Enter")
    {
        if(event.target.type !== 'submit')
        {
            event.preventDefault();
            return false;
        }
    }
}
Lonnie Best
źródło
-1

umieścić w zewnętrznym pliku javascript

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

    if (event.keyCode == 13) {

        return false;
    }
});

 })(jQuery);

lub gdzieś wewnątrz tagu ciała

<script>


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

        if(event.keyCode == 13) {

            return false;
        }
    });
});

</script>
topC
źródło
-2

Miałem ten sam problem (formularze z mnóstwem pól tekstowych i niewykwalifikowani użytkownicy).

Rozwiązałem to w ten sposób:

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;
    }
}

używając tego w kodzie HTML:

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

W ten sposób ENTERklucz działa zgodnie z planem, ale z potwierdzeniem (sekundaENTER wymagane jest zwykle kliknięcie).

Pozostawiam czytelnikom poszukiwanie skryptu wysyłającego użytkownika w pole, w którym nacisnął, ENTERjeśli zdecyduje się pozostać na formularzu.

Marco Bernardini
źródło