2010-02-01 14 views
24

Il jQuery .data() documentation dice il seguente:memorizzazione di una funzione di dati jQuery() Metodo

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

I assumere "qualsiasi tipo" si riferisce a funzioni. Dire che ho un div con il foo id come tale:

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

E mi piacerebbe memorizzare una funzione in esso chiamato say che prende un parametro. Secondo la documentazione che avevo memorizzare la funzione in questo modo:

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

La mia domanda è, come faccio a richiamare la funzione con un parametro quando voglio farlo.

$("#foo").data("say"); dovrebbe restituire la funzione, ma come passare un parametro ad esso?

Grazie!

risposta

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

interessante! lo proverò. Grazie! –

+11

'$ (" # pippo "). Dati (" say ") (" ciao ");' sembra funzionare pure. – Kobi

41

Una migliore alternativa per la memorizzazione di funzioni in data sta usando gli eventi personalizzati. Questo può essere fatto facilmente con on e trigger:

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

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

Esempio: http://jsfiddle.net/tW66j/

Nota: nelle versioni precedenti di jQuery (fino al 1,7), .bind è stato usato al posto di .on.

+0

+1: questo è un ottimo consiglio, ma Darin ha risposto esattamente alla mia domanda. Grazie mille. –

+0

a volte è utile. considera un caso in cui desideri un modo uniforme per recuperare i dati semanticamente associati al nodo DOM, ma l'implementazione del recupero dei dati varia a seconda del tipo di nodo. – bjornl

+0

È possibile, naturalmente, archiviare un XPath o l'oggetto nodo DOM di destinazione da recuperare, ma una funzione di callback è più estensibile e non richiede duplicazioni di oggetti nodo DOM – bjornl

4

Ecco un modo più elegante per chiamare il metodo.

// 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']); 

applicare il metodo: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

metodo di chiamata: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+1

Upvote per l'archiviazione e il richiamo di funzioni usando .data. Tuttavia, ho provato questo e quando si chiama una funzione memorizzata in questo modo '$ ('# pippo'). Dati ('bar')();' perde il suo contesto. $ (this) ora si riferisce alla DOMWindow, non $ (# pippo). La soluzione di Kobi mantiene comunque il contesto della funzione per $ (this). – noir

+0

sì, non è come tenerlo in ambito, è necessario utilizzare il metodo call o apply per mantenere l'esecuzione in ambito. –

+0

quale versione jquery è richiesta per l'attributo data() – Mou

Problemi correlati