使用DOM元素作为javascript map的键

Joe*_*ger 6 javascript

我试图将一些"私有"数据与DOM元素相关联.而不是将该数据添加到DOM元素本身(我想避免更改DOM元素),我有一个单独的数据对象,我想用作地图.

而不是:

document.GetElementById('someElementId').privateData = {};
Run Code Online (Sandbox Code Playgroud)

我想要做

internalPrivateDataMap[document.GetElementById('someElementId')].privateData = {};
Run Code Online (Sandbox Code Playgroud)

并非所有元素都有id字段,有些是动态创建的,所以我不能使用id作为键.

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

结果是,如果我有两个具有相同href的"a"元素,它们将共享privateData,这是我不想要的.

我目前的解决方法是生成一个我可以用作键的内部唯一ID,但这需要我修改我要避免的DOM元素.

Aar*_*lla 7

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

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

  • 为每个元素分配生成的ID,除非它已经有一个
  • 为新的私有字段分配唯一ID.这样,您可以保持每个DOM节点的内存影响较小,并将您的私有数据保存在不同的位置.不要忘记在删除DOM元素时需要以某种方式清理私有数据.
  • 使用类似jQuery的东西,它必须element.data()读取私有数据并将其放入DOM元素中
  • 使用您自己的element.privateData = {};注意事项仍然需要清理事件处理程序,这些事件处理程序会保留对元素的引用,否则您将出现意外的内存泄漏.