Ich habe eine Umfrage auf einer Website und es scheint einige Probleme mit den Benutzern zu geben, die die Eingabetaste drücken (ich weiß nicht warum) und versehentlich die Umfrage (Formular) senden, ohne auf die Schaltfläche "Senden" zu klicken. Gibt es eine Möglichkeit, dies zu verhindern?
Ich verwende HTML, PHP 5.2.9 und jQuery für die Umfrage.
jquery
html
forms
form-submit
DForck42
quelle
quelle
Antworten:
Sie können eine Methode wie verwenden
EnterWenn Sie die Kommentare zum Originalbeitrag lesen, um ihn benutzerfreundlicher zu gestalten und den Benutzern das Drücken zu ermöglichen, wenn sie alle Felder ausgefüllt haben:
quelle
keydown
an dasdocument
anstatt an das binden müssen,window
damit dies funktioniert.&& !$(document.activeElement).is('textarea')
der Bedingung hinzufügen , oder Zeilenumbrüche in einem Textbereich werden blockiert (zumindest im IE).Geben Sie die Eingabetaste an keiner Stelle ein
Wenn Sie keine
<textarea>
in Ihrem Formular haben, fügen Sie einfach Folgendes zu Ihrem hinzu<form>
:Oder mit jQuery:
Dies führt dazu, dass jeder Tastendruck im Formular auf dem überprüft wird
key
. Wenn dies nicht der Fall istEnter
, wird es zurückkehrentrue
und alles wird wie gewohnt fortgesetzt. Wenn dies der Fall istEnter
, wird es zurückgegebenfalse
und alles wird sofort gestoppt, sodass das Formular nicht gesendet wird.Die
keydown
Veranstaltung wird der Veranstaltung vorgezogen,keyup
dakeyup
es zu spät ist, die Formularübermittlung zu blockieren. Historisch gab es auch diekeypress
, aber diese ist veraltet, ebenso wie dieKeyboardEvent.keyCode
. Sie solltenKeyboardEvent.key
stattdessen verwenden, was den Namen der gedrückten Taste zurückgibt. WennEnter
diese Option aktiviert ist, werden sowohl 13 (normale Eingabe) als auch 108 (Numpad-Eingabe) überprüft.Beachten Sie, dass,
$(window)
wie in einigen anderen Antworten vorgeschlagen,$(document)
nicht fürkeydown
/keyup
in IE <= 8 funktioniert. Dies ist also keine gute Wahl, wenn Sie auch diese armen Benutzer abdecken möchten.Eingabetaste nur in Textbereichen zulassen
Wenn Sie eine
<textarea>
in Ihrem Formular haben (die natürlich die Eingabetaste akzeptieren sollte ), fügen Sie den Keydown-Handler zu jedem einzelnen Eingabeelement hinzu, das keine ist<textarea>
.Um die Boilerplate zu reduzieren, ist dies besser mit jQuery zu tun:
Wenn an diese Eingabeelemente andere Ereignishandlerfunktionen angehängt sind, die Sie aus irgendeinem Grund auch bei der Eingabetaste aufrufen möchten, verhindern Sie nur das Standardverhalten des Ereignisses, anstatt false zurückzugeben, damit es ordnungsgemäß an andere Handler weitergegeben werden kann.
Lassen Sie die Eingabetaste in Textbereichen zu und senden Sie nur Schaltflächen
Wenn Sie die Eingabetaste auch für die Senden-Schaltflächen zulassen möchten
<input|button type="submit">
, können Sie die Auswahl jederzeit wie folgt verfeinern.Beachten Sie, dass,
input[type=text]
wie in einigen anderen Antworten vorgeschlagen, diese HTML5-Nicht-Texteingaben nicht behandelt werden. Dies ist also keine gute Auswahl.quelle
":input:not(textarea):not([type=submit]):not(button)"
wenn Sie<button>
anstelle von<input type=submit>
input
?In Abschnitt 4.10.22.2 Implizite Übermittlung der W3C-HTML5-Spezifikation heißt es:
Eine standardkonforme Möglichkeit zum Deaktivieren der impliziten Übermittlung des Formulars besteht daher darin, eine deaktivierte Übermittlungsschaltfläche als erste Übermittlungsschaltfläche im Formular zu platzieren:
Ein schönes Merkmal dieses Ansatzes ist, dass er ohne JavaScript funktioniert . Unabhängig davon, ob JavaScript aktiviert ist oder nicht, ist ein standardkonformer Webbrowser erforderlich, um die implizite Übermittlung von Formularen zu verhindern.
quelle
<input type="submit" disabled style="display: none" aria-hidden="true" />
und Sie können die Größe Ihrer Seite um einige Zeichen reduzieren. :-PIch musste alle drei Ereignisse im Zusammenhang mit dem Drücken von Tasten abfangen, um zu verhindern, dass das Formular gesendet wurde:
Sie können all das zu einer schönen kompakten Version kombinieren:
quelle
$("#search").bind('keypress keyup keydown',preventSubmit)
.<form>
Tag, die Enter - Taste wird das Formular ... Diese Lösung die Enter - Taste deaktiviert und das Problem behoben aber dank @ Dave! Dann habe ich die Eingabetaste für bestimmte Felder durch aktiviertid
.console.log
, ich habe meine Antwort aktualisiert.keypress keyup keydown
Sie mit jedem Code in der if-Bedingung zweimal auslösen .Wenn Sie ein Skript verwenden, um die eigentliche Übermittlung durchzuführen, können Sie dem Onsubmit-Handler die folgende Zeile "return false" hinzufügen:
Das Aufrufen von submit () im Formular über JavaScript löst das Ereignis nicht aus.
quelle
Verwenden:
Diese Lösung funktioniert auf allen Formularen auf einer Website (auch auf mit Ajax eingefügten Formularen) und verhindert nur Enters in Eingabetexten. Platzieren Sie es in einer dokumentenbereiten Funktion und vergessen Sie dieses Problem ein Leben lang.
quelle
e.which
war in Ordnung; keine Notwendigkeit, es zu änderne.keyCode
. Beide geben den Wert 13 für die Eingabetaste zurück. Siehe stackoverflow.com/a/4471635/292060 und stackoverflow.com/a/18184976/292060Anstatt zu verhindern, dass Benutzer drücken Enter, was unnatürlich erscheint, können Sie das Formular unverändert lassen und eine zusätzliche clientseitige Validierung hinzufügen: Wenn die Umfrage nicht abgeschlossen ist, wird das Ergebnis nicht an den Server gesendet und der Benutzer erhält eine nette Nachricht Was muss ausgefüllt werden, um das Formular auszufüllen? Wenn Sie jQuery verwenden, versuchen Sie es mit dem Validierungs-Plugin:
http://docs.jquery.com/Plugins/Validation
Dies erfordert mehr Arbeit als das Abfangen der EnterSchaltfläche, bietet aber sicherlich eine umfassendere Benutzererfahrung.
quelle
Eine schöne einfache kleine jQuery-Lösung:
quelle
var key = event.keyCode || event.which; if (key == 13) return false;
Ich kann noch keinen Kommentar abgeben, daher werde ich eine neue Antwort veröffentlichen
Die akzeptierte Antwort ist in Ordnung, aber sie hat das Senden bei der Eingabe des Nummernblocks nicht gestoppt. Zumindest in der aktuellen Version von Chrome. Ich musste die Keycode-Bedingung ändern, dann funktioniert es.
quelle
Es ist meine Lösung, um das Ziel zu erreichen, es ist sauber und effektiv.
quelle
Ein ganz anderer Ansatz:
<button type="submit">
im Formular wird beim Drücken aktiviert Enter.style="display:none;
false
, wodurch der Übermittlungsprozess abgebrochen wird.<button type=submit>
das Formular noch von einem anderen senden lassen. Kehren Sie einfach zurück,true
um die Einreichung zu kaskadieren.<textarea>
oder anderer Formularsteuerelemente verhält sich wie gewohnt.<input>
Formularsteuer löst der erste<button type=submit>
, der zurückkehrtfalse
, und damit nichts passiert.Somit:
quelle
<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Geben Sie der Form eine Aktion von 'Javascript: void (0);' scheint den Trick zu tun
quelle
Das Nicht-Setzen eines Submit-Buttons könnte reichen. Fügen Sie einfach ein Skript in die Eingabe ein (Typ = Schaltfläche) oder fügen Sie eventListener hinzu, wenn Sie möchten, dass die Daten im Formular gesendet werden.
Verwenden Sie dies lieber
als dies zu verwenden
quelle
quelle
Ich musste verhindern, dass nur bestimmte Eingaben gesendet wurden, daher habe ich einen Klassenselektor verwendet, damit dies eine "globale" Funktion ist, wo immer ich sie benötige.
Und dieser jQuery-Code:
Alternativ, wenn der Keydown nicht ausreicht:
Einige Notizen:
Wenn Sie hier verschiedene gute Antworten ändern, Enterscheint der Schlüssel für
keydown
alle Browser zu funktionieren . Für die Alternative habe ichbind()
auf dieon()
Methode aktualisiert .Ich bin ein großer Fan von Klassenselektoren, die alle Vor- und Nachteile sowie Leistungsdiskussionen abwägen. Meine Namenskonvention lautet "idSomething", um anzuzeigen, dass jQuery sie als ID verwendet, um sie vom CSS-Stil zu trennen.
quelle
Sie können eine JavaScript-Methode erstellen, um zu überprüfen, ob der EnterSchlüssel gedrückt wurde, und um die Übermittlung zu stoppen.
Rufen Sie das einfach bei der Submit-Methode auf.
quelle
NUR BLOCK SUBMIT, aber keine andere wichtige Funktion der Eingabetaste, z. B. das Erstellen eines neuen Absatzes in einem
<textarea>
:quelle
function(e)
sollte es seinfunction(event)
. Ansonsten funktioniert es bei mir. Vielen Dank.on("keydown", function(event) { enterPressed = true; }
und dann im Submit-Ereignis doon("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}
sicher, dass es unabhängig von der Verzögerung funktioniert.Dies ist der perfekte Weg. Sie werden nicht von Ihrer Seite weitergeleitet
quelle
Ich hatte ein ähnliches Problem, bei dem ich ein Raster mit "Ajax-Textfeldern" (Yii CGridView) und nur einer Senden-Schaltfläche hatte. Jedes Mal, wenn ich in einem Textfeld gesucht und das übermittelte Formular eingegeben habe. Ich musste etwas mit der Schaltfläche tun, da dies die einzige gemeinsame Schaltfläche zwischen den Ansichten war (MVC-Muster). Alles was ich tun musste war entfernen
type="submit"
und setzenonclick="document.forms[0].submit()
quelle
Ich denke, es ist mit allen Antworten gut abgedeckt, aber wenn Sie eine Schaltfläche mit einem JavaScript-Validierungscode verwenden, können Sie einfach den Onkeypress des Formulars für Enter festlegen, um Ihre Übermittlung wie erwartet aufzurufen:
Der Onkeypress JS könnte alles sein, was Sie tun müssen. Es besteht keine Notwendigkeit für eine größere globale Veränderung. Dies gilt insbesondere dann, wenn Sie nicht derjenige sind, der die App von Grund auf neu codiert, und Sie dazu gebracht wurden, die Website eines anderen zu reparieren, ohne sie auseinander zu reißen und erneut zu testen.
quelle
Hier gibt es bereits viele gute Antworten. Ich möchte nur etwas aus UX-Sicht beitragen. Tastatursteuerungen in Formularen sind sehr wichtig.
Die Frage ist, wie die Übermittlung beim Tastendruck deaktiviert werden kann
Enter
. Nicht, wie manEnter
in einer gesamten Anwendung ignoriert . Ziehen Sie daher in Betracht, den Handler an ein Formularelement anzuhängen, nicht an das Fenster.Das Deaktivieren
Enter
für das Senden von Formularen sollte weiterhin Folgendes ermöglichen:Enter
wenn die Schaltfläche "Senden" fokussiert ist.Enter
.Dies ist nur eine Kesselplatte, aber es folgt allen drei Bedingungen.
quelle
Etwas, das ich hier nicht beantwortet gesehen habe: Wenn Sie durch die Elemente auf der Seite Enterblättern , wird durch Drücken der Schaltfläche "Senden" der Onsubmit-Handler im Formular ausgelöst, das Ereignis wird jedoch als MouseEvent aufgezeichnet. Hier ist meine kurze Lösung, um die meisten Grundlagen abzudecken:
Dies ist keine jQuery-bezogene Antwort
HTML
JavaScript
So finden Sie ein funktionierendes Beispiel: https://jsfiddle.net/nemesarial/6rhogva2/
quelle
In meinem speziellen Fall musste ich ENTER daran hindern, das Formular zu senden, und auch das Klicken auf die Schaltfläche "Senden" simulieren. Dies liegt daran, dass auf der Schaltfläche "Senden" ein Klick-Handler vorhanden war, da wir uns in einem modalen Fenster befanden (geerbter alter Code). In jedem Fall sind hier meine Kombinationslösungen für diesen Fall.
Dieser Anwendungsfall ist besonders nützlich für Benutzer von IE8.
quelle
Das funktioniert bei mir
quelle
Ich möchte einen kleinen CoffeeScript-Code hinzufügen (nicht vor Ort getestet):
(Ich hoffe, Ihnen gefällt der nette Trick in der Klausel "Es sei denn".)
quelle
Verwenden von Javascript (ohne ein Eingabefeld zu überprüfen):
Wenn jemand dies auf bestimmte Felder anwenden möchte, z. B. Text vom Typ Eingabe:
Das funktioniert in meinem Fall gut.
quelle
Gehen Sie in Ihr CSS und fügen Sie es hinzu. Dann wird die Übermittlung Ihres Formulars automatisch blockiert, solange Sie Eingaben übermittelt haben. Wenn Sie dies nicht mehr möchten, können Sie es löschen oder eingeben
activate
unddeactivate
stattdessenquelle
Sie können auch
javascript:void(0)
das Senden von Formularen verhindern.quelle
method="post"
auf Ihrem Formular haben. Zum Beispiel möchte ich, dass das Formular über Schaltflächen gesendet wird, aber nicht, wenn Sie die Eingabetaste drücken, während Sie sich auf die Eingabe konzentrieren.method="post"
in Form und seinen Werken haben, nochmal prüfen.Dies hat bei mir in allen Browsern nach viel Frust mit anderen Lösungen funktioniert. Die äußere Funktion name_space dient nur dazu, sich von der Deklaration von Globals fernzuhalten, was ich ebenfalls empfehle.
Beispielverwendung:
quelle
Verwenden:
quelle