我最近需要附加一些數據來動態創建LI elements
。在我的第一個例子,我在某種程度上使用.data()
像
var _newli = $('<li>foobar</li>');
_newli.data('base', 'ball');
// append _newli to an `ul`
的..是非常緩慢。這個邏輯發生在一個可以容易長達500多個物品的循環中,它需要很長時間!有時甚至會打破JavaScript執行時間框架。
所以我改爲$.data()
。不知何故,將數據附加到對象上比使用.data()
方法調用時更快。所以,現在它看起來像
var _newli = $('<li>foobar</li>');
$.data(_newli[0], 'base', 'ball');
// append _newli to an `ul`
這是/的確是更快,但它仍然像花3-4秒(!)來建立我的所有元素(在我真正的代碼也有像6調用$。每個元素的數據)。
所以我真的被困住了,我問自己爲什麼要用.data()
或$.data()
呢?我可以將我的數據附加到DOM object
。所以,我沒有
var _newli = $('<li>foobar</li>');
_newli[0].base = 'ball';
// append _newli to an `ul`
瞧,哇讓我震驚,那是快得令人難以置信!我無法相信這樣做沒有任何不利之處。所以這就是我的問題實際上是什麼。目前爲止,我沒有發現這種技術的缺點。有讀取約循環引用你可以使用這種方式創建,但AFAIK「只」在IE的和只有當你參考objects
。
任何想法的專家?
更新
感謝您的好評和發佈人。簡短更新@patrick dw:
你是對的,我在使用$.data()
時通過了下墊DOM element
。它甚至沒有使用jQuery對象,至少不像預期的那樣。 關於使用一個對象並將其傳遞的想法我有我自己,但後來我又對性能差異感到震驚,於是我決定忽略像永遠那樣的.data()
方法。
如果有*「6個調用每個元素的$ .data」*,是否有一個原因,你不只是做一個調用,並傳入一個對象的值包含所有屬性想? '$ .data(_newli,'myvalues',{'base':'ball','basket':'ball','foot':'ball'});' – user113716 2010-08-04 16:47:27
約翰在一次談話中說,它很慢,並建議做'var data = $('selector')。data(); data ['foo'] ='bar'; data ['bar'] ='foo';等等,這樣你只有**一個**訪問權限。只是供參考。 – 2010-08-04 16:49:33
@jAndy - 您應該將DOM元素傳遞給'$ .data()'。不是'jQuery'對象。我想知道這是否也有性能影響。 '.data(_newli [0],'base','ball');' – user113716 2010-08-04 17:08:28