4

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

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

这是安全的,可重复的吗?浏览器可以通过附加的 JavaScript 属性做一些神秘的事情吗?

谢谢。

4

3 回答 3

2

我以前做过存储自定义事件,它在我尝试过的每个浏览器中都可以正常工作,但是是的,我想说这很危险,只有在没有其他选择并且您必须将此信息元素一起传递的情况下。

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

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

编辑:div只是想看看一个常规可能有多少方法和属性,它有 136 个(在 Chrome 中)。http://jsbin.com/abecaq/1/edit

于 2013-05-28T02:02:44.357 回答
2

从经验的角度来看:我已经将数据直接附加到节点而没有问题,并且从来没有遇到过问题。从规范的角度来看,我的解释是不一定推荐这样做,但在自定义属性不会与其他任何冲突的范围内是安全的。

Common Infrastructure - Extensibility中,作者(即您)的建议是仅使用 [data-*] 属性:

作者可以包含用于内联客户端脚本或服务器端站点范围脚本的数据,以使用 data-*="" 属性进行处理。这些保证永远不会被浏览器触及,并允许脚本包含 HTML 元素上的数据,然后脚本可以查找和处理这些数据。

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

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

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

(我个人不使用它们,并且倾向于将对象和值添加到当时最方便的东西上。但是,我可能对大约 15 年的黑客和“特征检测”感到厌倦,因为用户代理的不合规性。即使是现在,我也不认为 IE 支持data-*标准......)

于 2013-05-28T03:58:55.107 回答
0

虽然它不会在小型网站上引起任何问题,但出于几个原因,我会避免这样做......

  1. 通过将引用链接到许多不同的 JS 对象,您正在向内存泄漏敞开大门
  2. 任何新的 DOM 节点都必须附加此链接

我建议使用全局变量,或者理想情况下是在必要时可以引用的最高必要范围内的变量。

于 2013-05-28T02:03:09.677 回答