将DOM节点链接到(浏览器内)域对象的选项:是直接引用
Options to link DOM node to (in-browser) domain object: is direct reference OK?
对于单页应用程序:我希望我的每个DOM节点都有一个对单个(浏览器内)域对象的引用。是否可以像这样存储一个直接引用:
var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.domain_object = myDomainObject;
这是安全的,可重复的?浏览器可以用附加的JavaScript属性做一些神秘的事情吗?
谢谢。
从经验的角度来看:我将数据直接附加到节点上,没有任何问题,从来没有出现过问题。从规范的角度来看,我的解释是这样做不一定是推荐的,但是在自定义属性不与其他任何内容冲突的情况下是安全的。
在公共基础设施-可扩展性中,建议作者(也就是您)只使用[data-*]属性:
作者可以为内联客户端脚本或服务器端脚本包含数据使用data-*="属性进行处理的全站脚本。这些都是保证永远不会被浏览器访问,并允许脚本访问包括HTML元素上的数据,然后脚本可以查找和过程。
对于一个有效的用户代理的要求是在DOM中保留任何它不能识别的东西。
因此,我的建议是,按照W3C避免冲突的目标,创建将引用到 DOM元素的对象。但是,如果您"必须"将奇怪的东西标记到DOM上,请放心,用户代理需要将其留在那里。但是,如果您确实必须这样做,那么使用这些用户代理必须处理它们不处理的元素和属性理解为语义中立的;将它们留在DOM中(用于DOM)处理器),并根据CSS样式化它们(对于CSS处理器),但不能从中推断出任何意义。
data-*
属性可能是明智的!(我个人不使用它们,倾向于把对象和值放在当时最方便的地方。)但是,我可能已经厌倦了大约15年的黑客攻击和针对用户代理不合规的"特征检测"。即使是现在,我也不认为IE支持data-*
标准…)
我以前做过存储自定义事件,它在我尝试过的每个浏览器中都能很好地工作,但是,我得说,只有在没有其他选择的情况下,你必须通过元素传递这个info
。至少,理想情况下,创建自己的命名空间,以避免污染已经被污染的对象:
var myDomainObject = ...;
var DOMNode = document.getElementById("myId");
DOMNode.My = {};
DOMNode.My.domain_object = myDomainObject;
编辑:只是想看看有多少方法和属性一个常规的div
可能有,它有136(在Chrome)。http://jsbin.com/abecaq/1/edit
虽然这不会在小网站上造成任何问题,但我还是会避免这样做,原因如下:
- 通过链接对许多不同JS对象的引用,你正在打开自己的内存泄漏
- 任何新的DOM节点都必须附加这个链接
我建议使用全局变量,或者最好是在最高必要范围内使用变量,以便在必要时可以引用。
- 如何在选项卡上定义属性'的主窗口对象
- 设置选项对象关键点:值对以实现带第二个y轴的动态打印
- 挖空选项对象绑定
- javascript中选项对象的默认值
- 声明JavaScript选项对象的正确方法
- JavaScript 中更有效的选项对象
- 接受选项对象作为参数的简洁方法,回退到省略属性的默认值
- 将选项对象的数组追加到多个选择
- JSDoc:如何记录父“类”的“选项”对象文字
- 访问选项对象(在 ngSelect 中使用),但仅返回文本框中的特定值
- j查询选项对象引用
- Jquery UI滑块选项对象
- 当从选项对象中选择选项时,jQuery执行函数
- AJAX请求带有Jquery,不刷新页面,同时使用选项对象和回调
- 附加选项到选项对象
- 棱角剑道网格与k-rebind不深入观察它的选项对象
- 如何在Firefox中传递多个选项给bootstrap carousel's可选选项对象
- 返回jquery日期选择器beforeShow的选项对象
- 如何将选项对象选择为默认值
- 通过JQuery选项对象传递值