JavaScript   发布时间:2022-04-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Javascript:父级可以杀死子iframe,如果它被卡在无限循环中?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个页面,其中包含带有外部内容的iframe.我不希望外部内容中的无限循环崩溃我的整个页面.有没有办法解决这个问题.

我试图在父级postmessages子iframe的情况下设置一些内容,如果子iframe没有响应太长时间,则父级更改iframes src,但这似乎不起作用.一旦iframe开始循环,父级的setTimeout函数就不再执行了.在这里查看我的代码(请注意,如果执行它会使选项卡崩溃,在执行之前打开控制台以查看日志记录):

message",answer,falsE);' +
'  function answer() { console.log("ANSWEREd"); parent.postmessage(\'hi\',\'*\');}' +
'  setTimeout("while(1){Console.log(\'in loop\')};",3000)' +
");
var iframe = document.createElement('iframe');
queryChild();

window.addEventListener("message",receive,falsE);
function receive() {
  lastAnswer = (new Date()).getTime();
  console.log('got answer');
}

function queryChild() {
  console.log('querying');
  if((new Date()).getTime() - lastAnswer > 5000) {
    console.log('killing');
    iframe.src = '';
  } else if(iframe.contentWindow){
    iframe.contentWindow.postmessage('hi','*');
  }
  setTimeout(queryChild,2000);
};

document.body.appendChild(iframE);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();


有关如何解决这个问题的任何建议?

最佳答案
我遇到这种问题的经验是,除非您可以在将其提供给iframe(作为URL或通过srcdoc属性)之前访问外部代码,否则循环将完全中断任何JavaScript执行.

无论您实现什么类型的超时功能,都不​​会调用它,因为iframe代码执行会消耗100%的资源,直到浏览器报告崩溃.

你的选择是:

>在将代码添加到iframe之前自动清理代码,这证明是不切实际的,因为有无限循环无限循环,并且您将无法捕获所有代码.您必须编写一个扫描程序脚本,该脚本可以检测无限循环,同时在扫描代码过程中不会崩溃.
>使用像Google Caja这样的沙盒解决方案来清理代码.但是,如果没有大量配置,这将在结构上更改代码.
>如果应用程序具有创建虚拟环境和监视它们的功能,您可以执行iframe代码(假设在某种虚拟机上),检查进程是否锁定并使用该结果来确定您是否可以安全将iframe.src属性设置为代码的URl.这可能是唯一可以保证这些代码不会立即锁定的解决方案(但是,有很多方法可以在稍后的某个执行点上设置竞争条件,因此无法确定方式永远不会锁定浏览器).

简介:除非您能够在iframe中显示代码之前找到广泛测试代码的方法,否则您无法保证iframe代码不会锁定浏览器选项卡.

大佬总结

以上是大佬教程为你收集整理的Javascript:父级可以杀死子iframe,如果它被卡在无限循环中?全部内容,希望文章能够帮你解决Javascript:父级可以杀死子iframe,如果它被卡在无限循环中?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。