2011-04-22 20 views
1

我在玩jQuery $.data函數,並且遇到了一些麻煩。如果我這樣做:

(function($){ 
    $.fn.testData = function() { 
     var obj = $(this); 
     obj.text($.data(obj,'test')); 
    } 
})(jQuery); 

var element = $("#test"); 
$.data(element,'test','hej'); 
element.testData(); 

這是未定義的。爲什麼?

編輯:

如果我用elem.data(key)功能,這樣它工作得很好:

(function($){ 
    $.fn.testData = function() { 
     var obj = $(this); 
     obj.text(obj.data('test')); 
    } 
})(jQuery); 

var element = $("#test"); 
element.data('test','hej'); 
element.testData(); 

,但我只看到了保羅的愛爾蘭,其聲稱elem.data是慢10倍的幻燈片比$.data(elem)http://paulirish.com/2009/perf/

+0

我認爲你是誤解了演示文稿。他意味着如果你已經有* DOM元素引用,那麼直接將它傳遞給「$ .data()」要比將其包裝在jQuery對象中並使用「.data()」方法更快。既然你包裝你的對象(「$(this)」),無論如何,你根本沒有獲得性能優勢。 – Pointy 2011-04-22 12:17:59

+0

另外,爲選定的對象調用'.data'使得你的代碼更加清晰(至少對我來說) – 2011-04-22 12:19:21

回答

2

這裏是jsFiddle:http://jsfiddle.net/TdJHq/

+0

爲什麼這麼做? – 2011-04-22 12:14:25

+0

是的,請詳細說明:) – Esben 2011-04-22 12:15:42

+2

$ .data函數的第一個參數是DOM元素,而不是jQuery對象 – alexl 2011-04-22 12:16:26

1

問題是你正在創建不同的對象來附加和檢索數據。每當你打電話給$(selector)時,你都會創建一個新的 jQuery對象,這與你將數據附加到的對象不同。

下面是一個簡單的例子:

$.data($('#test'),'test','hej'); 
alert($.data($('#test'),'test')); 

它會給你undefined

這就是爲什麼$.data期望一個DOM元素而不是一個jQuery對象。無論您如何檢索某個DOM元素,引用總是相同的。

因此,或者通過DOM元素($('#test')[0])或更好,使用$('#test').data()

1

jQuery.data(doc jQuery.data)適用於DOM元素,而不適用於jQuery元素。所以你必須提取你的jQuery選擇器下的真實元素。

obj.text($.data(obj[0],'test')); 

這是@alexl解釋的。

但也有.data()方法,即在一個jQuery選擇工作的,所以你可以使用:

// getter 
obj.text($obj.data('test')); 
// setter 
obj.text($obj.data('test','toto')); 

而且你可能混合兩種。