当运行用户输入的Javascript时,有没有办法检测并停止“问题”脚本?

时间:2010-08-28 02:49:02

标签: javascript jquery infinite-loop

在页面上,像jsFiddle这样执行用户输入的Javascript,是否有办法阻止/破坏在iframe中运行的“问题”脚本?

我认为主要的问题脚本类是无限循环。浏览器可以很好地处理多个警报,但像​for (var i = 0; ++i; i < 100) { /* do stuff */ }​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​这样的脚本将永远存在。

如何检测并且不运行,或者运行和停止,比如在运行10秒后运行脚本?

删除iframe很好,但是如果脚本在10秒后仍在运行,我只想删除它,但如果脚本停止运行,我不想删除它。


以下是我认为该页面可行的方法。如果您有更好的解决方案,请告诉我......

输入页面包含textarea和空白iframe。用户将其脚本输入textarea,准备好后点击run。然后(后台)创建一个单独的页面,其中包含HTML页面上可执行形式的用户脚本。 src的{​​{1}}设置为包含可执行代码的页面。这一切都是在没有页面刷新的情况下动态发生的。

5 个答案:

答案 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秒。如果有,它将返回;或打破;或者其他的东西。该代码可能会在之后发生故障并可能开始抛出错误,但至少脚本会停止。