Wie kann ich Argumente an Ereignishandler in jQuery übergeben?

Antworten:

110

Am einfachsten ist es, dies so zu tun (vorausgesetzt, Sie möchten nicht, dass die Ereignisinformationen an die Funktion übergeben werden) ...

$("#myid").click(function() {
    myfunction(arg1, arg2);
});

jsFiddle .

Dadurch wird eine anonyme Funktion erstellt, die beim clickAuslösen des Ereignisses aufgerufen wird. Dies wird wiederum myfunction()mit den von Ihnen angegebenen Argumenten aufgerufen .

Wenn Sie ThisBindingden Wert beibehalten möchten (der Wert, zu thisdem die Funktion aufgerufen wird, setzen Sie ihn auf das Element, das das Ereignis ausgelöst hat), rufen Sie die Funktion mit auf call().

$("#myid").click(function() {
    myfunction.call(this, arg1, arg2);
});

jsFiddle .

Sie können die Referenz nicht direkt so übergeben, wie es in Ihrem Beispiel angegeben ist, oder das einzige Argument ist das jQuery- eventObjekt .

Wenn Sie noch die Referenz zu übergeben möchten, müssen Sie jQuery nutzen proxy()Funktion (die eine Cross - Browser - Wrapper ist für Function.prototype.bind()). Auf diese Weise können Sie Argumente übergeben, die vor dem eventArgument gebunden sind .

$("#myid").click($.proxy(myfunction, null, arg1, arg2));   

jsFiddle .

In diesem Beispiel myfunction()würde mit seinem ausgeführt wird ThisBindingintakt ( nullkein Objekt ist , so dass der normale thisWert des Elements , das das Ereignis ausgelöst wird), zusammen mit den Argumenten (in dieser Reihenfolge) arg1, arg2und schließlich das jQuery - eventObjekt, das Sie ignorieren können wenn es nicht erforderlich ist (benennen Sie es nicht einmal in den Argumenten der Funktion).

Sie können auch die jQuery- eventObjekte verwenden data, um Daten zu übergeben. Dies würde jedoch eine Änderung erfordern, um myfunction()über event.data.arg1(die keine Funktionsargumente sind, wie in Ihren Fragen erwähnt) darauf zuzugreifen , oder zumindest eine manuelle Proxy-Funktion wie das vorherige Beispiel oder eine generierte mit dem letzteren Beispiel.

Alex
quelle
2
Denken Sie daran, dass Sie den jquery-Kontext $ (this) in myfunction () verlieren. Rufen Sie zur Wartung myfunction(this, arg1, arg2)den anonymen Handler auf. Dann kann Ihre Funktion tunmyfunction(el, arg1, arg2) { alert($(el).val()); }
Lambinator
11
@geosteve: Wenn Sie es behalten wollten, verwenden Sie myfunction.call(this, arg1, arg2).
Alex
1
Das gibt keine Argumente an die Funktion weiter, wie die Frage fragt. Es ruft eine Funktion auf, die eine andere Funktion aufruft. Das Verschachteln von Funktionen in anonymen Funktionen ist keine gute Idee, da Sie die anonyme Funktion nicht einfach aufheben können.
George Filippakos
1
@ geo1701 Sie können, wenn Sie einen benutzerdefinierten Namespace verwenden und nur einmal daran binden. Für die meisten Zwecke ist es in Ordnung. Aber Sie verlieren den Vorteil, den Sie erwähnt haben.
Alex
1
In Übereinstimmung mit @ geo1701 musste ich den Ereignishandler entfernen und seine Lösung hat nur funktioniert.
Pavel K
76
$("#myid").on('click', {arg1: 'hello', arg2: 'bye'}, myfunction);

function myfunction(e) {

    var arg1 = e.data.arg1;
    var arg2 = e.data.arg2;

    alert(arg1);
    alert(arg2);

}

//call method directly:
myfunction({
    arg1: 'hello agian', 
    arg2: 'bye again'
});

Außerdem können Sie bestimmte Ereignishandler mithilfe der Ein- und Ausschaltmethoden binden und die Bindung aufheben.

Beispiel:

$("#myid").off('click', myfunction);

Dies würde den myfunction handler von #myid lösen

George Filippakos
quelle
Das gibt keine Argumente an die Funktion weiter, wie die Frage fragt.
Alex
4
Auf diese Weise übergeben Sie Argumente (Sie wickeln sie in ein Objekt ein).
George Filippakos
Auf diese Weise übergeben Sie Daten, aber es ist eine Strecke, die sie als Funktionsargumente bezeichnet.
Alex
6
Dies ist eine bessere Lösung für die akzeptierte Antwort, da das empfohlene Muster zum Binden und Entbinden von Listenern mithilfe der Ein / Aus-Methoden verwendet wird.
George Filippakos
7
Wenn Sie der Meinung sind, dass das Entbinden ziemlich selten ist, müssen Sie nur über sehr begrenzte Erfahrung verfügen. Bitte poo poo Beiträge von anderen nicht - dies ist eine kollektive Wissensbasis, kein Wettbewerb. Es gibt keine richtigen oder falschen Antworten.
George Filippakos
12

Während Sie auf jeden Fall Alex 'Antwort verwenden sollten, wurde die "Bind" -Methode der Prototypbibliothek in Ecmascript 5 standardisiert und wird bald nativ in Browsern implementiert. Es funktioniert so:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
Bretonisch
quelle
2
Werde thisSatz zu einem anderen Kontext, wenn Sie diese Methode verwenden, zum Beispiel, um bind()es zu ing thisin diesem Zusammenhang (global) in diesem Click - Handler führen kann , die mit windowals Objekt im thisGegensatz zu dem auf ein #myidReferenzelement?
alex
2
@alex du hast ganz recht. jQuery bindet das # myid-Element in seinen Ereignishandlern an 'this', und die Verwendung der bind-Methode überschreibt dies. Ich habe diesen Beitrag vor einigen Jahren geschrieben, es scheint also schwer zu sagen, was ich damals dachte. Ich gehe einfach davon aus, dass die Leute, die meine Antworten lesen, klug genug sind, um diese Details selbst herauszufinden.
Breton
12
Das ist eine sehr gefährliche Annahme.
Travis
@Travis Zum jetzigen Zeitpunkt (fast 11 Jahre nach Bretons Antwort) berichtet caniuse.com, dass Ecmascript 5 von 98,87% der Browser unterstützt wird. (siehe caniuse.com/#search=ECMAScript%205 )
Stephan
@Stephan Mein ironischer Kommentar richtete sich an @Breton für die Annahme people reading my answers are smart enough to figure these details out themselves, nicht für Ecmascript.
Travis
6

Alter Thread, aber zu Suchzwecken; Versuchen:

$(selector).on('mouseover',...);

... und überprüfen Sie den Parameter "data": http://api.jquery.com/on/

z.B:

function greet( event ) {
  alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );
dhc
quelle
4

Es gibt bereits gute Antworten, aber hier sind meine zwei Cent. Sie können auch verwenden:

$("#myid").click({arg1: "foo", arg2: "bar"}, myfunction)

Und der Hörer würde aussehen wie:

function myfunction(event){ alert(event.data.arg1); alert(event.data.arg2); }

Löwe
quelle
2

Einfach:

$(element).on("click", ["Jesikka"],  myHandler);

function myHandler(event){
   alert(event.data);     //passed in "event.data"
}
T.Todua
quelle