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

jas*_*own 18 javascript dom

JavaScript允许您向任何对象(包括DOM节点)添加任意属性和方法.假设该属性很好地命名空间(类似_myLib_propertyName),以便不会产生冲突,有没有充分的理由不在DOM节点中存储数据?

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

我想这样做经常会导致一种混乱的编码风格或代码混乱或反直觉,但似乎有时候将"自定义"属性塞入DOM节点将是一种有效且便捷的技术.

Tim*_*own 16

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

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

  • 对于数字 1) 浏览器开发人员不希望打破思维。尤其是在竞争如此激烈的市场中。我不认为他们会破坏主机对象扩展。第 2 点和第 3 点不再是问题,因为 IE 从 2020 年起就已过时。 (2认同)

Rob*_*Hui 7

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

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

  • 这里有一篇关于扩展DOM的帖子:http://perfectionkills.com/whats-wrong-with-extending-the-dom/ (3认同)