Javascript设置超时怪癖?

Javascript设置超时怪癖?,javascript,jquery,asp.net,settimeout,Javascript,Jquery,Asp.net,Settimeout,我正在尝试实现一个客户端自动编译功能。这个想法是在会话到期前30秒,您会收到一条警告,允许您延长会话。一切都很好,除了 我在$(document).ready函数中使用两个setTimeout调用来设置警告超时和注销超时。但疯狂的是,我设置超时的顺序很重要!如果我先设置注销计时器,只有警告计时器触发。如果我先设置警告计时器,然后设置注销计时器,那么它们都会触发 这适用于两种计时器: $(document).ready(function () { var isAuthenticated =

我正在尝试实现一个客户端自动编译功能。这个想法是在会话到期前30秒,您会收到一条警告,允许您延长会话。一切都很好,除了

我在
$(document).ready
函数中使用两个
setTimeout
调用来设置警告超时和注销超时。但疯狂的是,我设置超时的顺序很重要!如果我先设置注销计时器,只有警告计时器触发。如果我先设置警告计时器,然后设置注销计时器,那么它们都会触发

这适用于两种计时器:

$(document).ready(function () {
    var isAuthenticated = <%= HttpContext.Current.Request.IsAuthenticated.ToString.ToLower() %>;
    if(isAuthenticated)
    {
        warningTimer = setTimeout('warnUserOfSessionTimeout()', intWarningMS);
        logoutTimer = setTimeout('logoutSession()', intTimeoutMS);
    }
});
$(文档).ready(函数(){
var isAuthenticated=;
如果(未经验证)
{
warningTimer=setTimeout('WarningUserOfSessionTimeout()',intWarningMS);
logoutTimer=setTimeout('logoutSession()',intTimeoutMS);
}
});
这仅适用于警告计时器:

$(document).ready(function () {
    var isAuthenticated = <%= HttpContext.Current.Request.IsAuthenticated.ToString.ToLower() %>;
    if(isAuthenticated)
    {
        logoutTimer = setTimeout('logoutSession()', intTimeoutMS);
        warningTimer = setTimeout('warnUserOfSessionTimeout()', intWarningMS);
    }
});
$(文档).ready(函数(){
var isAuthenticated=;
如果(未经验证)
{
logoutTimer=setTimeout('logoutSession()',intTimeoutMS);
warningTimer=setTimeout('WarningUserOfSessionTimeout()',intWarningMS);
}
});
以下是完整的代码:

<script type="text/javascript">

    var intTimeoutMS = <%= FormsAuthTimeoutMinutes %> * 60 * 1000;
    var intCountDownSecs = 30;
    var intWarningMS = intTimeoutMS - intCountDownSecs * 1000;
    var logoutURL = "<%= Page.ResolveClientUrl("~/Logout.aspx") %>";
    var keepAliveURL = "<%= Page.ResolveClientUrl("~/KeepAlive.aspx") %>"
    var logoutTimer;
    var warningTimer;
    var countDownClockTimer;
    var intClockSeconds = intCountDownSecs;

    function logoutSession() {
        window.location = logoutURL;
    }

    function warnUserOfSessionTimeout() {
        $("#sessionTimeout").dialog({
            title: 'Are you still there?',
            autoOpen: false,
            width: 400,
            modal: true,
            closeOnEscape: false,
            resizable:false,
            draggable:false,
            show: { effect: "slide", direction: "up", duration: 400 },
            hide: { effect: "slide", direction: "up", duration: 500 },
            buttons: {
                "Keep Working": function () {

                    // Keep session alive on server
                    $.ajax({
                        type: "POST",
                        url: keepAliveURL,
                        cache: false
                    });

                    // Clear and reset timers
                    clearTimeout(logoutTimer);
                    clearTimeout(warningTimer);
                    clearInterval(countDownClockTimer);
                    logoutTimer = setTimeout('logoutSession()', intTimeoutMS);
                    warningTimer = setTimeout('warnUserOfSessionTimeout()', intWarningMS);

                    $("#sessionTimeout").dialog("close");
                }
            }
        }).dialog("open");

        // Reset and animate display clock
        intClockSeconds = intCountDownSecs;
        animateCountdownClock();
        countDownClockTimer = setInterval('animateCountdownClock()', 1000);
    }

    function animateCountdownClock() {


        var sec_num = parseInt(intClockSeconds, 10);
        var hours   = Math.floor(sec_num / 3600);
        var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
        var seconds = sec_num - (hours * 3600) - (minutes * 60);

        if (hours   < 10) {hours   = "0" + hours;}
        if (minutes < 10) {minutes = "0" + minutes;}
        if (seconds < 10) {seconds = "0" + seconds;}

        $('#countDown').text(minutes + ':' + seconds);

        if(intClockSeconds > 0)
        {
            intClockSeconds -= 1;
        }
    }

    $(document).ready(function () {
        var isAuthenticated = <%= HttpContext.Current.Request.IsAuthenticated.ToString.ToLower() %>;
        if(isAuthenticated)
        {
            logoutTimer = setTimeout(logoutSession, intTimeoutMS);
            warningTimer = setTimeout(warnUserOfSessionTimeout, intWarningMS);
        }
    });
</script>

<div id="sessionTimeout" style="display: none; z-index: 1001;">
    <p style="font-size: 13px;">
        It appears that your computer has been left unattended. As a security precaution,
        you are about to be automatically logged out.
        <br />
        <br />
        Do you want to keep working?
        <br />
        <br />
        <strong>Time remaining:&nbsp;<span id="countDown"></span></strong>
        <br />
    </p>
</div>

var intTimeoutMS=*60*1000;
var intCountDownSecs=30;
var intWarningMS=intTimeoutMS-intCountDownSecs*1000;
var logoutURL=“”;
var keepAliveURL=“”
var-logoutTimer;
var警告定时器;
var倒计时;
var intClockSeconds=intCountDownSecs;
函数logoutSession(){
window.location=logoutURL;
}
函数warnUserOfSessionTimeout(){
$(“#会话超时”)。对话框({
标题:“你还在吗?”,
自动打开:错误,
宽度:400,
莫代尔:是的,
closeOnEscape:错误,
可调整大小:false,
可拖动:错误,
显示:{效果:“幻灯片”,方向:“向上”,持续时间:400},
隐藏:{效果:“滑动”,方向:“向上”,持续时间:500},
按钮:{
“继续工作”:函数(){
//使会话在服务器上保持活动状态
$.ajax({
类型:“POST”,
url:keepAliveURL,
缓存:false
});
//清除和重置计时器
clearTimeout(logoutTimer);
clearTimeout(警告计时器);
clearInterval(倒计时计时器);
logoutTimer=setTimeout('logoutSession()',intTimeoutMS);
warningTimer=setTimeout('WarningUserOfSessionTimeout()',intWarningMS);
$(“会话超时”)。对话框(“关闭”);
}
}
}).对话框(“打开”);
//重置显示时钟并设置其动画
intClockSeconds=intCountDownSecs;
animateCountdownClock();
countDownClockTimer=setInterval('animateCountdownClock()',1000);
}
函数animateCountdownClock(){
var sec_num=parseInt(intClockSeconds,10);
var小时=数学楼层(秒数/3600);
var分钟=数学楼层((秒数-(小时*3600))/60);
var秒=秒数-(小时*3600)-(分钟*60);
如果(小时<10){hours=“0”+小时;}
如果(分钟<10){minutes=“0”+分钟;}
如果(秒<10){seconds=“0”+秒;}
$(“#倒计时”).text(分钟+”:“+秒);
如果(intClockSeconds>0)
{
intClockSeconds-=1;
}
}
$(文档).ready(函数(){
var isAuthenticated=;
如果(未经验证)
{
logoutTimer=setTimeout(logoutSession,intTimeoutMS);
warningTimer=setTimeout(WarningUserOfSessionTimeout,intWarningMS);
}
});

您的计算机似乎无人看管。作为安全预防措施, 您将自动注销。

你想继续工作吗?

剩余时间:


首先:不应将字符串传递给
setTimeout
。只需直接传递函数:
setTimeout(warnUserOfSessionTimeout,intWarningMS)。此外,这两个功能是否清除了其他计时器?是的,如果用户单击弹出该功能的对话框上的按钮,警告功能可以清除其他时间。注销功能只是将窗口位置更改为注销页面。“注销功能只是将窗口位置更改为注销页面。”这将删除当前页面,包括取消其所有计时器。但是你描述的症状有点相反,你说过它“只对警告计时器有效”,暗示注销计时器不起作用。@MikeC我喜欢你的建议。但是我删除了引号,我仍然可以重现相同的问题……安排定时回调的顺序很重要:它们在一个列表中,安排两个具有相同计时器值的
setTimeout
s将触发第一个,然后触发第二个。您没有给我们提供足够的代码来解释您看到的内容,但是很明显,第一个激发的代码正在执行阻止或取消第二个的操作。第一:您不应该将字符串传递给
setTimeout
。只需直接传递函数:
setTimeout(warnUserOfSessionTimeout,intWarningMS)。此外,这两个功能是否清除了其他计时器?是的,如果用户单击弹出该功能的对话框上的按钮,警告功能可以清除其他时间。注销功能只是将窗口位置更改为注销页面。“注销功能只是将窗口位置更改为注销页面。”这将删除当前页面,包括取消其所有计时器。但是交响乐团