Javascript: SetTimeout和ClearTimeout重置。

3
我有以下的会话时间JavaScript代码。
    <script type="text/javascript">

    var time;
    var sessionTimeout = <%= Session.Timeout %>

    function DisplaySessionTimeout() {

       document.getElementById("<%= lblSessionTime.ClientID %>").innerText = sessionTimeout;
        sessionTimeout = sessionTimeout - 1;

        if (sessionTimeout >= 0)
            time = window.setTimeout("DisplaySessionTimeout()", 1000);
        else {
            alert("Your current Session is over.");
        }
   }

    function cleartime() {
        clearTimeout(time);
        document.onmousemove = cleartime;
        document.onkeypress = cleartime;
    }
</script>   

它可以倒计时,但当我移动鼠标或按下键时,没有任何反应。我希望在鼠标移动和按键时重置计数器。有人能发现错误吗?

2个回答

3

如果你的意图是将计时器重置为其初始值,那么你的方法完全错误。我建议你使用setInterval而不是setTimeout(并传递一个函数而不是一个字符串):

var time,
    sessionTimeout = <%= Session.Timeout %>,
    remainingTime = sessionTimeout,
    intervalHandle,
    lastPos = [0, 0];

function displaySessionTimeout() {
   document.getElementById("<%= lblSessionTime.ClientID %>").innerText = remainingTime;
}

function updateTimer() {
    remainingTime -= 1;

    if (remainingTime >= 0) {
        displaySessionTimeout();
    } else {
        clearInterval(intervalHandle);
        alert("Your current Session is over.");
    }
}

function resetTimer() {
    if (remainingTime >= 0 && (e.clientX !== lastPos[0] || e.clientY !== lastPos[1])) {
       lastPos = [e.clientX, e.clientY];
       remainingTime = sessionTimeout;
       displaySessionTimeout();
    }
}

intervalHandle = setInterval(updateTimer, 1000);
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;
displaySessionTimeout();

http://jsfiddle.net/2ZERB/


它只停止计数器,但不重置计数器。我希望当鼠标移动时它能重新开始。 - user3346509
好的,你在问题中没有解释清楚,但请参见上面更新的代码。 - JLRishe
它还是没有工作。当我运行它时,计数器只停留在20上。没有倒计时。 - user3346509
我正在弄清楚clientX和Y的作用。这一次它在倒计时,但是onmousemove和onkeypress仍然没有重置计时器。也许与那些函数有关。 - user3346509

2
你意识到你正在递归调用cleartime函数,对吧?而且你甚至没有调用cleartime函数。另外,替换掉

标签。
window.setTimeout("DisplaySessionTimeout()", 1000);

使用

setTimeout(DisplaySessionTimeout, 1000);

即使被称为 cleartime,它也不会调用自身。你从哪里得到了 "递归" 这个概念? - cHao
我认为当我移动鼠标或按任何键时,cleartime被自动调用。 - user3346509

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接