有没有办法让注入iframe中的javascript代码在不删除和重新结束包含它的脚本标记的情况下执行?

有没有办法让注入iframe中的javascript代码在不删除和重新结束包含它的脚本标记的情况下执行?,javascript,iframe,dom-manipulation,Javascript,Iframe,Dom Manipulation,背景: 我正在构建一个实时的HTML、CSS和Javascript编辑器。 可以访问它 可以访问源代码 问题: 是否可以运行注入到iframe中的javascript代码,而无需重复从DOM树中删除和添加包含代码的标记?由于DOM操作成本高昂,我想尝试并消除多个DOM操作。 相反,我希望能够更改标记的textContent,并让它运行我插入的新代码 谢谢 如果您不介意使用邪恶,您可以在iframe的窗口中重新评估大多数JavaScript,例如 function someFunction(){

背景:

我正在构建一个实时的HTML、CSS和Javascript编辑器。 可以访问它

可以访问源代码

问题:

是否可以运行注入到iframe中的javascript代码,而无需重复从DOM树中删除和添加包含代码的标记?由于DOM操作成本高昂,我想尝试并消除多个DOM操作。 相反,我希望能够更改标记的textContent,并让它运行我插入的新代码


谢谢

如果您不介意使用邪恶,您可以在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)