9

我正在尝试将一些“私有”数据与 DOM 元素相关联。我没有将该数据添加到 DOM 元素本身(我想避免更改 DOM 元素),而是有一个单独的数据对象,我想将其用作地图。

而不是:

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

我想要做

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

并不是所有的元素都有id字段,有些是动态创建的,所以不能用id作为key。

这对大多数元素都适用,但对于“a”元素,使用的键似乎是元素的 href,我认为是因为 DOM 为 a 元素定义了一个 toString() 函数。

这样做的结果是,如果我有两个具有相同 href 的“a”元素,它们将共享我不想要的 privateData。

我当前的解决方法是生成一个可以用作键的内部 uniqueID,但这需要我修改 DOM 元素,我试图避免这种情况。

4

1 回答 1

8

正如您所注意到的,这不能可靠地工作,如果不给每个元素一个(生成的)ID 或至少为一个新的自定义元素字段分配一个唯一的 ID,我就无法让它工作;DOM 节点根本没有必要的属性来充当地图中的键。

所以你真的有这些解决方案:

  • 为每个元素分配一个生成的 ID,除非它已经有一个
  • 将唯一 ID 分配给新的私有字段。这样,您可以将每个 DOM 节点的内存影响保持在较小的范围内,并且仍然将您的私有数据保存在不同的位置。不要忘记,当 DOM 元素被删除时,您需要以某种方式清理私有数据。
  • 使用 jQuery 之类的东西,它必须element.data()读取私有数据并将其放入 DOM 元素中
  • 使用您自己的element.privateData = {};注意,您仍然需要清理保留对元素的引用的事件处理程序,否则您将遇到意外的内存泄漏。
于 2012-11-08T16:30:13.247 回答