1

我想运行一些有时间限制的外部 JavaScript,这样如果花费的时间超过 N 秒,它将被停止。

某些浏览器,例如 Firefox,已经通过对话框询问您是否要允许脚本继续运行来执行此操作。但是,我正在寻找更多:

  • 我想设置我自己的时间限制,而不是使用浏览器的默认值(例如,我相信 Chrome 的时间比 Firefox 的长得多)。
  • 我希望能够基于每个脚本而不是每个页面来执行此操作。一页可能包含多个我想以这种方式限制的脚本(因此我的想法是使用<iframe>元素)。

我在想,如果我可以简单地将一个属性附加到一个属性上会非常方便——例如,类似的<iframe>东西js-time-limit="5000"(我只是编造的)——但我找不到类似的东西。

这可能吗?对浏览器中的 JavaScript 执行设置可配置的时间限制?

4

2 回答 2

1

如果 iframe 正在执行计算工作并且不需要访问 DOM,则使用网络工作者:https ://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

这也是一个可以为您抽象出困难部分的库!http://adambom.github.io/parallel.js

重要部分:

Dedicated Web Workers 为 Web 内容在后台线程中运行脚本提供了一种简单的方法。

如果您需要立即终止正在运行的工作人员,可以通过调用工作人员的 terminate() 方法来完成:myWorker.terminate();

浏览器兼容性

Chrome  Firefox (Gecko)  Internet Explorer  Opera  Safari (WebKit)
   3        3.5 (1.9.1)          10         10.60        4
于 2013-06-21T15:24:11.113 回答
0

为了后代:我最初的目标是允许网站的用户提交 JS 代码并在有时间限制的后台运行它,这样,例如,无限循环不会对 CPU 造成严重破坏。

我使用Joe 建议的方法创建了一个名为Lemming.js的库。你像这样使用它:

var lemming = new Lemming('code to eval');

lemming.onTimeout(function() {
  alert('Timed out!');
});

lemming.onResult(function(result) {
  alert('Result: ' + result);
});

lemming.run({ timeout: 5000 });

您可以查看 GitHub 存储库以获取更多详细信息。

于 2013-12-06T00:12:21.513 回答