2011-09-28 24 views
1

Relevant discussion爲DOM元素引用創建一個恆定時間數據結構

我知道我可以建立一個元素/節點的引用數組。我也意識到,我可以使用像堆一樣處理數組的巧妙技巧(使用子索引2n2n+1)來構建使用它的(可能是浪費的)二叉搜索樹。

但所有這些仍然不足以滿足我早期的優化器。此外,實施BST將容易出錯。

這是我的問題。我可以以某種方式使用元素引用作爲JavaScript的哈希值(它是對象,反之亦然?)的索引。如果沒有,我可以從元素引用中調出一個唯一的字符串,然後我可以使用它作爲我的散列鍵?如果沒有,jQuery怎麼做呢?

+0

你想達到什麼目的?從DOM節點到您自己的數據結構的快速查找?如果是這樣,您可以隨時將自定義屬性附加到節點對象。 –

+0

@AtesGoral,你是正確的,這是我想要實現的。我沒有意識到屬性和屬性之間的差異。在給定節點上編輯屬性是否會在該節點的整個生命週期中保持不變(就像它在文檔中一樣)? –

+0

我不是100%確定的,但是特定DOM節點的屬性應該在該節點的生命週期中持續存在。我不知道在某些瀏覽器上是否有特殊情況導致將新的JS對象分配給現有的DOM節點... –

回答

1

最簡單的方法是隻使用自己的屬性的DOM對象:

var element = document.getElementById("test"); 
element.myData = "whatever"; 

這裏的背後jQuery的.data()功能是如何工作的,你可以在自己的純JavaScript中使用的總體思路。它在對象上使用一個自定義屬性,然後將其他所有內容存儲在由該自定義屬性的值索引的數據結構中。

var idCntr = 0; // global cntr 

var data = {}; 
var element = document.getElementById("test"); 
var id = element.uniqueID; 
if (!id) { 
    id = idCntr++ + ""; 
    element.uniqueID = id; 
} 
data[id] = "whatever"; 


// then some time later, you can do this 
var element = document.getElementById("test"); 
console.log(data[element.uniqueID]); // whatever 

這是一個有點更多地參與到存儲多個屬性在數據對象給定對象,但這是一般的想法。

而且,如果你可以使用jQuery,這是微不足道的:

$("#test").data("myData", "whatever"); // sets the data 

console.log($("#test").data("myData")); // retrieves the data 

如果你想真正看到jQuery的.data()作品中,您可以通過第一次調用步驟來設置數據,然後使用時檢索未定義的jQuery。很容易看到它的作用。

相關問題