Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 在窗口中添加元素有什么害处吗';不是创建它时使用的文档?_Javascript_Dom - Fatal编程技术网

Javascript 在窗口中添加元素有什么害处吗';不是创建它时使用的文档?

Javascript 在窗口中添加元素有什么害处吗';不是创建它时使用的文档?,javascript,dom,Javascript,Dom,例如,假设我这样做: var otherWindow = window.open("otherfile.html", "_blank"); 然后过了一段时间: if(otherWindow.document && otherWindow.document.body) { var elem = document.createElement("DIV") elem.innerHTML = "hello here I am!"; otherWindow.document.bod

例如,假设我这样做:

var otherWindow = window.open("otherfile.html", "_blank");
然后过了一段时间:

if(otherWindow.document && otherWindow.document.body) {
 var elem = document.createElement("DIV")
 elem.innerHTML = "hello here I am!";
 otherWindow.document.body.appendChild(elem);
}
这似乎还可以,但我很好奇,elem是用第一个窗口的文档创建的,但附加到第二个窗口的文档中,这一事实是否有任何不利之处。这是一个大禁忌吗


假设我有这样做的理由,并且(因为元素实际上是由库代码创建的)使用“otherWindow.document”创建元素不会很干净/琐碎。

除了变量访问和可能不会造成伤害的潜在DOM问题,无论您在何处创建元素,也不管您在何处添加元素。

我认为您至少在某些浏览器中是可以的,但我认为可能会有例外,我不知道DOM规范对此有何说明。我建议您在目标浏览器中尝试一下


还有一种DOM方法,它具有相当广泛的支持,是为任务而设计的,因此似乎是最安全的选择,也是我推荐的方法。

@Mathletics:不,它是文档节点本身的一种方法,并且结果元素的
ownerDocument
属性引用文档。鉴于该窗口实际上是全局对象的别名,并且某些浏览器实现原型继承,在一个窗口中创建DOM元素并将其附加到另一个窗口中的文档可能会在窗口之间创建相互依赖关系。这可能会对内存和类似于if(element instanceof HtmleElement)的东西产生影响,因为实例的构造函数可能来自不同的全局上下文,与执行测试的on不同,因此在预期为true时返回false。@TimDown我注意到,在Chrome中,ownerDocument将引用新文档(元素附加到的文档)。我从未见过问题,但查看importNode文档很有帮助。现在它似乎可以工作了,当他们以其他方式更改它时,它会破坏很多页面,但他们仍然建议不要这样做。使用importNode的一个效果是克隆了原始节点,因此应该删除所有侦听器(可能除了行内侦听器)。也不确定这是否相关,因为在OP中创建的节点直接附加到另一个窗口中的文档中,由importNode创建的节点实际上与通过createElement创建的节点相同。@RobG:这似乎与我相关:
importNode()
存在并且存在是有目的的。很明显,关于克隆的观点很公平。正确的做法是查看DOM规范,看看是否可以使用另一个文档中的节点,而我实际上没有时间这么做。@tim-我的意思是不相关,因为OP希望从窗口a中的脚本在窗口a中创建一个元素,并将其附加到窗口B中的文档中,而importNode可能会在窗口B中运行,并通过克隆窗口A中的元素在窗口B中创建新元素。虽然我猜脚本可能仍会在窗口A中运行,但
document.importNode()
中的文档将在窗口B中。