.click von jQuery - Parameter an Benutzerfunktion übergeben

283

Ich versuche, eine Funktion mit Parametern mit jQuerys .click aufzurufen, aber ich kann sie nicht zum Laufen bringen.

So soll es funktionieren:

$('.leadtoscore').click(add_event('shot'));

was anruft

function add_event(event) {
    blah blah blah }

Es funktioniert, wenn ich keine Parameter wie diese verwende:

$('.leadtoscore').click(add_event);
function add_event() {
    blah blah blah }

Aber ich muss in der Lage sein, einen Parameter an meine add_eventFunktion weiterzugeben .

Wie kann ich diese spezielle Sache machen?

Ich weiß, dass ich verwenden kann .click(function() { blah }, aber ich rufe die add_eventFunktion von mehreren Stellen aus auf und möchte dies auf diese Weise tun.

Paul Hoffer
quelle
Dies wird aus der patricksAntwort übernommen, was ich für eine großartige Lösung halte
jAndy

Antworten:

514

Aus Gründen der Gründlichkeit bin ich auf eine andere Lösung gestoßen, die Teil der in Version 1.4.3 des jQuery-Klickereignishandlers eingeführten Funktionalität war .

Sie können eine Datenzuordnung an das Ereignisobjekt übergeben, die von jQuery als erstem Parameter automatisch an die Ereignishandlerfunktion zurückgemeldet wird. Die Datenzuordnung wird .click()als erster Parameter an die Funktion übergeben , gefolgt von der Ereignishandlerfunktion.

Hier ist ein Code, um zu veranschaulichen, was ich meine:

// say your selector and click handler looks something like this...
$("some selector").click({param1: "Hello", param2: "World"}, cool_function);

// in your function, just grab the event object and go crazy...
function cool_function(event){
    alert(event.data.param1);
    alert(event.data.param2);
}

Ich weiß, dass es für diese Frage spät im Spiel ist, aber die vorherigen Antworten haben mich zu dieser Lösung geführt, also hoffe ich, dass sie irgendwann jemandem hilft!

Chris Kempen
quelle
11
Genau das wollte ich (damals). Ich habe seitdem nicht mehr an diesem Projekt gearbeitet, aber ich glaube, ich habe 1.4.0 verwendet. Dies ist definitiv der beste verfügbare Weg.
Paul Hoffer
1
Ich erstelle das Objekt dynamisch auf der Serverseite und binde das Klickereignis mit: r.OnClientClick = "imageClicked ({param1: '" + obj.Command + "'}); return false"; Dann habe ich auf der Client-Seite: function imageClicked (event) {if (event.param1 == "GOTO PREVIOUS") {... Wenn ich event.data.param1 verwende, heißt es, dass es undefiniert ist. Jetzt habe ich es hier abgetippt, ich kann den Unterschied sehen, d'oh!
Familie
1
@ Familie - Haaha kein Problem, es ist schön zu helfen, auch durch Kommentare;)
Chris Kempen
5
@totymedli - Ich denke, Sie könnten es immer woanders nennen und ein Objekt mit der gleichen Struktur übergeben : var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);?
Chris Kempen
1
Das ist so viel besser als die Verwendung von HTML5-Datenattributen, danke! (Und löst JSHint, der sich darüber beschwert, "dies" auch im Rückruf zu verwenden!)
Matthew Herbst
77

Sie müssen eine anonyme Funktion wie diese verwenden:

$('.leadtoscore').click(function() {
  add_event('shot')
});

Sie können es wie im Beispiel aufrufen, nur einen Funktionsnamen ohne Parameter, wie folgt:

$('.leadtoscore').click(add_event);

Aber die add_eventMethode wird nicht 'shot'als Parameter erhalten, sondern was auch immer clickan ihren Rückruf übergeben wird, das ist das eventObjekt selbst ... also ist sie in diesem Fall nicht anwendbar , funktioniert aber für viele andere. Wenn Sie Parameter übergeben müssen, verwenden Sie eine anonyme Funktion ... oder verwenden Sie eine andere Option: Verwenden .bind()und übergeben Sie Daten wie folgt:

$('.leadtoscore').bind('click', { param: 'shot' }, add_event);

Und greifen Sie add_eventwie folgt darauf zu:

function add_event(event) {
  //event.data.param == "shot", use as needed
}
Nick Craver
quelle
Wenn Sie nur sagen, bedeutet das nur? Zweitens bedeutet das, dass ich $ (this) in meiner Funktion add_event verwenden kann, wie ich es normalerweise in der anonymen Funktion tun würde?
Paul Hoffer
2
@phoffer - Ja, "nur" bedeutet keine Parameter, nur den Funktionsnamen. Es ist ein Verweis auf die Funktion, nicht das Ergebnis der Ausführung der Funktion, die Sie dem clickHandler zuweisen möchten . In der anonymen Methode und den .bind()obigen Beispielen, die Sie verwenden können this, bezieht sie sich auf die, auf die .loadtoscoreSie geklickt haben (wie Sie es erwarten würden). Im letzten Beispiel ist im Inneren add_event(event)wahr, verwenden Sie thisoder $(this)und es wird das sein, was Sie wollen.
Nick Craver
1
@phoffer: Sie müssten das Element explizit übergeben, um es zu verwenden, zB: function(){ add_event('shot', $(this));}und function add_event(event, element){...}. elementwäre hier ein jQuery-Element (es funktioniert bind()jedoch, wie Nick erwähnt hat).
Felix Kling
@ Felix - Er kann auch $(this)innerhalb der Funktion verwenden, zum Beispiel: jsfiddle.net/tSu5t
Nick Craver
35

Wenn Sie es so nennen, wie Sie es hatten ...

$('.leadtoscore').click(add_event('shot'));

... Sie müssten add_event()eine Funktion zurückgeben, wie ...

function add_event(param) {
    return function() {
                // your code that does something with param
                alert( param );
           };
}

Die Funktion wird zurückgegeben und als Argument für verwendet .click().

user113716
quelle
@jAndy - Vielen Dank, dass Sie das Beispiel mit dem eventParameter veröffentlicht haben. Ich hätte es aufnehmen sollen. : o)
user113716
27

