javascript clearTimeout未清除超时!。。这不应该是';这不难吗?

javascript clearTimeout未清除超时!。。这不应该是';这不难吗?,javascript,Javascript,我正在使用setTimeout和clearTimeout进行自动注销。应该是非常直接的,但是清除超时似乎并没有停止超时,并且函数仍然被调用。我设置了session变量填充一个文本输入,然后javascript读取该文本输入并与现在的时间进行比较。如果差异大于或等于20秒,将显示overlay div,提供续订会话的选项,或者它将在10秒后注销。检查最后一个活动的脚本每10秒自动运行一次。显然,一旦我让它工作的时间将更长-这些只是为了测试的目的 我已经在网上搜索过了,但似乎找不到一个明显的解决方案

我正在使用setTimeout和clearTimeout进行自动注销。应该是非常直接的,但是清除超时似乎并没有停止超时,并且函数仍然被调用。我设置了session变量填充一个文本输入,然后javascript读取该文本输入并与现在的时间进行比较。如果差异大于或等于20秒,将显示overlay div,提供续订会话的选项,或者它将在10秒后注销。检查最后一个活动的脚本每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>

你将在10秒内注销!哦,不

单击此处续订会话
最后一个活动变量来自由会话变量填充的文本输入。此位似乎起作用,当您单击“续订”按钮时,输入值发生更改,控制台输出显示自上次活动以来的时间已重置

我希望这是有道理的。请要求澄清,但我真的很难办这一点


谢谢

您有两个
t
s

var t = 0;
这一个在外部范围内

var t = setTimeout("logout();", 10000);
clearTimeout(t);
这个在内部范围内

var t = setTimeout("logout();", 10000);
clearTimeout(t);
这是在外部范围内读取的

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

从内部作用域上的变量中删除
var

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

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

删除变量之前的var

您正在用局部变量覆盖全局变量
t

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

function renew() {
    clearTimeout(t);
}

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

不要将
eval
uation的字符串传递给
setTimeout
,传递函数<代码>设置超时(注销,10000)