向DOM节点添加属性是不好的做法吗?

时间:2010-06-22 16:59:11

标签: javascript dom

JavaScript允许您向任何对象(包括DOM节点)添加任意属性和方法。假设该属性是良好的命名空间(类似于_myLib_propertyName),因此不太可能产生冲突,是否有任何充分的理由不在DOM节点中存储数据?

这样做有什么好的用例吗?

我认为这样做经常会导致编码风格或代码混乱或反直觉,但似乎有时候将“自定义”属性包含在DOM节点中将是一种有效且便捷的技术

4 个答案:

答案 0 :(得分:15)

不,在DOM节点上存储您自己的属性通常是坏主意

  • DOM节点是主机对象,主机对象可以做他们喜欢的事情。具体来说,ECMAScript规范中没有要求主机对象允许这种扩展,因此浏览器没有义务允许它。特别是,新浏览器可能会选择不这样做,依赖它的现有代码将会中断。
  • 现有浏览器中并非所有主机对象都允许。例如,IE中的文本节点和所有ActiveX对象(例如用于解析XML的XMLHttpRequest和XMLDOM对象)都没有,并且失败行为从抛出错误变为静默失败。
  • 在IE中,可以使用行document.expando = false;为整个文档(包括文档中的所有节点)关闭添加属性的功能。因此,如果页面中的任何代码包含此行,则依赖于向DOM节点添加属性的所有代码都将失败。

答案 1 :(得分:7)

我认为最重要的是,不在DOM中存储数据的最佳理由是DOM旨在表示HTML页面的内容结构和样式。虽然您可以确保以良好的命名空间方式向节点添加数据以避免冲突,但您将数据状态引入可视化表示中。

我正在尝试找到一个支持或反对在DOM中存储数据的示例,并试图找到一个令人信服的案例。在过去,我发现数据状态与视觉状态的分离在重新设计我所研究过的网站时节省了头痛。

答案 2 :(得分:2)

如果您查看HTML 5,那么您可以使用字段的数据属性来存储该字段的信息。

答案 3 :(得分:0)

不要惊讶于IE 6& 7.它们与setAttribute vs设置为属性非常不一致。

如果你不小心,你可以设置循环引用并给自己一个内存泄漏。

http://www.ibm.com/developerworks/web/library/wa-memleak/

我总是将节点属性设置为最后的手段,当我这样做时,我会非常小心我的代码,并且比平时更加​​严格地进行测试。