Ich hatte Erfolg mit .on () wie folgt:

$('.leadtoscore').on('click', {event_type: 'shot'}, add_event);

Dann erhalten Sie innerhalb der add_eventFunktion Zugriff auf "Schuss" wie folgt:

event.data.event_type

Siehe die .on () Dokumentation für weitere Informationen, wo sie das folgende Beispiel liefern:

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );
Schwerkraftgrab
quelle
11

Ja, das ist ein alter Beitrag. Unabhängig davon kann es jemand nützlich finden. Hier ist eine andere Möglichkeit, Parameter an Ereignishandler zu senden.

//click handler
function add_event(event, paramA, paramB)
{
    //do something with your parameters
    alert(paramA ? 'paramA:' + paramA : '' + paramB ? '  paramB:' + paramB : '');
}

//bind handler to click event
$('.leadtoscore').click(add_event);
...
//once you've processed some data and know your parameters, trigger a click event.
//In this case, we will send 'myfirst' and 'mysecond' as parameters
$('.leadtoscore').trigger('click', {'myfirst', 'mysecond'});

//or use variables
var a = 'first',
    b = 'second';

$('.leadtoscore').trigger('click', {a, b});
$('.leadtoscore').trigger('click', {a});
Kevin
quelle
6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

Setzen Sie das JavaScript-Objekt auf onclick element:

 $imgReload.data('self', $self);

Objekt von "diesem" Element abrufen:

 var $p = $(this).data('self');
Vladimir Novick
quelle
Genial! Leider ist dies das einzige, was funktioniert, wenn ich versuche, jquery-Variablen zu verwenden! Keine Ahnung warum. : |
Cregox
3

Ich bekomme die einfache Lösung:

 <button id="btn1" onclick="sendData(20)">ClickMe</button>

<script>
   var id; // global variable
   function sendData(valueId){
     id = valueId;
   }
   $("#btn1").click(function(){
        alert(id);
     });
</script>

Mein Mittelwert ist, dass das Wertereignis onclickan das übergeben wirdjavascript function sendData() Initialisieren auf die Variable , und nehmen Sie von der jquery Event - Handler - Methode.

Dies ist da zunächst möglich sendData(valueid) der Wert aufgerufen und initialisiert wird. Dann wird nach dem jquery-Ereignis ausgeführt und dieser Wert verwendet.

Dies ist die einfache Lösung, und die Lösung für Details finden Sie hier .

susan097
quelle
Ich sehe hier keine Möglichkeit, dynamische Parameter zu übergeben, nur fest codierte Werte.
user1451111
Auf diese Weise übergeben Sie nur die valueId und verlieren das Element und die Ereignisobjekte.
Zoltán Süle