Javascript设置超时怪癖?
我正在尝试实现一个客户端自动编译功能。这个想法是在会话到期前30秒,您会收到一条警告,允许您延长会话。一切都很好,除了 我在Javascript设置超时怪癖?,javascript,jquery,asp.net,settimeout,Javascript,Jquery,Asp.net,Settimeout,我正在尝试实现一个客户端自动编译功能。这个想法是在会话到期前30秒,您会收到一条警告,允许您延长会话。一切都很好,除了 我在$(document).ready函数中使用两个setTimeout调用来设置警告超时和注销超时。但疯狂的是,我设置超时的顺序很重要!如果我先设置注销计时器,只有警告计时器触发。如果我先设置警告计时器,然后设置注销计时器,那么它们都会触发 这适用于两种计时器: $(document).ready(function () { var isAuthenticated =
$(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: <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)代码>。此外,这两个功能是否清除了其他计时器?是的,如果用户单击弹出该功能的对话框上的按钮,警告功能可以清除其他时间。注销功能只是将窗口位置更改为注销页面。“注销功能只是将窗口位置更改为注销页面。”这将删除当前页面,包括取消其所有计时器。但是交响乐团