-2

您好,我是 javascript 的新手,今天在这方面努力工作,但找不到解决方案。请帮我。

<script>
    if (/*@cc_on!@*/false) {
        document.onfocusin = startB;
        document.onfocusout = stopB;
    } else {
        window.onfocus = startB;
        window.onblur = stopB;
    }

var x = 1000;
var y = 1;

function startB() {
    if (x !== 'ok') {
        x = x - y;
        document.form.num.value = x;
        timeoutID=setTimeout("startB()", 1000);
    } 
    if (x == 0) {
        x = 'ok';
        document.form.num.value = x;
    }
}

function stopB() {
clearTimeout(timeoutID);
}
</script>
<body onLoad="startB()">
<form name="form">
<input name="num" size="10" readonly="readonly" type="text"> 
</form>

当我打开此页面时,它通常以 1/秒的值倒计时,当我更改窗口/选项卡时它停止,我再次回来它继续 1/秒,这就是我想要的,但我有一个大问题 --> 当我转到此链接并很快更改窗口/选项卡,它仍然未加载,它在 onblur 状态下开始倒计时,当我回到 onfocus 状态时,该功能被读取两次并开始倒计时 1/0.5 秒。 。 双倍的。

谁能帮我这个?提前致谢。

4

1 回答 1

0

在设置超时之前让 startB调用stopB 将 stopB更改为:

  if (timeoutID) clearTimeout(timeoutID);

这样如果 timeoutID 已经被清除(或尚未设置)它就不会抛出错误。

编辑

如果您在加载事件发生之前离开页面,则计时器将在页面没有获得焦点的情况下启动。如果在设置超时之前取消超时(即 startB总是在调用 setTimeout 之前调用 stopB),则不能同时运行两个计时器。

于 2011-06-19T00:18:34.660 回答