Javascript 控制计时器的最佳方法是什么?

Javascript 控制计时器的最佳方法是什么?,javascript,Javascript,我继承了这段代码,并且已经玩了很长时间。第一次倒计时的时候我已经开始工作了,但是在第一次刷新之后,我相信我仍然有第二次或者第三次计时器在运行。我确信我需要实现clearInterval()以保持20分钟的稳定计时器,但我不确定如何正确地执行此操作。任何帮助都将不胜感激 <script type="text/javascript"> var DoLogout = 1; var WarnMills; var TimeoutMills; var WarnDu

我继承了这段代码,并且已经玩了很长时间。第一次倒计时的时候我已经开始工作了,但是在第一次刷新之后,我相信我仍然有第二次或者第三次计时器在运行。我确信我需要实现clearInterval()以保持20分钟的稳定计时器,但我不确定如何正确地执行此操作。任何帮助都将不胜感激

<script type="text/javascript">
    var DoLogout = 1;
    var WarnMills;
    var TimeoutMills;
    var WarnDurationMills;
    var RedirectURL;
    var _timeLeft;

    function StartTimeout(TimeoutValue, WarnValue, WarnDuration, URLValue) {
        TimeoutMills = TimeoutValue;
        WarnMills = WarnValue;
        WarnDurationMills = WarnDuration;
        RedirectURL = URLValue;
        setTimeout(UserTimeout, TimeoutMills);
        setTimeout(WarnTimeout, WarnMills);
    }

    function UserTimeout() {
        if (DoLogout == 1) {
            top.location.href = RedirectURL;
        }
        else {
            DoLogout = 1;
            setTimeout(UserTimeout, TimeoutMills);
            setTimeout(WarnTimeout, WarnMills);
        }
    }

    function WarnTimeout() {
        _timeLeft = (WarnDurationMills / 1000);
        updateCountDown();
        $find('mdlSessionTimeout').show();
    }

    function updateCountDown() {
        var min = Math.floor(_timeLeft / 60);
        var sec = _timeLeft % 60;
        if (sec < 10)
            sec = "0" + sec;

        document.getElementById("CountDownHolder").innerHTML = min + ":" + sec;

        if (_timeLeft > 0) {
            _timeLeft--;
            setTimeout(updateCountDown, 1000);
        }
        else {


            window.location.replace("AdminLogin.aspx");

        }

        if (_timeLeft < (5 * 60)) {
            $find('mdlSessionTimeout').show();
        }
    }

    function PreserveSession() {
        {
            $.ajax({
            type: "POST",
            url: "SessionKeepAlive.asmx/Check",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: false,
            cache: false,
            success: checkAuthenticatedOk,
            error: checkAuthenticatedError
        });

    }        
}

function checkAuthenticatedOk() {
    DoLogout = 0;
    _timeLeft = (20 * 60);
    TimeoutMills = (20 * 60 * 1000);
    $find('mdlSessionTimeout').hide();
}

function checkAuthenticatedError() {
    window.location.replace("AdminLogin.aspx");
}

var-DoLogout=1;
瓦恩米尔斯;
var定时器;
var-WarntionMills;
var重定向url;
var_timeLeft;
函数StartTimeout(TimeoutValue、WarnValue、WarnDuration、URLValue){
TimeoutMills=TimeoutValue;
WarnMills=WarnValue;
WarnDurationMills=警告持续时间;
重定向URL=URLValue;
setTimeout(UserTimeout,TimeoutMills);
setTimeout(WarnTimeout,WarnMills);
}
函数UserTimeout(){
if(DoLogout==1){
top.location.href=重定向URL;
}
否则{
DoLogout=1;
setTimeout(UserTimeout,TimeoutMills);
setTimeout(WarnTimeout,WarnMills);
}
}
函数WarnTimeout(){
_timeLeft=(WarnDurationMills/1000);
updateCountDown();
$find('mdlSessionTimeout').show();
}
函数updateCountDown(){
var min=数学楼层(_timeLeft/60);
var sec=_timeLeft%60;
如果(第10节)
秒=“0”+秒;
document.getElementById(“倒计时持有者”).innerHTML=min+“:”+sec;
如果(_timeLeft>0){
_时间限制--;
setTimeout(updateCountDown,1000);
}
否则{
window.location.replace(“AdminLogin.aspx”);
}
如果(_timeLeft<(5*60)){
$find('mdlSessionTimeout').show();
}
}
函数保存会话(){
{
$.ajax({
类型:“POST”,
url:“SessionKeepAlive.asmx/Check”,
数据:“{}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
async:false,
cache:false,
成功:checkAuthenticatedOk,
错误:checkAuthenticatedError
});
}        
}
函数checkAuthenticatedOk(){
DoLogout=0;
_时间长度=(20*60);
TimeoutMills=(20*60*1000);
$find('mdlSessionTimeout').hide();
}
函数checkAuthenticatedError(){
window.location.replace(“AdminLogin.aspx”);
}

调用StartTimeout时,请确保已首先清除上一个计时器

var userTimeoutId, warnTimeoutId;
function StartTimeout(...){
    ...
    clearTimeout(userTimeoutId);
    clearTimeout(warnTimeoutId);
    userTimeoutId = setTimeout(UserTimeout, TimeoutMills);
    warnTimeoutId = setTimeout(WarnTimeout, WarnMills);
}

也可以在userTimeout函数下编写类似的代码。

您可以将
计时器ID
推入一个数组,并在必要时检索它们,甚至可以通过在数组上循环来清除所有计时器。我尝试了您的答案,并将clearTimeout添加到userTimeout函数中,倒计时在一个刻度内从14分钟变为5分钟。还有其他想法吗?