【问题标题】:javascript clearTimeout not clearing timeout!.. this shouldn't be hard?javascript clearTimeout 不清除超时!.. 这应该不难?
【发布时间】:2012-02-27 09:14:05
【问题描述】:

我正在使用 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>

最后一个活动变量是从由会话变量填充的文本输入中提取的。这一点似乎有效,因为当您单击更新按钮时,输入的值发生了变化,并且控制台输出显示自上次活动以来的时间已被重置。

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

谢谢!

【问题讨论】:

  • 不要将evaluation 的字符串传递给setTimeout,传递函数。 setTimeout(logout, 10000);

标签: javascript


【解决方案1】:

你有两个ts。

var t = 0;

这个在外部范围内。

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

这个在内部范围内。

clearTimeout(t);

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

从内部作用域中删除var

【讨论】:

  • 你这个天才!就知道这是愚蠢的事情!非常感谢!
【解决方案2】:

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

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

去掉变量前的var!

【讨论】:

    【解决方案3】:

    你用一个局部变量掩盖了全局变量t

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2020-01-19
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多