2012-11-08 61 views
6

我想一些「私人」的數據與DOM元素相關聯。我沒有將這些數據添加到DOM元素本身(我想避免更改DOM元素),而是將一個單獨的數據對象作爲地圖使用。使用DOM元素鍵的JavaScript地圖

不是:

document.GetElementById('someElementId').privateData = {}; 

我想做

internalPrivateDataMap[document.GetElementById('someElementId')].privateData = {}; 

並不是所有的元素都有一個ID字段,還有一些是動態創建的,所以我不能使用id作爲鍵。

對大多數元素來說,這很好,但對於「a」元素,被使用的關鍵似乎是元素的href,我認爲是因爲DOM爲元素定義了toString()函數。

這樣做的結果是,如果我有兩個「一」與同HREF,他們正在共享privateData,這是我不希望的元素。

我目前的解決方法是產生內部UNIQUEID我可以作爲一個按鍵使用,但需要我來修改DOM元素,而我試圖避免的。

+0

什麼是你的問題? – Madbreaks

+1

*「這對大多數元素都適用」*它的確如此?我想你會以這種方式得到一個通用鍵'[object HTMLDivElement]'。 ...但是,是的,一個錨會將'href'作爲'.toString()'的值。 –

+2

您必須等待* ES.Next *。 * WeakMaps *將允許。 – jAndy

回答

7

正如你注意到了,這不正常,我知道有沒有辦法讓它不要麼讓每一個元素的(生成)ID或至少一個唯一的ID分配給新的自定義要素領域的工作; DOM節點根本沒有必要的屬性作爲映射中的鍵。

所以,你真的有這些解決方案留下:

  • 爲每一個元素生成的ID,除非它已經有一個
  • 分配一個唯一的ID到一個新的私有字段。這樣,您可以保持每個DOM節點的內存影響較小,並仍將您的私人數據保留在不同的位置。不要忘記,當DOM元素被刪除時,您需要以某種方式清除私有數據。
  • 使用類似的jQuery具有element.data()閱讀並把私有數據到DOM元素
  • 使用自己的element.privateData = {};請注意,您仍然需要對不斷引用的元素或你會有意想不到的內存泄漏事件處理程序清理。
+0

+1。當然,#3(jQuery的)實際上做#2(專用ID)幕後... – lonesomeday

+0

假設每個元素不能有一個ID,我只用了最後一個。迄今爲止最簡單的。 –

+1

@ user1689607:這會導致內存泄漏等問題。另外,對於同一個密鑰,您不能擁有兩個值,即如果您有兩個嘗試保存私有值的框架,則它們可能會互相干擾。 –