2012-03-04 176 views
3

可能重複:
How does jQuery .data() work?.data()在哪裏存儲值?

在jQuery中,.data讀取HTML5 data-*屬性的值,但是當你設置與data功能/更新的值,它不會改變屬性。

​<div id="first" data-foo="attr value" >​​​​​​​​​​​​​​​​​​​​​​​​​​​ </div> 

var attr = $('#first').data('foo'); 
alert(attr); // alerts: attr value 

$('#first').data('foo', 'data value'); 
var data = $('#first').data('foo'); 
alert(data); //alerts: data value 

var attrAgain = $('#first').attr('data-foo'); 
alert(attrAgain);​ // alerts: attr value 

jsFiddle

哪裏jQuery的存儲值是多少?在這篇文檔中它是這樣寫的:

數據屬性在第一次訪問數據屬性時被拉出來,然後不再被訪問或變異(所有的數據值被內部存儲在jQuery中)。

但是在哪裏?我試圖瞭解使用.data函數是多麼昂貴。
如何在沒有.data函數的情況下達到這些值?

+1

'data'讀取'data- *'屬性只是一個附加功能。早在那之前它就被用來爲任意數據分配元素。 – 2012-03-04 12:27:14

+1

*「我試圖理解使用.data函數是多麼昂貴。」*肯定比獲取/設置屬性更昂貴。它需要讀取元素的序列號,然後查找存儲在'jQuery.cache'中的序列號的數據。如果您需要在相同的立即代碼中重複訪問,可以通過執行'var d = $(myElem).data()'來直接引用關聯的數據,然後像對待正常一樣讀取/寫入對象的屬性。此外,使用['$ .data(myElem)'](http://api.jquery.com/jquery.data/)更快一些,因爲它不會創建jQuery對象。 – 2012-03-04 13:48:10

回答

3

jQuery有一個內部 - 你不能立即訪問存儲空間。如果您需要更新數據屬性,請查看Making jQuery.data() selector aware

jQuery使用該內部儲存空間(只是一個javascript對象,順便說一句。),原因有二:

  1. 繞過訪問DOM用於.data()
  2. 數據的屬性每次調用可能只包含串/ INT所以.data('foo', {bar:"baz"})將無法​​正常工作,你會根據data module of jQuery 1.7.1預計jQuery.cache

的jQuery存儲這些背景信息。