.click di jQuery - passa i parametri alla funzione utente


283

Sto cercando di chiamare una funzione con parametri usando .click di jQuery, ma non riesco a farlo funzionare.

Ecco come voglio che funzioni:

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

che chiama

function add_event(event) {
    blah blah blah }

Funziona se non uso parametri, come questo:

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

Ma devo essere in grado di passare un parametro alla mia add_eventfunzione.

Come posso fare questa cosa specifica?

So di poterlo utilizzare .click(function() { blah }, ma chiamo la add_eventfunzione da più punti e voglio farlo in questo modo.


questo è adottato dalla patricksrisposta, che penso sia un'ottima soluzione: jsfiddle.net/naRRk/1
jAndy,

Risposte:


514

Per completezza, mi sono imbattuto in un'altra soluzione che faceva parte della funzionalità introdotta nella versione 1.4.3 del gestore eventi click jQuery .

Consente di passare una mappa dati all'oggetto evento che viene automaticamente rimandato alla funzione del gestore eventi da jQuery come primo parametro. La mappa dei dati verrebbe consegnata alla .click()funzione come primo parametro, seguita dalla funzione del gestore eventi.

Ecco un po 'di codice per illustrare cosa intendo:

// 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);
}

So che è in ritardo nel gioco per questa domanda, ma le risposte precedenti mi hanno portato a questa soluzione, quindi spero che possa aiutare qualcuno prima o poi!


11
Questo è esattamente quello che volevo (allora). Da allora non ho più lavorato su questo progetto, ma penso di utilizzare 1.4.0. Questo è sicuramente il modo migliore disponibile.
Paul Hoffer,

1
Sto creando dinamicamente l'oggetto sul lato server e associando l'evento click con: r.OnClientClick = "imageClicked ({param1: '" + obj.Command + "'}); return false"; Quindi sul lato client ho: funzione imageClicked (event) {if (event.param1 == "GOTO PREVIOUS") {... Se uso event.data.param1 dice che non è definito. Ora l'ho scritto qui, posso vedere la differenza, eh!
Famiglia

1
@Famiglia - Haaha nessun problema, è bello aiutare, anche attraverso i commenti;)
Chris Kempen,

5
@totymedli - Credo che si potrebbe sempre chiamare da qualche altra parte, passando un oggetto della stessa struttura: var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);?
Chris Kempen,

1
Questo è molto meglio dell'utilizzo di attributi di dati HTML5, grazie! (E risolve JSHint lamentandosi di usare 'questo' anche nel callback!)
Matthew Herbst,

77

È necessario utilizzare una funzione anonima come questa:

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

Puoi chiamarlo come hai nell'esempio, solo un nome di funzione senza parametri, come questo:

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

Ma il add_eventmetodo non otterrà 'shot'come parametro, ma qualunque cosa clickpassi al suo callback, che è l' eventoggetto stesso ... quindi non è applicabile in questo caso , ma funziona per molti altri. Se hai bisogno di passare parametri, usa una funzione anonima ... o c'è un'altra opzione, usa .bind()e passa dati, come questo:

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

E accedervi in add_eventquesto modo:

function add_event(event) {
  //event.data.param == "shot", use as needed
}

Quando dici giusto, significa solo? In secondo luogo, ciò significa che sarei in grado di usare $ (questo) all'interno della mia funzione add_event come farei normalmente all'interno della funzione anonima?
Paul Hoffer,

2
@phoffer - Sì, "solo" significa nessun parametro, solo il nome della funzione, è un riferimento alla funzione, non il risultato dell'esecuzione della funzione che si desidera assegnare al clickgestore. Nel metodo anonimo ed .bind()esempi sopra che puoi usare this, farà riferimento a quello su cui .loadtoscorehai fatto clic (come ti aspetteresti). Nell'ultimo esempio, dentro add_event(event)lo stesso è vero, usa thiso $(this)e sarà quello che vuoi.
Nick Craver

1
@phoffer: dovresti passare l'elemento in modo esplicito per usarlo, ad esempio: function(){ add_event('shot', $(this));}e function add_event(event, element){...}. elementsarebbe un elemento jQuery qui (funziona bind()anche se come Nick ha citato).
Felix Kling,

@Felix - Può anche usare $(this)all'interno della funzione, ad esempio: jsfiddle.net/tSu5t
Nick Craver

35

Se lo chiami come l'hai avuto ...

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

... dovresti avere add_event()una funzione di ritorno, come ...

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

La funzione viene restituita e utilizzata come argomento per .click().


@jAndy - Grazie per aver pubblicato l'esempio includendo il eventparametro. Avrei dovuto includerlo. : o)
user113716

27

Ho avuto successo usando .on () in questo modo:

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

Quindi all'interno della add_eventfunzione puoi accedere a 'shot' in questo modo:

event.data.event_type

Vedere la documentazione .on () per ulteriori informazioni, dove forniscono il seguente esempio:

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

11

Sì, questo è un vecchio post. Indipendentemente da ciò, qualcuno potrebbe trovarlo utile. Ecco un altro modo per inviare parametri ai gestori di eventi.

//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});

6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

Imposta l'oggetto javaScript sull'elemento onclick:

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

ottenere l'oggetto da "questo" elemento:

 var $p = $(this).data('self');

Eccezionale! Purtroppo, questa è l'unica cosa che funziona quando provo ad usare le variabili jquery! non ho idea del perché. : |
Cregox,

3

Ottengo la soluzione semplice:

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

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

La mia media è che passa l' onclickevento value aljavascript function sendData() , inizializza alla variabile e lo prende con il metodo del gestore eventi jquery.

Questo è possibile sin dall'inizio sendData(valueid) viene chiamato e inizializza il valore. Quindi dopo l'evento jquery viene eseguito e usa quel valore.

Questa è la soluzione semplice e per la soluzione For Detail vai qui .


Non vedo un modo per passare parametri dinamici qui, solo valori hardcoded.
user1451111

in questo modo si passa solo valueId e si perde l'elemento e gli oggetti evento.
Zoltán Süle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.