在页面上,像jsFiddle这样执行用户输入的Javascript,是否有办法阻止/破坏在iframe中运行的“问题”脚本?
我认为主要的问题脚本类是无限循环。浏览器可以很好地处理多个警报,但像for (var i = 0; ++i; i < 100) { /* do stuff */ }
这样的脚本将永远存在。
如何检测并且不运行,或者运行和停止,比如在运行10秒后运行脚本?
删除iframe很好,但是如果脚本在10秒后仍在运行,我只想删除它,但如果脚本停止运行,我不想删除它。
以下是我认为该页面可行的方法。如果您有更好的解决方案,请告诉我......
输入页面包含textarea
和空白iframe
。用户将其脚本输入textarea
,准备好后点击run
。然后(后台)创建一个单独的页面,其中包含HTML页面上可执行形式的用户脚本。 src
的{{1}}设置为包含可执行代码的页面。这一切都是在没有页面刷新的情况下动态发生的。
答案 0 :(得分:2)
我没有使用过这个jsandbox脚本,但似乎有你想要的东西。
答案 1 :(得分:1)
如果一个脚本在页面上冻结,则其他脚本将无法继续运行。因此,没有办法检测另一个脚本是否已停止运行,而不使用自定义插件或其他东西。浏览器不会以这种方式使用多线程。
答案 2 :(得分:1)
您可以在主窗口中设置超时,在10秒后停止/删除脚本。然后你只需要在脚本完成时清除超时(只需在iframe脚本中添加这样的行:window.frames[0].clearTimeout(window.frames[0].timeoutName)
- 我不知道它是否有效,但它应该)
答案 3 :(得分:0)
我认为这在很大程度上取决于脚本以及浏览器如何处理iframe中的脚本。
让我们说iframe中有一段时间(真实)。
浏览器可能会锁定或崩溃标签(就像Chrome所做的那样),或者它可能会锁定iframe。如果它锁定或崩溃选项卡,那么除了在脚本上尝试静态分析以找到可能有问题的语句之外,你无法用JS本身做任何事情来阻止它(静态分析找到有问题的脚本就不会万无一失)
假设浏览器仅锁定iframe或执行其他操作,同时仍然允许主页中的脚本执行操作,则在一段时间后删除iframe是一种选择。
浏览器也可能会显示“Script is slow”弹出窗口。在这种情况下,它很可能要么完全关闭整个选项卡中的所有脚本,要么只关闭iframe中的所有脚本。如果只是iframe,则选项卡中的其他脚本在预定义的时间段之后仍然可以清除它。
另一种替代方法是在单独的运行时中预先评估脚本,您可以在其中检测自己的内容。你可以在Rhino中运行脚本,并确定它是否需要很长时间才能处理,或类似的东西。
答案 4 :(得分:0)
我不知道这是否能正常工作,你可能会得到这样的东西来进行一些修修补补。我认为你正在接受文本JavaScript然后评估它,对吧?您可以解析或甚至只是使用正则表达式来替换所有for,for..in,while和函数声明的调用函数调用然后调用代码的一些逻辑,并确定它是否已运行10秒。如果有,它将返回;或打破;或者其他的东西。该代码可能会在之后发生故障并可能开始抛出错误,但至少脚本会停止。