【问题标题】:Can I store a non-text property in a DOM node in Javascript我可以在 Javascript 的 DOM 节点中存储非文本属性吗
【发布时间】:2015-01-04 23:51:18
【问题描述】:

我想将 Javascript 中的对象存储在 DOM 节点的自定义属性中。我试过 setAttribute/getAttribute,但他们将属性转换为文本。

假设我已经完成了

node = document.getElementById( 'SAMPLE' );
object = { test: function( ){ stuff; } };

这在我测试过的任何地方都不起作用

node.setAttribute( 'info', object );
val = node.getAttribute( 'info' ) ;

因为它给 val 留下一个字符串值。

如果我这样做

node[ 'info' ] = object;

然后

val = node[ 'info' ];

稍后在我的脚本中归还我的对象。

这可以在 HTML5 之前的浏览器(如旧 IE)中工作吗?安全吗?

【问题讨论】:

  • 您可以将其作为属性“附加”,但通常您应该不理会主机对象,仅通过其发布的 API 使用它们。
  • 只有一个问题.. 为什么?
  • 只要您使用合理的防碰撞名称就没有问题,尤其是在您仅存储原始数据时。如果您要存储对象,尤其是保存函数的对象,您可以创建一个循环引用,旧的 IE 可能难以检测到,从而导致内存泄漏。
  • 我正在尝试使程序全球免费。也许不是最好的主意?这是关于内存泄漏的一个很好的警告。我会更深入地研究这个问题。

标签: javascript dom setattribute getattribute


【解决方案1】:

您可以将其“附加”为属性,但这不是一个好主意。 – 罗布格

所以,这是我对替代方案的建议:

  1. 生成一个唯一的字符串 - 简单的方法可能是Date.now().toString(),除非您在循环或其他方式中生成它们。在这里使用最有效的方法。

  2. 有一个全局对象,比如domdata = {};

  3. 分配domdata[unique_string] = your_data_here;

  4. 保存node.setAttribute("data-dom-id",unique_string);

您现在可以通过以下方式检索数据:

  1. 获取unique_string = node.getAttribute("data-dom-id");

  2. 检索domdata[unique_string]

完成! :)

【讨论】: