jquery wyłączy formularz wysyłania przy wejściu

207

Mam na swojej stronie następujący kod JavaScript, który wydaje się nie działać.

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

Chciałbym wyłączyć przesyłanie formularza przy wejściu, lub jeszcze lepiej, aby wywołać mój formularz ajax przesłania. Każde rozwiązanie jest dopuszczalne, ale powyższy kod nie uniemożliwia przesłania formularza.

Adam Levitt
źródło
3
Oto proste rozwiązanie tylko w formacie HTML: stackoverflow.com/a/51507806/337934
SamB

Odpowiedzi:

420

Jeśli keyCodenie zostanie złapany, złap which:

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

EDYCJA: przegapiłem, lepiej używać keyupzamiastkeypress

EDYCJA 2: Ponieważ w niektórych nowszych wersjach Firefoksa przesyłanie formularza nie jest uniemożliwione, bezpieczniej jest również dodać zdarzenie naciśnięcia klawisza do formularza. Również to nie działa (już?), Po prostu wiążąc zdarzenie z formularzem „nazwa”, ale tylko z identyfikatorem formularza. Dlatego uczyniłem to bardziej oczywistym, odpowiednio zmieniając przykład kodu.

EDYCJA 3: Zmieniono bind()naon()

zessx
źródło
15
jQuery normalizuje to e.which, więc nie musisz testować e.keyCode, ale +1 dla najbardziej prawdopodobnej przyczyny tego problemu.
Bojangles,
4
Potrzebujesz return false;tego? e.preventDefault();wydaje się enougth
chromigo,
10
Ważny! Ten blok rozwiązania psuje się w obszarze tekstowym.
German Khokhlov,
4
Problem polega na tym, że jeśli mam w tej samej formie pole tekstowe, teraz nie mogę dodać enter (aby utworzyć nową linię) w polu tekstowym.
Tikky
3
keyCode === 13 && !$(e.target).is('textarea')
teran
62

Zwykle formularz jest przesyłany, Entergdy koncentrujesz się na elementach wejściowych.

Możemy wyłączyć Enterklucz (kod 13) na elementach wejściowych w formularzu:

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

DEMO: http://jsfiddle.net/bnx96/325/

Wizja
źródło
Przycisk Go na iOS był moim problemem na niestandardowym polu autouzupełniania. To rozwiązało.
Dylan Valade
11
Zapobiega to użyciu klawisza Entertextareas w tej samej formie. Używanie $("form input")zamiast $("form :input")wydaje się to naprawić. DEMO: jsfiddle.net/bnx96/279
shaneparsons
43

Jeszcze krótszy:

$('myform').submit(function() {
  return false;
});
użytkownik1017926
źródło
35
Ale to również uniemożliwi kliknięcie przez użytkownika?
haibuihoang,
5
@haibuihoang Tak. Spowoduje to wyłączenie przesyłania formularza.
Tom
7
Powinieneś użyć, function(e) {e.preventDefault();}ponieważ wartości zwracane w procedurach obsługi zdarzeń są nieaktualne: stackoverflow.com/a/20045473/601386
grypa
6
@ user1111929 Działa to świetnie, ale nie powinna być najważniejszą odpowiedzią, ponieważ pytanie dotyczy tylko, Entera nie wyłączania przesyłania formularza za pomocą Submitprzycisku.
daveslab,
Częstą sytuacją, w której możesz chcieć zachować przesyłanie formularza, ale wyłączyć przesyłanie po naciśnięciu klawisza „enter”, jest to, jeśli zdecydujesz się użyć onClickzdarzenia jQuery do sprawdzenia poprawności formularza i nadal przesyłać za pomocą jQuery. Innymi słowy, są przypadki, w których chcesz przesyłać tylko przez javascript / jQuery. Chociaż nadal możesz używać AJAX z tym rozwiązaniem, wyłącza on podstawową funkcjonalność submitmetody.
JRad the Bad
23
$('form').keyup(function(e) {
  return e.which !== 13  
});

Właściwość event.which normalizuje event.keyCode i event.charCode. Zaleca się obejrzenie zdarzenia, które służy do wprowadzania danych z klawiatury.

which dokumenty

gdoron wspiera Monikę
źródło
14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 13) {
    e.preventDefault();
    return false;
  }
});

To rozwiązanie działa na wszystkich formularzach na stronie internetowej (również na formularzach wstawionych z ajaxem), zapobiegając jedynie wpisywaniu tekstu wejściowego. Umieść go w funkcji gotowości do dokumentu i zapomnij o tym problemie na całe życie.

Buzogany Laszlo
źródło
9

Większość odpowiedzi powyżej uniemożliwi użytkownikom dodawanie nowych wierszy w polu tekstowym. Jeśli tego chcesz uniknąć, możesz wykluczyć ten konkretny przypadek, sprawdzając, który element jest aktualnie aktywny:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}
Jean-Baptiste
źródło
8

Przesada polegająca na przechwytywaniu i testowaniu każdego naciśnięcia klawisza ENTER naprawdę mnie wkurza, więc moje rozwiązanie opiera się na następującym zachowaniu przeglądarki:

