Wenn ein Formular gesendet wird, jedoch nicht über eine bestimmte Schaltfläche, z
- durch Drücken Enter
- mit
HTMLFormElement.submit()
in JS
Wie soll ein Browser bestimmen, welche der mehreren Senden-Schaltflächen, falls vorhanden, als gedrückte verwendet werden sollen?
Dies ist auf zwei Ebenen von Bedeutung:
- Aufrufen eines
onclick
Ereignishandlers, der an eine Senden-Schaltfläche angehängt ist - die an den Webserver zurückgesendeten Daten
Meine bisherigen Experimente haben gezeigt, dass:
- Wenn Sie auf EnterFirefox, Opera und Safari drücken , verwenden Sie die erste Schaltfläche zum Senden im Formular
- Beim Drücken Enterverwendet der IE entweder die erste oder gar keine Senden-Schaltfläche, je nachdem, welche Bedingungen ich nicht herausfinden konnte
- Alle diese Browser verwenden überhaupt keine für eine JS-Übermittlung
Was sagt der Standard?
Wenn es helfen würde, hier ist mein Testcode (das PHP ist nur für meine Testmethode relevant, nicht für meine Frage selbst)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<h1>Get</h1>
<dl>
<?php foreach ($_GET as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<h1>Post</h1>
<dl>
<?php foreach ($_POST as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<form name="theForm" method="<?php echo isset($_GET['method']) ? $_GET['method'] : 'get'; ?>" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<input type="text" name="method" />
<input type="submit" name="action" value="Button 1" onclick="alert('Button 1'); return true" />
<input type="text" name="stuff" />
<input type="submit" name="action" value="Button 2" onclick="alert('Button 2'); return true" />
<input type="button" value="submit" onclick="document.theForm.submit();" />
</form>
</body></html>
quelle
HTML 4 macht es nicht explizit. Der aktuelle HTML5-Arbeitsentwurf gibt an, dass die erste Senden-Schaltfläche die Standardeinstellung sein muss :
quelle
Andrezj hat es so ziemlich geschafft ... aber hier ist eine einfache Cross-Browser-Lösung.
Nehmen Sie eine Form wie diese an:
und Refactor dazu:
Da die W3C-Spezifikation angibt, dass mehrere Übermittlungsschaltflächen gültig sind, jedoch keine Anleitung zum Umgang mit dem Benutzeragenten enthält, müssen die Browserhersteller die Implementierung nach eigenem Ermessen durchführen. Ich habe festgestellt, dass sie entweder die erste Schaltfläche zum Senden im Formular oder die nächste Schaltfläche zum Senden nach dem Formularfeld senden, das derzeit den Fokus hat.
Leider einfach einen Anzeigestil hinzufügen : keine; funktioniert nicht, da die W3C-Spezifikation angibt, dass verborgene Elemente von Benutzerinteraktionen ausgeschlossen werden sollten. Verstecken Sie es stattdessen in Sichtweite!
Oben ist ein Beispiel für die Lösung, die ich letztendlich in Produktion genommen habe. Wenn Sie die Eingabetaste drücken, wird das Verhalten des Standardformulars wie erwartet ausgelöst, auch wenn andere nicht standardmäßige Werte vorhanden sind und vor der Standard-Senden-Schaltfläche im DOM stehen. Bonus für die Interaktion zwischen Maus und Tastatur mit expliziten Benutzereingaben unter Vermeidung von Javascript-Handlern.
Hinweis: Wenn Sie durch das Formular tippen, wird für kein visuelles Element der Fokus angezeigt, und dennoch wird die unsichtbare Schaltfläche ausgewählt. Um dieses Problem zu vermeiden, legen Sie einfach die tabindex-Attribute entsprechend fest und lassen Sie ein tabindex-Attribut auf der unsichtbaren Senden-Schaltfläche weg. Es mag zwar unangebracht erscheinen, diese Stile als wichtig zu bewerben, sie sollten jedoch verhindern, dass Frameworks oder vorhandene Schaltflächenstile diese Korrektur beeinträchtigen. Auch diese Inline-Stile sind definitiv eine schlechte Form, aber wir beweisen hier Konzepte ... und schreiben keinen Produktionscode.
quelle
<div style="position: fixed; left: -1000px; top: -1000px />
. Nur noch eines: Wenn Sie die Schaltfläche mit CSS minimieren oder aus dem Seitenfluss entfernen, kann dies zu WAI-Problemen führen, da Bildschirmleser weiterhin die Standardschaltfläche sehen.<input/>
oben?Ich denke, dieser Beitrag würde helfen, wenn jemand es mit jQuery machen möchte:
http://greatwebguy.com/programming/dom/default-html-button-submit-on-enter-with-jquery/
Die Grundlösung ist:
und ein anderer, den ich mochte, war:
quelle
.wich
Attribut. Auch keine Notwendigkeit, auf DOMs.keyCode
(oder.charCode
für diese Angelegenheit) zurückzugreifen.e.preventDefault();
am Anfang dieser Funktion hinzugefügt , um die Ausführung der "echten" Standardschaltfläche zu vermeiden. Funktioniert sehr gut.Ich hatte ein Formular mit 11 Senden-Schaltflächen, und es wurde immer die erste Senden-Schaltfläche verwendet, wenn der Benutzer die Eingabetaste drückte. Ich habe an anderer Stelle gelesen, dass es keine gute Idee ist (schlechte Praxis), mehr als eine Schaltfläche zum Senden in einem Formular zu haben. Der beste Weg, dies zu tun, besteht darin, die gewünschte Schaltfläche als einzige Schaltfläche zum Senden im Formular zu verwenden. Die anderen Schaltflächen sollten in "TYPE = BUTTON" umgewandelt und ein onClick-Ereignis hinzugefügt werden, das Ihre eigene Übermittlungsroutine in Javascript aufruft. Etwas wie das :-
Hier ist button3 die Standardeinstellung, und obwohl Sie das Formular programmgesteuert mit den anderen Schaltflächen senden, werden sie von der Routine mjsubmit überprüft. HTH.
quelle
Dies kann nun gelöst werden mit
flexbox
:HTML
CSS
Erklärung
Mit der Flexbox können wir die Reihenfolge der Elemente in einem verwendeten Container umkehren,
display: flex
indem wir auch die CSS-Regel verwenden :flex-direction: row-reverse
. Dies erfordert kein CSS oder versteckte Elemente. Für ältere Browser, die Flexbox nicht unterstützen, erhalten sie immer noch eine praktikable Lösung, aber die Elemente werden nicht umgekehrt.Demo
http://codepen.io/Godwin/pen/rLVKjm
quelle
Ich hatte mit der gleichen Frage zu kämpfen, da ich in der Mitte der Schaltfläche "Senden", von der aus die Weiterleitung auf eine andere Seite weitergeleitet wurde, wie folgt:
Wenn der Benutzer die Eingabetaste drückte, wurde diese Schaltfläche anstelle einer anderen Senden-Schaltfläche angeklickt.
Also habe ich einige primitive Tests durchgeführt, indem ich ein From mit mehreren Submit-Schaltflächen und verschiedenen Sichtbarkeitsoptionen erstellt und per Ereignis darauf hingewiesen habe, auf welche Schaltfläche geklickt wurde: https://jsfiddle.net/aqfy51om/1/
Browser und Betriebssysteme, die ich zum Testen verwendet habe:
FENSTER
OSX
Die meisten dieser Browser haben trotz der angewendeten Sichtbarkeitsoptionen auf die erste Schaltfläche geklickt, mit Ausnahme von IE und Safari, die auf die dritte Schaltfläche geklickt haben, die im "versteckten" Container "sichtbar" ist:
Mein Vorschlag, den ich selbst verwenden werde, lautet also:
Wenn Ihr Formular mehrere Senden-Schaltflächen mit unterschiedlicher Bedeutung hat, fügen Sie am Anfang des Formulars die Senden-Schaltfläche mit der Standardaktion ein. Dies ist entweder:
style="width: 0; height: 0; overflow: hidden;"
BEARBEITEN Eine andere Option könnte sein, die Schaltfläche zu versetzen (noch am Anfang des von)
style="position: absolute; left: -9999px; top: -9999px;"
, habe es gerade im IE versucht - funktioniert, aber ich habe keine Ahnung, was es sonst noch vermasseln kann, zum Beispiel Drucken.quelle
Aus Ihren Kommentaren:
Ich lasse eine
<input type="hidden" value="form_name" />
in jede Form fallen.Wenn Sie mit Javascript senden: Fügen Sie Formulare Übermittlungsereignisse hinzu, und klicken Sie nicht auf Ereignisse auf deren Schaltflächen. Saavy-Benutzer berühren ihre Maus nicht sehr oft.
quelle
Wenn Sie mehrere Senden-Schaltflächen in einem Formular haben und ein Benutzer die EINGABETASTE drückt, um das Formular über ein Textfeld zu senden, überschreibt dieser Code die Standardfunktionalität, indem er das Senden-Ereignis im Formular über das Tastendruckereignis aufruft. Hier ist dieser Code:
quelle
Seltsam, dass die erste Schaltfläche Enter immer zur ersten Schaltfläche wechselt, unabhängig davon, ob sie sichtbar ist oder nicht, z
show/hide()
. B. mithilfe von jquery . Das Hinzufügen eines Attributs.attr('disabled', 'disabled')
verhindert den vollständigen Empfang der Schaltfläche "Senden". Dies ist beispielsweise ein Problem beim Anpassen der Sichtbarkeit der Schaltfläche Einfügen / Bearbeiten + Löschen in Aufzeichnungsdialogen. Ich fand es weniger hackisch und einfach, Edit vor Insert zu platzierenund verwenden Sie Javascript-Code:
quelle
Mein Rezept:
Es wird das versteckte Standardfeld gesendet, wenn keine der Schaltflächen angeklickt wird.
Wenn sie angeklickt werden, haben sie Vorrang und der Wert wird übergeben.
quelle
Eine andere Lösung, die ich verwendet habe, besteht darin, nur eine Schaltfläche im Formular zu haben und die anderen Schaltflächen zu fälschen.
Hier ist ein Beispiel:
Ich gestalte dann die Span-Elemente so, dass sie wie eine Schaltfläche aussehen. Ein JS-Listener beobachtet die Spanne und führt nach dem Klicken die gewünschte Operation aus.
Nicht unbedingt für alle Situationen geeignet, aber zumindest ist es ziemlich einfach.
quelle
Aus der HTML 4-Spezifikation :
Dies bedeutet, dass bei mehr als 1 Senden-Schaltfläche und keiner aktivierten (angeklickten) keine erfolgreich sein sollte.
Und ich würde argumentieren, dass dies sinnvoll ist: Stellen Sie sich ein riesiges Formular mit mehreren Senden-Schaltflächen vor. Oben befindet sich die Schaltfläche "Diesen Datensatz löschen", dann folgen viele Eingaben, und unten befindet sich die Schaltfläche "Diesen Datensatz aktualisieren". Ein Benutzer, der in einem Feld am unteren Rand des Formulars die Eingabetaste drückt, würde niemals vermuten, dass er implizit oben auf "Diesen Datensatz löschen" klickt.
Daher halte ich es für keine gute Idee, die erste oder eine andere Schaltfläche zu verwenden, die der Benutzer nicht definiert (klicken). Trotzdem machen es die Browser natürlich.
quelle
EDIT: Entschuldigung, als ich diese Antwort schrieb, dachte ich über Submit-Buttons im allgemeinen Sinne nach. Bei der folgenden Antwort geht es nicht um mehrere
type="submit"
Schaltflächen, da nur eine übrig bleibttype="submit"
und die andere geändert wirdtype="button"
. Ich lasse die Antwort hier als Referenz für den Fall, dass jemand hilft, dertype
die Form ändern kann :Um festzustellen, welche Taste beim Drücken der Eingabetaste gedrückt wird, können Sie sie mit
type="submit"
und die anderen Tasten mit markierentype="button"
. Beispielsweise:quelle