2012-11-08 60 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:这会导致内存泄漏等问题。另外,对于同一个密钥,您不能拥有两个值,即如果您有两个尝试保存私有值的框架,则它们可能会互相干扰。 –