有没有一种方法将JavaScript对象附加到HTML元素?

use*_*741 94 javascript dom

我想将JavaScript对象与HTML元素相关联.有一个简单的方法吗?

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

细节(虽然我最感兴趣的是一般问题):

具体来说,我有表示树中节点的HTML元素,我正在尝试启用拖放,但jQuery drop事件只会给我拖放的元素.

获取事件处理程序信息的常规模式似乎是在创建JavaScript对象的同时创建HTML元素,然后通过关闭这些JavaScript对象来定义事件处理程序 - 但是这在此方面不能很好地工作case(我可以有一个全局对象,当一个拖动开始时会被填充......但这感觉有点讨厌).

bob*_*nce 100

JavaScript对象可以分配给它们的任意属性,你不需要做任何特殊的事情来允许它.这包括DOM元素; 虽然这种行为不是DOM标准的一部分,但它的情况可以追溯到JavaScript的第一个版本并且完全可靠.

var div= document.getElementById('nav');
div.potato= ['lemons', 3];
Run Code Online (Sandbox Code Playgroud)

  • @Tim Down:然后就是不要这样做.我不明白为什么它不可靠 - 这就像说String对象不可靠,因为你可以将它设置为null. (36认同)
  • 根据我的经验,这可能是坏的原因是可能的内存泄漏.可能有一种简单的方法可以避免它,但是当我设计一个使用它的设计时,它有很多内存泄漏.我认为你必须格外小心,因为如果从页面中删除元素,则不会为您处理引用计数(未清理),反之亦然. (7认同)
  • 公平警告:我很高兴地做了答案所描述的内容,但我使用的是"范围"而不是字段名称"马铃薯".结果"范围"是表格单元格元素的属性(`<td>`),我分配给该字段的对象是#toString'ed.看到td.scope ==='[object Object]',我感到非常困惑. (6认同)
  • @TimDown:但是也不会设置`document.expando = false` break [jQuery.data](http://api.jquery.com/jQuery.data/)? (5认同)
  • @ tat.wright - 他所说的HTML元素的任意属性称为Expando属性.另请注意,div.potato并不意味着div.getAttribute("potato") (4认同)
  • @eselk:这是一个IE问题,已在[IE8(!)]中修复(http://msdn.microsoft.com/en-us/library/dd361842(v = vs.85).aspx)因此不太可能再次影响你了; 当然,除非你仍然支持IE7.还要注意,即使在IE7中你也是相当安全的,因为泄漏是每页的,所以除非你不断创建新对象并且页面打开很长时间,否则这不会失控. (3认同)
  • 它完全不可靠.例如,在IE中调用`document.expando = false`会阻止文档中HTML元素的所有expando属性. (2认同)
  • `var cloned = div.cloneNode()` 使 `potato` 在 `cloned` 上消失,而其他本机属性确实被克隆。 (2认同)

Phi*_*ler 43

你看过jQuery data()方法了吗?如果需要,可以将复杂对象分配给元素,或者您可以利用该方法至少保存对对象(或其他一些数据)的引用.

  • 谢谢:这几乎就是我想要的.有趣的是,为了定义这个方法,jquery将密钥存储在每个元素的字符串属性中的全局字典中.首次加载jquery时,将随机生成此字符串属性的名称.(建议没有好的方法可以做到这一点,只有使用DOM才能做到这一点) (8认同)
  • 值得注意的是jQuery的`data()`*通过使用[answer bobince give](http://stackoverflow.com/a/1402782/42921)来工作*所以如果你还没有使用jquery,那么你也可以这么做用那个. (5认同)
  • 有趣的是,我可以在6年后回顾这个答案并认为,"这是一个非常不理想的答案.@bobince应该有接受的答案". (5认同)
  • 这个问题中没有jQuery标记. (5认同)