0

我一直在为我未来的项目编写代码库。我一直在研究的功能之一是暂停功能。到目前为止,我对报告脚本运行时间很长的错误没有任何问题,即使暂停时间长达 10 秒。这主要是为了让恶意用户保持忙碌,当您设置很长时间时它会很好地工作。我想知道是否有任何我应该注意的错误,我可能会遇到?这是代码...

pause = function(a) {
    var b = new Date().getTime();
    e = false;
    function wait() {
    d=10;
    for(i=0;i<d;i++) {
        d++;
        var c = new Date().getTime();
        if(c-b>=a) {
            e = true;
            break;
        }
        if(d>1000000) {
            break;
        }
    }
}
wait();
if(e==false) {
    pause(a-(new Date().getTime()-b));
}};
4

3 回答 3

4

你永远不想在 Javascript 中做这种事情。正如您所注意到的,浏览器会抱怨您的脚本耗时过长。此外,这将消耗比所需更多的能量,这对于电池容量有限的移动设备很重要。

相反,setTimeout()稍后使用标准函数运行代码。

于 2012-08-23T06:25:50.060 回答
0

Javascript 已经有办法做到这一点。使用 setTimeout() 并在您的操作继续时将其传递给匿名函数。第二个参数是以毫秒为单位的延迟。

例子:

setTimeout(function(){ alert('hello'); }, 2000);

于 2012-08-23T06:28:11.540 回答
0

正如我到目前为止在评论中所说的那样,尝试在 javascript 中运行半无限循环绝不是一个好主意。

以下是一些需要注意的问题:

  1. 如果您在一段时间后没有通过完成 javascript 线程执行返回浏览器事件循环,浏览器将停止并提示用户终止该浏览器窗口中的 javascript。
  2. 您的代码使用了一堆未声明的变量,这使它们成为隐式全局变量。由于它们具有通用名称,因此它们很容易干扰其他代码。
  3. 因为 javascript 是单线程的,所以当您的循环运行时,该窗口的其他浏览器事件无法运行,从而使浏览器窗口基本上冻结。用户会认为它已挂起。患者用户可能会等待更长时间以查看它是否完成。不耐烦的用户会杀死浏览器窗口。

本质上,您尝试做的是对用户浏览器的拒绝服务攻击。您可能不喜欢他们对您的网页所做的事情,但回击他们似乎并不合适。以适合浏览器的方式而不是攻击浏览器的方式阻止对您的页面的访问要好得多。

建议:

如果您真正想做的只是在某些情况下使您的页面无用(您仍然没有解释为什么要尝试这样做或什么条件会触发您这样做的愿望),那么最好只需使页面无用或提供信息,而无需尝试杀死浏览器。你可以这样做:

  1. 只是将所有内容隐藏在 DOM 中,因此窗口变为空白。
  2. 删除所有 DOM 元素,使窗口变为空白。
  3. 在整个窗口上放置一个透明层,这样没有输入事件可以到达页面元素,但视觉效果仍然存在。您可以向该窗口添加一条消息。
  4. 用适当的消息替换页面内容。
于 2012-08-23T07:01:17.023 回答