Ich habe eine .submit()
Veranstaltung für die Formularübermittlung eingerichtet. Ich habe auch mehrere Formulare auf der Seite, aber nur eines hier für dieses Beispiel. Ich möchte wissen, auf welche Schaltfläche zum Senden geklickt wurde, ohne .click()
auf jedes Ereignis ein Ereignis anzuwenden .
Hier ist das Setup:
<html>
<head>
<title>jQuery research: forms</title>
<script type='text/javascript' src='../jquery-1.5.2.min.js'></script>
<script type='text/javascript' language='javascript'>
$(document).ready(function(){
$('form[name="testform"]').submit( function(event){ process_form_submission(event); } );
});
function process_form_submission( event ) {
event.preventDefault();
//var target = $(event.target);
var me = event.currentTarget;
var data = me.data.value;
var which_button = '?'; // <-- this is what I want to know
alert( 'data: ' + data + ', button: ' + which_button );
}
</script>
</head>
<body>
<h2>Here's my form:</h2>
<form action='nothing' method='post' name='testform'>
<input type='hidden' name='data' value='blahdatayadda' />
<input type='submit' name='name1' value='value1' />
<input type='submit' name='name2' value='value2' />
</form>
</body>
</html>
Gibt es neben dem Anwenden eines .click () -Ereignisses auf jede Schaltfläche eine Möglichkeit, festzustellen, auf welche Senden-Schaltfläche geklickt wurde?
name
?Antworten:
Ich habe dieselbe Frage gestellt: Wie kann ich die Schaltfläche, die die Übermittlung verursacht hat, aus dem Formularübermittlungsereignis abrufen?
Am Ende habe ich mir diese Lösung ausgedacht und sie hat ziemlich gut funktioniert:
In Ihrem Fall mit mehreren Formularen müssen Sie dies möglicherweise etwas anpassen, es sollte jedoch weiterhin gelten
quelle
Ich fand, dass dies funktionierte.
quelle
Das funktioniert bei mir:
quelle
id
von deractiveElement
habe ich$(document.activeElement).attr('id');
document.activeElement.id
document.activeElement
ist nicht die Eingabe. In meinem Fall ist es ein modales Div (das das Formular enthält).Wenn das Formular gesendet wird:
document.activeElement
gibt Ihnen die Schaltfläche "Senden", auf die geklickt wurde.document.activeElement.getAttribute('value')
gibt Ihnen den Wert dieser Schaltfläche.quelle
Hier ist der Ansatz, der für meine Zwecke sauberer erscheint.
Erstens für alle Formen:
Wenn dieses Klickereignis für ein Formular ausgelöst wird, zeichnet es einfach das Ursprungsziel (im Ereignisobjekt verfügbar) auf, auf das später zugegriffen werden soll. Dies ist ein ziemlich breiter Strich, da er für jeden Klick irgendwo auf dem Formular ausgelöst wird. Optimierungskommentare sind willkommen, aber ich vermute, dass sie niemals erkennbare Probleme verursachen werden.
Dann können
$('form').submit()
Sie in nachfragen, was zuletzt angeklickt wurde, mit so etwas wiequelle
return false
, während diese Methode ordnungsgemäß funktioniert, da der Klick an das Formular anstatt an dessen untergeordnete Elemente gebunden ist.... $(event.target))
, kann aber nicht bearbeitet werden, da die Änderungen> 6 Zeichen sein müssenWow, manche Lösungen können kompliziert werden! Wenn es Ihnen nichts ausmacht, ein einfaches globales Ereignis zu verwenden, nutzen Sie einfach die Tatsache, dass das Klickereignis der Eingabeschaltfläche zuerst ausgelöst wird. Man könnte den Selektor $ ('input') für eine von vielen Formen weiter filtern, indem man $ ('# myForm input') verwendet.
quelle
Ich habe die beste Lösung gefunden
Dies funktioniert nicht nur bei Eingaben, sondern auch bei Schaltflächen-Tags. Außerdem wird die ID der Schaltfläche angezeigt.
quelle
$(document.activeElement).attr('id')
zurückkehrtundefined
Eine andere mögliche Lösung besteht darin, Ihrem Formular ein verstecktes Feld hinzuzufügen:
Fügen Sie dann in der Bereitschaftsfunktion Funktionen hinzu, um aufzuzeichnen, welche Taste gedrückt wurde:
Lesen Sie nun im Formular-Submitions-Handler die versteckte Variable und entscheiden Sie basierend darauf:
quelle
Aufbauend auf dem, was Stan und Yann-h getan haben, wird standardmäßig der erste Knopf verwendet. Das Schöne an diesem Gesamtansatz ist, dass sowohl der Klick als auch die Eingabetaste erfasst werden (auch wenn der Fokus nicht auf der Schaltfläche lag. Wenn Sie die Eingabe in das Formular zulassen müssen, reagieren Sie einfach darauf, wenn eine Schaltfläche fokussiert ist ( dh Stans Antwort). In meinem Fall wollte ich die Eingabe zulassen, um das Formular zu senden, auch wenn der aktuelle Fokus des Benutzers auf dem Textfeld lag.
Ich habe auch ein 'name'-Attribut anstelle von' id 'verwendet, aber dies ist der gleiche Ansatz.
quelle
Dieser hat für mich gearbeitet
quelle
Wenn Sie damit meinen, dass Sie kein .click-Ereignis hinzufügen, dass Sie keine separaten Handler für diese Ereignisse haben möchten, können Sie alle Klicks (Submits) in einer Funktion verarbeiten:
quelle
event.preventDefault
oder tun Sie etwas wieinput.parents("form")[0].submit()
.Da ich die akzeptierte Antwort nicht kommentieren kann, bringe ich hier eine modifizierte Version mit, die Elemente berücksichtigen sollte, die sich außerhalb des Formulars befinden (dh: mit dem
form
Attribut an das Formular angehängt ). Dies ist für moderne Browser: http://caniuse.com/#feat=form-attribute . Dasclosest('form')
wird als Fallback für nicht unterstützteform
Attribute verwendetquelle
"button,[type=submit]"
verstecktes Feld hinzufügen
quelle
button[type=submit]
und einzuschließeninput[type=image]
.Für mich war die beste Lösung:
quelle
Mit dieser hervorragenden Antwort können Sie das aktive Element (die Schaltfläche) überprüfen, eine versteckte Eingabe an das Formular anhängen und es optional am Ende des Übermittlungshandlers entfernen.
Randnotiz: Ich persönlich füge die Klasse
form-js
zu allen Formularen hinzu, die über JavaScript gesendet werden.quelle
Ähnlich wie Stan Antwort, aber:
quelle
Dies ist die von mir verwendete Lösung und funktioniert sehr gut:
quelle
Es hat mir geholfen https://stackoverflow.com/a/17805011/1029257
Das Formular wurde erst gesendet, nachdem auf die Schaltfläche "Senden" geklickt wurde.
quelle
Hier ist meine Lösung:
quelle
Ich habe auch eine Lösung gefunden, und sie funktioniert ganz gut:
Sie verwendet jQuery und CSS
Zuerst habe ich eine schnelle CSS-Klasse erstellt, die eingebettet oder in eine separate Datei eingebettet werden kann.
Fügen Sie als Nächstes beim Klicken auf eine Schaltfläche im Formular die CSS-Klasse zur Schaltfläche hinzu. Wenn die Schaltfläche bereits die CSS-Klasse enthält, entfernen Sie sie. (Wir wollen keine zwei CSS-Klassen [Nur für den Fall]).
Testen Sie nun die Schaltfläche, um festzustellen, ob sie die CSS-Klasse enthält. Wenn die getestete Schaltfläche nicht über das CSS verfügt, wird die andere Schaltfläche angezeigt.
Hoffe das hilft! Prost!
quelle
button[type=submit]
und einzuschließeninput[type=image]
.hasClass()
undremoveClass()
sind überflüssig, daaddClass()
nicht die gleiche Klasse hinzufügen zweimal.Sie können den Eingabetyp = "versteckt" als Halter für eine Schaltflächen-ID-Information erstellen.
In diesem Fall übergibt das Formular beim Senden den Wert "1" (ID Ihrer Schaltfläche). Dies funktioniert, wenn onClick vor dem Senden auftritt (?), Was ich nicht sicher bin, ob es immer wahr ist.
quelle
Eine einfache Möglichkeit, um zu unterscheiden, welche <button> oder <input type = "button" ...> gedrückt wird, besteht darin, ihre 'id' zu überprüfen:
quelle
Hier ist ein Beispiel, das this.form verwendet, um das richtige Formular für die Übermittlung zu erhalten, und Datenfelder, um das zuletzt angeklickte / fokussierte Element zu speichern. Ich habe auch den Sendecode in ein Timeout eingeschlossen, um sicherzustellen, dass Klickereignisse auftreten, bevor sie ausgeführt werden (einige Benutzer haben in Kommentaren berichtet, dass in Chrome manchmal ein Klickereignis nach dem Senden ausgelöst wird).
Funktioniert beim Navigieren sowohl mit Tasten als auch mit Maus / Fingern, ohne auf Browser zu zählen, um ein Klickereignis auf die RETURN-Taste zu senden (tut aber nicht weh). Ich habe einen Ereignishandler für Fokusereignisse für Schaltflächen und Felder hinzugefügt.
Sie können den Elementen Schaltflächen vom Typ = "Senden" hinzufügen, die sich beim Klicken selbst speichern.
In der Demo habe ich einen roten Rand gesetzt, um das ausgewählte Element anzuzeigen, und eine Warnung, die Name und Wert / Bezeichnung anzeigt.
Hier ist der FIDDLE
Und hier ist der (gleiche) Code:
Javascript:
DUMMY HTML:
DUMB CSS:
quelle
Ich schreibe diese Funktion, die mir hilft
und dann verwenden
quelle
quelle
Sie möchten window.event.srcElement.id folgendermaßen verwenden :
für eine Schaltfläche, die aussieht wie:
Sie erhalten eine Warnung mit der Aufschrift: "Das angeklickte Element war myButton.
In Ihrem verbesserten Beispiel können Sie window.event.srcElement zu process_form_submission hinzufügen, und Sie erhalten einen Verweis auf das Element, das den Prozess aufgerufen hat.
quelle