2011-02-04 6 views
36

Estoy usando jQuery versión 1.5. estoy mirando change() función de jQuery y específicamente a este bit:Cómo usar una función que toma argumentos con el método change() de jQuery?

.change([ eventData ], handler(eventObject)) 
eventData: A map of data that will be passed to the event handler. 
handler(eventObject): A function to execute each time the event is triggered. 

¿Qué es exactamente un "mapa de datos" en JavaScript? ¿Cómo puedo usar la siguiente función de prueba como controlador de eventos?

var myHandler = function(msg){alert(msg);}; 

He intentado esto:

$("select#test").change(["ok"], myHandler); 

y el informes de alerta [object Object]

Respuesta

56

Ver event.data. Los datos no se pasa como argumento al manejador, sino como propiedad del objeto de evento:

$("select#test").change({msg: "ok"}, function(event) { 
    alert(event.data.msg); 
}); 

El manejador siempre sólo acepta un argumento, que es el objeto event. Esta es la razón por la cual su alerta muestra "[object Object]", su función es imprimir el objeto del evento.
Si desea utilizar funciones con argumentos personalizados, hay que envolverlos en otra función:

$("select#test").change({msg: "ok"}, function(event) { 
    myHandler(event.data.msg); 
}); 

o simplemente

$("select#test").change(function(event) { 
    myHandler("ok"); 
}); 

BTW. el selector está mejor escrito como $('#test'). Los ID son (deberían ser) únicos. No es necesario preceder el nombre de la etiqueta.

+0

Una cosa a tener en cuenta acerca de esto es que el $ (esto) que myHandler recibe es diferente cuando se lo llama de esta manera.Si necesita su $ original (esto), podría pasarlo como parámetro después de "ok". –

13

¿Qué es exactamente un "mapa de datos" en Javascript?

Básicamente, sólo un objeto, por ejemplo .:

var data = { 
    foo: "I'm foo", 
    bar: "I'm bar" 
}; 

Todos los objetos de JavaScript son esencialmente mapas (también conocido como "diccionarios" también conocido como "arrays asociativos").

¿Cómo puedo utilizar la siguiente función de prueba como controlador de eventos?

envolviéndolo en otra función:

$("select#test").change(function() { 
    myHandler($(this).val()); 
}); 

que llama myHandler con el valor del cuadro de selección cada vez que cambia.

Si desea utilizar la parte eventData, añadir un objeto antes de que el manejador:

$("select#test").change({ 
    foo: "I'm foo" 
}, function(event) { 
    myHandler(event.data.foo, $(this).val()); 
}); 

que llama myHandler con el "foo estoy" como primer argumento, entonces el valor del selectivo caja, siempre que cambie.

Cuestiones relacionadas