我有一个页面,其中包含带有外部内容的iframe.我不希望外部内容中的无限循环崩溃我的整个页面.有没有办法解决这个问题.
我试图在父级postMessages子iframe的情况下设置一些内容,如果子iframe没有响应太长时间,则父级更改iframes src,但这似乎不起作用.一旦iframe开始循环,父级的setTimeout函数就不再执行了.在这里查看我的代码(请注意,如果执行它会使选项卡崩溃,在执行之前打开控制台以查看日志记录):
有关如何解决这个问题的任何建议?
最佳答案
我遇到这种问题的经验是,除非您可以在将其提供给iframe(作为URL或通过srcdoc属性)之前访问外部代码,否则循环将完全中断任何JavaScript执行.
无论您实现什么类型的超时功能,都不会调用它,因为iframe代码执行会消耗100%的资源,直到浏览器报告崩溃.
你的选择是:
>在将代码添加到iframe之前自动清理代码,这证明是不切实际的,因为有无限循环无限循环,并且您将无法捕获所有代码.您必须编写一个扫描程序脚本,该脚本可以检测无限循环,同时在扫描代码过程中不会崩溃.
>使用像Google Caja这样的沙盒解决方案来清理代码.但是,如果没有大量配置,这将在结构上更改代码.
>如果应用程序具有创建虚拟环境和监视它们的功能,您可以执行iframe代码(假设在某种虚拟机上),检查进程是否锁定并使用该结果来确定您是否可以安全将iframe.src属性设置为代码的URL.这可能是唯一可以保证这些代码不会立即锁定的解决方案(但是,有很多方法可以在稍后的某个执行点上设置竞争条件,因此无法确定方式永远不会锁定浏览器).
简介:除非您能够在iframe中显示代码之前找到广泛测试代码的方法,否则您无法保证iframe代码不会锁定浏览器选项卡.