2010-02-01 11 views
24

El jQuery .data() documentation dice lo siguiente:Almacenamiento de una función con datos jQuery() Método

The .data() method allows us to attach data of any type to DOM element 

I asumen "cualquier tipo" se refiere a funciones. Decir que tengo un div con el ID foo como tal:

<div id="foo">Foo!</div> 

y me gustaría para almacenar una función, que se llama say que toma un parámetro. De acuerdo con la documentación que me almaceno la función de esta manera:

$("#foo").data("say", function(message){ 
    alert("Foo says "+message); 
}); 

Mi pregunta es, ¿cómo invocar la función con un parámetro cuando deseo de hacerlo.

$("#foo").data("say"); debería devolver la función, pero ¿cómo le pasaría un parámetro?

Gracias!

Respuesta

25
var myFunction = $("#foo").data("say"); 
myFunction(someParameter); 
+0

interesante! Lo probaré. ¡Gracias! –

+11

'$ (" # foo "). Data (" say ") (" hello ");' parece funcionar también. – Kobi

41

Una mejor alternativa para almacenar funciones en data está usando eventos personalizados. Esto se puede hacer fácilmente con on y trigger:

$('#foo').on('say', function(e, arg){ 
    alert('Foo says ' + arg); 
}); 

$('#foo').trigger('say', 'hello'); 

Ejemplo: http://jsfiddle.net/tW66j/

Nota: en versiones anteriores de jQuery (hasta 1,7), .bind se utilizó en lugar de .on.

+0

+1 - este es un gran consejo, pero Darin respondió mi pregunta exactamente. Muchas gracias. –

+0

a veces es útil. considere un caso en el que desee una forma uniforme de recuperar datos que estén semánticamente asociados con el nodo DOM, pero la implementación de la obtención de datos varía según el tipo de nodo. – bjornl

+0

Podríamos, por supuesto, almacenar un XPath o el objeto de nodo DOM objetivo para buscar pero una función de devolución de llamada es más extensible y no requiere duplicación de objetos de nodo DOM – bjornl

4

Aquí hay una forma más elegante de llamar al método.

// store the method with data 
$('#foo').data('bar',function(){console.log("Givin it the business!")}); 

// Simple execution (this will not keep the method in scope) 
$('#foo').data('bar')(); 

// scoped method execution with call([scope,arguments[]]), takes arguments with comma separation 
$('#foo').data('bar').call($('#foo').first()[0],'arguemnts','for','method'); 

// scoped method execution with apply(scope[,argument[]]), takes an array of arguments 
$('#foo').data('bar').apply($('#foo').first()[0],['arguemnts','for','method']); 

Aplicar Método: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

llamada de método: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+1

Votación hacia arriba para almacenar y llamar funciones usando .data. Sin embargo, probé esto y cuando llamas a una función almacenada de esta manera '$ ('# foo'). Data ('bar')();' pierde su contexto. $ (esto) ahora se refiere a DOMWindow, no $ (# foo). La solución de Kobi, sin embargo, mantiene el contexto de la función para $ (esto). – noir

+0

sí, así no es cómo mantenerlo en el alcance, tendrá que usar el método de llamada o aplicación para mantener la ejecución en el alcance. –

+0

cuya versión de jquery es necesaria para el atributo data() – Mou

Cuestiones relacionadas