2010-02-01 17 views
24

olan bir işlev saklanması jQuery .data() documentation şöyle demektedir.jQuery veri() metodu

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

Ve bunun bir parametre alır say denilen bir fonksiyon kaydetmek istiyorum: Ben gibi id foo ile bir div olduğunu varsayalım. belgelerine göre ben fonksiyonunu bu şekilde saklamak istiyorum:

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

Sorum şu, ben bunu yapmak istediğinizde bir parametreyle işlev çağırmak nasıl.

$("#foo").data("say"); işlevi döndürmelidir, ancak buna nasıl bir parametre iletebilirim?

Teşekkürler!

cevap

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

ilginç! Ben bir deneyeceğim. Teşekkürler! –

+11

'$ (" # foo ") veri (" demek ") (" merhaba ");' 'de çalışıyor gibi görünüyor. – Kobi

41

özel etkinlikleri kullanıyor data yılında fonksiyonları depolamak için daha iyi bir alternatif. Bu on ve trigger ile kolay bir şekilde yapılabilir:

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

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

Örnek: http://jsfiddle.net/tW66j/

Not: (1.7 kadar) jQuery'nin önceki sürümlerinde, .bind yerine .on kullanılmıştır.

+0

+1 - bu harika bir tavsiyedir, ancak Darin sorumu tam olarak yanıtladı. Çok teşekkür ederim. –

+0

bazen yararlıdır. DOM düğümü ile semantik olarak ilişkilendirilmiş verileri almak için tek tip bir yol bulmak istediğiniz bir durum düşünün, ancak veri getirme uygulaması düğüm türüne bağlı olarak değişir. – bjornl

+0

Elbette, bir XPath veya hedef DOM düğümü nesnesinin kendisini almak için depolayabiliriz ancak bir geri çağırma işlevi daha genişletilebilir ve DOM düğüm nesnelerinin çoğaltılmasını gerektirmez – bjornl

4

Yöntemi çağırmanın daha zarif bir yolu.

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

Yöntem uygula: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

Çağrı Yöntemi: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+1

.data kullanarak fonksiyonları saklamak ve çağırmak için tekrar. Bununla birlikte, bunu denedim ve bu şekilde saklanan bir işlevi çağırdığınızda '$ (' # foo ') verisi (' bar ')(); 'bağlamını kaybeder. $ (this) şimdi DOMWindow, $ (# foo) değil. Kobi'nin çözümü, ancak fonksiyonun içeriğini $ (this) için tutar. – noir

+0

Evet, bu kapsamda tutmak için değil, yürütme kapsamını korumak için çağrı veya uygulama yöntemini kullanmanız gerekir. –

+0

data() özniteliği için jquery sürümü gereklidir – Mou