Naciśnięcie klawisza ENTER wywoła zdarzenie kliknięcia przycisku przesyłania (testowane w IE11, Chrome 38, FF 31) ** (patrz: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Więc moim rozwiązaniem jest usunięcie standardowego przycisku wysyłania (tj. <input type="submit">), Aby powyższe zachowanie zawiodło, ponieważ nie ma przycisku wysyłania, który magicznie kliknąłby po naciśnięciu klawisza ENTER. Zamiast tego używam modułu obsługi kliknięć jQuery na zwykłym przycisku, aby przesłać formularz metodą jQuery .submit().

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

Demo: http://codepen.io/anon/pen/fxeyv?editors=101

** to zachowanie nie ma zastosowania, jeśli formularz ma tylko 1 pole wejściowe, a pole to jest tekstem; w takim przypadku formularz zostanie przesłany po naciśnięciu klawisza ENTER, nawet jeśli w znaczniku HTML nie ma przycisku wysyłania (np. pola wyszukiwania). Jest to standardowe zachowanie przeglądarki od lat 90.

Costa
źródło
Dodałem niewidoczne pole wejściowe do licznika „formularz zostanie przesłany po naciśnięciu klawisza ENTER” spowodowany przez „formularz ma tylko 1 pole wejściowe i pole to jest„ tekstem ”.
Luo Jiong Hui,
6

jeśli chcesz po prostu wyłączyć opcję przesyłania przy wejściu i przycisk przesyłania, skorzystaj z zdarzenia onsubmit formularza

<form onsubmit="return false;">

Możesz zastąpić „return false” wywołaniem funkcji JS, która zrobi wszystko, co potrzebne, a także prześle formularz jako ostatni krok.

Perica Zivkovic
źródło
1
Spowoduje to wyłączenie przesyłania wszystkich formularzy, w tym kliknięcie przycisku przesyłania.
Nick
nie w 100% ... pracuj regularnie nad kluczem ... najlepiej użyj jquery, aby zapobiec
KingRider
Dobra alternatywna odpowiedź (z powyższymi zastrzeżeniami), ponieważ ... cóż, czasami to wszystko, czego potrzebujesz.
emilys
właśnie tego potrzebowałem w danej sytuacji, dziękuję
shababhsiddique
4

Możesz to zrobić doskonale w czystym JavaScript, prosty i bez biblioteki. Oto moja szczegółowa odpowiedź na podobny temat: Wyłączanie klawisza Enter dla formularza

Krótko mówiąc, oto kod:

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

Ten kod ma zapobiec klawiszowi „Enter” dla typu wprowadzania = „tylko tekst”. (Ponieważ użytkownik może potrzebować nacisnąć Enter na całej stronie). Jeśli chcesz wyłączyć „Enter” również 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 ...

Tarik
źródło
2
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
3

Nie wiem, czy już rozwiązałeś ten problem, czy ktoś próbuje go teraz rozwiązać, ale oto moje rozwiązanie!

$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;
    }
});
Don Marcony Neves
źródło
2

Prostym sposobem jest zmiana typu przycisku na przycisk - w html, a następnie dodanie zdarzenia w js ...

Zmień z tego:

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

Do

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

I w js lub jquery dodaj:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});
Zvi Redler
źródło
1

Poniższy kod zignoruje użycie klawisza Enter do przesłania formularza, ale nadal pozwoli na użycie klawisza Enter w polu tekstowym. Możesz go dalej edytować w zależności od potrzeb.

<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> 
Rzodkiewka
źródło
1

W Firefoksie, kiedy wejdziesz i naciśniesz enter, prześle on swoją górną formę. Rozwiązanie znajduje się w formularzu prześlij dodaj to:

<input type="submit" onclick="return false;" style="display:none" />
przebrnąć
źródło
1

3 lata później ani jedna osoba nie udzieliła pełnej odpowiedzi na to pytanie.

Pytający chce anulować domyślne przesłanie formularza i wywołać własny Ajax. To proste zapytanie z prostym rozwiązaniem. Nie ma potrzeby przechwytywania każdego znaku wprowadzonego do każdego wejścia.

Zakładając, że postać ma przedstawić przycisk, czy <button id="save-form">lub <input id="save-form" type="submit">wykonaj:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});
derekm
źródło
-2

Po zakończeniu pliku (ładowanie zakończone) skrypt wykrywa każde zdarzenie dla klucza „Entry” i wyłącza zdarzenie z tyłu.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>
McNavy
źródło
dodaj jakieś wyjaśnienie
HaveNoDisplayName,
@HaveNoDisplayName: zaktualizowano.
McNavy
-4

Kompletne rozwiązanie w JavaScript dla wszystkich przeglądarek

Powyższy kod i większość rozwiązań jest idealna. Myślę jednak, że najbardziej podobała się jedna „krótka odpowiedź”, która jest niepełna.

Oto cała odpowiedź. w JavaScript z natywną obsługą również dla IE 7.

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

To rozwiązanie uniemożliwi teraz użytkownikowi przesłanie przy użyciu klawisza Enter i nie przeładuje strony ani nie przeniesie Cię na górę strony, jeśli formularz znajduje się gdzieś poniżej.

Tarandeep Singh
źródło
8
Zapobiega to również przesłaniu formularza po kliknięciu przycisku „Prześlij”.
Mario Werner
-10

Co powiesz na to:

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

Powinno to wyłączyć wszystkie formularze za pomocą przycisków przesyłania w aplikacji.

Shreekar Patel
źródło