将DOM节点链接到(浏览器内)域对象的选项:直接引用是否可以?

时间:2013-05-28 01:57:09

标签: javascript dom

对于单页面应用程序:我希望每个DOM节点都能引用一个(浏览器内)域对象。可以只存储这样的直接引用:

var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.domain_object = myDomainObject;

这是安全的,可重复的吗?浏览器可以通过附加的JavaScript属性执行神秘的操作吗?

感谢。

3 个答案:

答案 0 :(得分:2)

我之前已经完成了存储自定义事件的工作,并且它在我尝试过的每个浏览器中都能正常工作但是,我说,这是危险的,只有在没有其他选择的情况下,你必须传递此信息 / em>元素。

至少,理想情况下,创建自己的命名空间以不污染已污染的对象:

var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.My = {};
DOMNode.My.domain_object = myDomainObject;

修改:想了解常规div可能有多少方法和属性,而且它有136个(在Chrome中)。 http://jsbin.com/abecaq/1/edit

答案 1 :(得分:2)

从经验的角度来看:我已经将数据直接附加到节点而没有问题,从来没有出现过问题。从规范的角度来看,我的解释是,不一定建议这样做,但在自定义属性不与其他任何内容冲突的情况下是安全的。

Common Infrastructure - Extensibility中,对作者的建议(就是你)只使用[data- *]属性:

  

作者可以包含内联客户端脚本或服务器端的数据   使用数据处理的站点范围脚本 - * =“”属性。这些是   保证永远不会被浏览器触及,并允许脚本   包括脚本随后可以查找的HTML元素的数据   过程

对有效用户代理的要求是在DOM中无法识别任何内容。

  

用户代理必须处理他们没有的元素和属性   理解为语义中立;将它们留在DOM中(对于DOM   处理器),并根据CSS(对于CSS处理器)设置样式,   但并没有从中推断出任何意义。

因此,我的建议与W3C避免冲突的目的一致,就是创建引用 DOM元素的对象。但是,如果你“必须”在DOM上标记奇怪的东西,请放心,用户代理需要将其留在那里。但如果你真的必须,那么使用那些data-*属性可能是明智的!

(我个人不会使用它们,而是倾向于将对象和值打到当时最方便的地方。但是,我可能会被大约15年的黑客攻击和“特征检测”因为不遵守用户代理。即使是现在,我认为IE不支持data-*标准......)

答案 2 :(得分:0)

虽然它不会在小型网站上造成任何问题,但我会因为某些原因而避免这样做......

  1. 通过链接对许多不同JS对象的引用来打开内存泄漏
  2. 任何新的DOM节点都必须附加此链接
  3. 我建议使用全局变量或理想情况下在必要时可以引用的最高必要范围内的变量。