2010-07-17 15 views
233

Estoy tratando de llamar a una función con parámetros usando jQuery's .click, pero no puedo hacer que funcione.jQuery's .click - pase los parámetros a la función de usuario

Así es como yo quiero que funcione:

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

que llama a

function add_event(event) { 
    blah blah blah } 

Funciona si yo no uso parámetros, así:

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

Pero necesito poder pasar un parámetro a mi func add_event ción.

¿Cómo puedo hacer esto específico?

Sé que puedo usar .click(function() { blah }, pero llamo a la función add_event desde varios lugares y quiero hacerlo de esta manera.

+0

esto se adoptó a partir de la respuesta 'patricks', que creo que es una gran solución: http://www.jsfiddle.net/naRRk/1/ – jAndy

Respuesta

419

por la minuciosidad, me encontré con otra solución que formaba parte de la funcionalidad introducida en la versión 1.4.3 del jQuery click event handler.

Se le permite pasar un mapa de datos al objeto de evento que automáticamente se realimenta a la función del controlador de eventos es jQuery como primer parámetro. El mapa de datos se entregará a la función .click() como primer parámetro, seguido de la función del controlador de eventos.

Aquí hay algo de código para ilustrar lo que quiero decir:

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

Sé que es tarde en el juego para esta pregunta, pero las respuestas anteriores me llevó a esta solución, así que espero que ayude a alguien en algún momento!

+11

Esto es exactamente lo que quería (en aquel entonces). No he trabajado en este proyecto desde entonces, pero creo que estaba usando 1.4.0. Esta es definitivamente la mejor manera disponible. –

+0

Para mí, tuve que eliminar la parte de datos, p. alerta (evento.param1); Estoy usando jquery 1.10.2, ¿tal vez han cambiado algo? – Family

+0

@Family - ¿Puedo preguntar dónde encontraste jQuery v1.10.x? Parece que no puedo encontrar una descarga para él/cualquier documentación relacionada ... –

69

Es necesario utilizar una función anónima como esto:

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

se le puede llamar como que tiene en el ejemplo, sólo un nombre de función sin parámetros, así:

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

Pero el método add_event no obtendrá 'shot' como su parámetro, sino más bien lo que click pase a su devolución de llamada, que es el objeto event en sí ... así que no es ap plicable en este caso, pero funciona para muchos otros. Si necesita pasar parámetros, utilizar una función anónima ... o, hay una otra opción, utilice .bind() y pasar los datos, así:

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

y acceder a ella en add_event, así:

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

Cuando dices simplemente, ¿eso solo significa? En segundo lugar, ¿significa eso que podría usar $ (esto) dentro de mi función add_event como lo haría normalmente dentro de la función anónima? –

+2

@phoffer - Sí, "solo" significa sin parámetros, * solo * el nombre de la función, es una referencia a la función, no el resultado de ejecutar la función que desea asignar al manejador 'click'. En el método anónimo y en los ejemplos '.bind()' de arriba puede usar 'this', se referirá al' .loadtoscore' en el que hizo clic (como era de esperar). En el último ejemplo, dentro de 'add_event (event)' lo mismo es cierto, use 'this' or' $ (this) 'y será lo que desee. –

+1

@phoffer: Tendría que pasar el elemento explícitamente para usarlo, por ejemplo: 'function() {add_event ('shot', $ (this));}' y 'function add_event (event, element) {. ..} '. 'element' sería un elemento jQuery aquí (funciona con' bind() 'aunque como mencionó Nick). –

29

Si llama de la manera que lo tenías ...

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

... que tendría que tener add_event() ret urna una función, como ...

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

La función se devuelve y se utiliza como argumento para .click().

+3

+1, buena. ejemplo de trabajo http://www.jsfiddle.net/naRRk/ – jAndy

+0

@jAndy - Gracias por publicar el ejemplo que incluye el parámetro 'event'. Debería haberlo incluido. : o) – user113716

+0

http://www.jsfiddle.net/naRRk/1/ solo aclarar las cosas – jAndy

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

Conjunto javaScript objeto de elemento onclick:

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

obtener el objeto de "este" elemento:

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

¡Impresionante! Tristemente, ¡esto es lo único que funciona cuando trato de usar las variables de jquery! ni idea por qué : | – cregox

6

Sí, esto es un antiguo puesto. De todos modos, alguien puede encontrarlo útil. Aquí hay otra forma de enviar parámetros a los manejadores de eventos.

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

que tuvieron éxito en el uso .en(), así:

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

A continuación, dentro de la función add_event, tendrá acceso a 'tiro' de esta manera:

event.data.event_type 

Véase el .on() documentation para obtener más información, donde proporcionan el siguiente ejemplo:

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