Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将DOM节点链接到(浏览器中)域对象的选项:直接引用可以吗?_Javascript_Dom - Fatal编程技术网

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

Javascript 将DOM节点链接到(浏览器中)域对象的选项:直接引用可以吗?,javascript,dom,Javascript,Dom,对于单页应用程序:我希望我的每个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;

Edit:只是想看看一个普通的
div
可能有多少方法和属性,它有136个(在Chrome中)

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


  • 通过将引用链接到许多不同的JS对象,您将面临内存泄漏
  • 任何新的DOM节点都必须连接此链接

  • 我建议使用一个全局变量,或者最好是一个在必要时可以随时引用的最高范围的变量。

    从经验的角度来看:我将数据直接附加到节点上,没有问题,也从来没有问题。从规范的角度来看,我的解释是这样做不一定是推荐的,但在某种程度上是安全的,因为自定义属性不会与其他任何内容冲突

    在中,建议作者(即您)仅使用[data-*]属性:

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

    对有效用户代理的要求是在DOM中留下任何它无法识别的东西

    用户代理必须处理它们不处理的元素和属性 理解为语义中立;将它们留在DOM中(对于DOM) 处理器),并根据CSS对其进行样式化(对于CSS处理器), 但不能从中推断出任何意义

    因此,我的建议与W3C避免冲突的目标相同,就是创建引用DOM元素的对象。但是,如果您“必须”将奇怪的东西标记到DOM上,请放心,用户代理必须将其留在DOM上。但如果您确实必须这样做,那么使用这些
    data-*
    属性可能是明智的


    (我个人不使用它们,并且倾向于在最方便的时候将对象和值添加到任何东西上。但是,我可能会对15年的黑客攻击和对用户代理不遵从性的“功能检测”感到厌倦。即使是现在,我也不认为IE支持
    数据-*
    标准…

    “你正在向内存泄漏敞开大门”. 有什么参考资料吗?@RobG我想他指的是:。。。一只老虫子。但微软也错误地宣称已经修复了好几次。老实说,我不知道这是否仍然是一个问题。我只是假设…@svidgen是一篇关于IE和涉及DOM元素的循环引用的老文章。虽然它在IE6和IE7中没有完全固定,但在IE8中几乎是固定的。OP也不会创建这样的循环引用。@RobG并不是专门指IE bug。更多关于链接对象应小心处理的一般警告。假设链接对象不再需要-没有链接GC将卸载它。但由于它与其他事物有关,它留在记忆中的可能性增加了。因此,这是一个友好的警告。您最好用另一种方式进行引用,即从本机对象到DOM对象。您可以使用索引或类似的方法。只是澄清一下:我的一些DOM节点是域对象的可视化表示。正是为了这些节点,我想将单个DOM节点与单个域对象相关联。我想您希望能够响应DOM元素上的用户操作并获得关联的对象。最好将引用存储在类名或数据属性中,这就是它们的用途。请注意,这些属性的值应该是字符串文字,而不是对象引用。+1另外,虽然它在大多数使用的浏览器中“起作用”,但DOM规范中没有任何规定可以向宿主对象添加随机属性。