有没有办法让注入iframe中的javascript代码在不删除和重新结束包含它的脚本标记的情况下执行?
背景: 我正在构建一个实时的HTML、CSS和Javascript编辑器。 可以访问它 可以访问源代码 问题: 是否可以运行注入到iframe中的javascript代码,而无需重复从DOM树中删除和添加包含代码的标记?由于DOM操作成本高昂,我想尝试并消除多个DOM操作。 相反,我希望能够更改标记的textContent,并让它运行我插入的新代码有没有办法让注入iframe中的javascript代码在不删除和重新结束包含它的脚本标记的情况下执行?,javascript,iframe,dom-manipulation,Javascript,Iframe,Dom Manipulation,背景: 我正在构建一个实时的HTML、CSS和Javascript编辑器。 可以访问它 可以访问源代码 问题: 是否可以运行注入到iframe中的javascript代码,而无需重复从DOM树中删除和添加包含代码的标记?由于DOM操作成本高昂,我想尝试并消除多个DOM操作。 相反,我希望能够更改标记的textContent,并让它运行我插入的新代码 谢谢 如果您不介意使用邪恶,您可以在iframe的窗口中重新评估大多数JavaScript,例如 function someFunction(){
谢谢 如果您不介意使用邪恶,您可以在iframe的窗口中重新评估大多数JavaScript,例如
function someFunction(){ // any function
console.log(document.body.children);
}
someFunction(); // see normal output
var ifrm = document.getElementsByTagName('iframe')[0], // your iframe
iwind = ifrm.contentWindow; // the iframe's window
iwind.eval( someFunction.toString() ); // re-evaluate function with eval from iframe
iwind.someFunction(); // see new output - output is in iframe's context
比照
iwind.someFunction = someFunction; // set variable
iwind.someFunction(); // same as calling someFunction() from parent
它应该适用于大多数有效的JavaScript(考虑范围),但要注意。是的,您可以将它与
iwind.eval(myScript.textContent)一起使用
也一样,但要注意,除非您将不想再使用的内容设置为null
或undefined
,否则只要iframe
在同一页面上,它们就会存在。这也适用于删除和追加新的
。是否有解决方法?任何垃圾收集策略在
标记移除后进行清理?并不是说它们无缘无故没有得到GC'd-当对
中的脚本求值时,它是在窗口的上下文中完成的,因此任何变量集或定义的函数都存在。您可以比较对象的Object.keys(窗口)
或for(var-key-in-window)
之前和之后以及删除
新属性,但是你很难判断是否已经修改了现有的一个。好吧,这是一个很长的目标,因为我在浏览器解释javascript的过程中似乎找不到任何好的文档,但是:如果我将对iframe
contentWindow
的引用存储在父窗口的var中,会怎么样,然后将iframe
contentWindow
设置为null(可能导致GC扫描),然后使用父窗口var
将其设置回原位,并在GC扫描后使用它?我假设当我将iframe
的contentWindow
设置为null时,它会导致GC执行扫描。感谢您的快速回复!:)node.contentWindow=null;node.contentWindow===null;//错误
。即使您可以将其设置为null
,它也是一个对象,因此父窗口中的变量是ByRef,并且它的属性将随着对节点上的属性的更改而更改。contentWindow
。Afaik销毁和重新创建窗口对象的唯一方法是重新加载页面,因此我建议比较object.keys(Window)
。