javascript clearTimeout没有清除超时!这应该不难?

时间:2012-02-27 09:14:05

标签: javascript

我正在使用setTimeout和clearTimeout进行自动注销。应该是非常直接但是明确的超时似乎不会停止超时并且无论如何都会调用该函数。我设置了会话变量填充javascript然后读取的文本输入并与现在的时间进行比较。如果差异大于或等于20秒,则重叠div显示给出更新会话的选项,否则它将在10秒内注销。检查上次活动的脚本每十秒自动运行一次。显然,一旦我开始工作,时间会更长 - 这些仅用于测试目的。

我已经在网上搜寻过,但似乎找不到一个明显的解决方案,因为它不是那么复杂,看起来真的应该可以正常工作!

这是我的代码:

var t = 0;
function check_status(){
    var time_now = Math.floor(new Date().getTime() / 1000);
    var last_activity = document.getElementById("last_activity").value;
    var since_last_activity = time_now-last_activity;
    console.info(since_last_activity);

    if(since_last_activity >= 20){
        // show div
        document.getElementById("logout_warning").style.height = document.documentElement.clientHeight+"px";
        document.getElementById("logout_warning").style.display = 'block';

        // start countdown
        var t = setTimeout("logout();", 10000);
    }
}

function logout(){
    document.getElementById("logout_warning").style.display = 'none';
    location.href="/user/logout";
}

function renew(){
    clearTimeout(t);

    var time_now = Math.floor(new Date().getTime() / 1000);
    document.getElementById("last_activity").value = time_now;
    document.getElementById("logout_warning").style.display = 'none';
}

setInterval('check_status()', 10000);

然后在身体......

<div id="logout_warning" style="display:none; width:100%; height:500px; top:0px; left:0px; position:absolute; background-image:url('/images/overlay.png'); z-index:100000;">
    <div style="width:300px; position:relative; margin:200px auto; border:1px solid #000000; background-color:#FFFFFF; padding:10px; text-align:center;">
        You're going to be logged out in 10 seconds! oh no!<br/><br/>
        <button type="button" onclick="renew();">Click here</button> to renew your session
    </div>
</div>

最后一个活动变量是从一个由会话变量填充的文本输入中提取的。这个位似乎有效,就像你点击续订按钮时输入的值改变了,控制台输出显示自上次活动重置以来的时间。

我希望这是有道理的。请求澄清,但我真的很难过这个!

谢谢!

3 个答案:

答案 0 :(得分:8)

你有两个t

var t = 0;

这个在外部范围内。

var t = setTimeout("logout();", 10000);

这个在内部范围内。

clearTimeout(t);

这是读取外部范围内的那个。

从内部范围内删除var

答案 1 :(得分:0)

那是因为你正在重新定义函数中的变量并且它变成该函数的局部变量,全局t仍为0:

var t = setTimeout("logout();", 10000);

在变量前删除var!

答案 2 :(得分:0)

你用全局变量t掩盖了本地变量:

var t = 0;
function check_status() {
   var t = setTimeout("logout();", 10000);
// ^^^^
}

function renew() {
    clearTimeout(t);
}

删除var以使t引用全局变量。