有没有将JavaScript对象附加到HTML元素的好方法?


96

我想将JavaScript对象与HTML元素相关联。有没有简单的方法可以做到这一点?

我注意到HTML DOM定义了setAttribute方法,它看起来像是为任意属性名称定义的。但是,这只能设置字符串值。(您当然可以使用它来将密钥存储到字典中。)

细节(尽管我对一般问题最感兴趣):

具体来说,我有HTML元素表示一棵树中的节点,并且试图启用拖放功能,但是jQuery drop事件只会让我拖放元素。

向事件处理程序获取信息的正常模式似乎是在创建JavaScript对象的同时创建HTML元素,然后通过关闭这些JavaScript对象来定义事件处理程序-但这在此方面效果不佳情况(我可能有一个全局对象,当拖动开始时会填充它……但是感觉有点讨厌)。

Answers:


44

您是否看过jQuery data()方法?您可以根据需要将复杂对象分配给元素,也可以利用该方法至少保留对对象(或其他数据)的引用。


8
谢谢:这几乎是我想要的。有趣的是,定义此方法时,jquery将键存储在每个元素的字符串属性中的全局字典中。首次加载jquery时,将随机生成此字符串属性的名称。(建议没有一种好的方法,没有一种更好的方法仅使用DOM来做到这一点)
user47741 2009年

6
值得注意的是,jQuery的data() 工作原理是使用bobince给出答案, 因此,如果您还没有使用jquery,则最好使用它。
Eamon Nerbonne 2014年

6
有趣的是,六年后我如何回顾这个答案,然后想到:“这是次优选择。@ bobince应该有一个被接受的答案”。
Phil.Wheeler

6
这个问题没有jQuery标记。
米哈尔Perłakowski

111

JavaScript对象可以分配有任意属性,您无需做任何特殊操作即可允许它。这包括DOM元素;尽管此行为不是DOM标准的一部分,但可以追溯到JavaScript的第一个版本,并且完全可靠。

var div= document.getElementById('nav');
div.potato= ['lemons', 3];

5
@ tat.wright-他所说的HTML元素上的任意属性称为Expando属性。另请注意,div.potato并不意味着div.getAttribute(“ potato”)
nickytonline

36
@Tim Down:那就别做。我看不到为什么它不可靠-就像说String对象不可靠,因为您可以将其设置为null。
simon

5
@TimDown:但是也不会设置document.expando = false中断jQuery.data吗?
乔伊·亚当斯

8
根据我的经验,这可能很糟糕的原因是可能的内存泄漏。可能有一种简单的方法来避免这种情况,但是当我进行大量使用这种设计的情况时,会发生很多内存泄漏。我认为您必须格外小心,因为如果从页面中删除了该元素,则不会为您处理(不清理)引用计数,反之亦然。
eselk

7
合理的警告:我很乐意按照答案的描述进行操作,但是我使用的是“范围”而不是字段名称“马铃薯”。原来,“作用域”是表格单元元素(<td>)的属性,而我分配给该字段的对象是#toString'ed。看到td.scope ==='[object Object]',我感到非常困惑。
David Groomes,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.