对于单页应用程序:我希望我的每个 DOM 节点都具有对单个(浏览器内)域对象的引用。像这样存储直接引用是否可以:
var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.domain_object = myDomainObject;
这是安全的,可重复的吗?浏览器可以通过附加的 JavaScript 属性做一些神秘的事情吗?
谢谢。
对于单页应用程序:我希望我的每个 DOM 节点都具有对单个(浏览器内)域对象的引用。像这样存储直接引用是否可以:
var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.domain_object = myDomainObject;
这是安全的,可重复的吗?浏览器可以通过附加的 JavaScript 属性做一些神秘的事情吗?
谢谢。
我以前做过存储自定义事件,它在我尝试过的每个浏览器中都可以正常工作,但是是的,我想说这很危险,只有在没有其他选择并且您必须将此信息与元素一起传递的情况下。
至少,理想情况下,创建自己的命名空间不会污染已经污染的对象:
var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.My = {};
DOMNode.My.domain_object = myDomainObject;
编辑:div
只是想看看一个常规可能有多少方法和属性,它有 136 个(在 Chrome 中)。http://jsbin.com/abecaq/1/edit
从经验的角度来看:我已经将数据直接附加到节点而没有问题,并且从来没有遇到过问题。从规范的角度来看,我的解释是不一定推荐这样做,但在自定义属性不会与其他任何冲突的范围内是安全的。
在Common Infrastructure - Extensibility中,作者(即您)的建议是仅使用 [data-*] 属性:
作者可以包含用于内联客户端脚本或服务器端站点范围脚本的数据,以使用 data-*="" 属性进行处理。这些保证永远不会被浏览器触及,并允许脚本包含 HTML 元素上的数据,然后脚本可以查找和处理这些数据。
有效用户代理的要求是在 DOM 中留下它无法识别的任何内容。
用户代理必须将他们不理解的元素和属性视为语义中立的;将它们留在 DOM 中(对于 DOM 处理器),并根据 CSS 设置它们的样式(对于 CSS 处理器),但不会从中推断出任何含义。
因此,与 W3C 避免冲突的目标一致,我的建议是创建引用DOM元素的对象。但是,如果您“必须”将奇怪的东西标记到 DOM 上,请放心,用户代理需要将其保留在那里。data-*
但如果你真的必须,使用这些属性可能是明智的!
(我个人不使用它们,并且倾向于将对象和值添加到当时最方便的东西上。但是,我可能对大约 15 年的黑客和“特征检测”感到厌倦,因为用户代理的不合规性。即使是现在,我也不认为 IE 支持data-*
标准......)
虽然它不会在小型网站上引起任何问题,但出于几个原因,我会避免这样做......
我建议使用全局变量,或者理想情况下是在必要时可以引用的最高必要范围内的变量。