0

我正在尝试使用 Javascript 设置会话超时,并且看起来警报正在阻止计时器启动。这是我的代码:

var first_timer = 2 * 1000;
var second_timer = 8 * 1000;
var down = -1;

function initTimer() {
  down = setTimeout(processTimeout, first_timer)
}

function processTimeout() {
        down = setTimeout(logout, second_timer);
        alert ("Timeout of first timer, timerid:" + down );
}

function logout() {
  alert("You are logged out");
  window.location = "http://www.google.com"
}

function clearTimer() {
  if ( -1 != down )
    clearTimeout(down);
  alert("Restarting timer");
  initTimer();
}

initTimer();

当我运行上述代码时,我看到第二个计时器仅在第一个警报被解除后才开始。即使没有解除警报,如何确保第二个计时器在第一次超时后立即启动?

谢谢

4

2 回答 2

1

这很可能取决于您使用的浏览器。我没有遇到您使用最新 Firefox 描述的问题。

但是,在第一个计时器关闭之前,不会显示第二个计时器警报框。

这是因为 JavaScript 解释器不是多线程的。但是 JavaScript 本身是高度异步的,尤其是在诸如计时器、AJAX 和动画之类的长延迟请求上。这就是有时给人一种多线程的感觉。

实际上,在您的代码示例中,第二个计时器按预期启动。当我关闭第一个对话框时,假设它出现 10 秒后,第二个对话框立即显示。尽管如此,这可能是您的问题,在您关闭第一个警报之前它永远不会显示,因为警报是一个同步调用。这样主事件循环在解除之前不会获得控制权。

这种情况的一种解决方法是使用 Jquery-UI 提供的“HTML”对话框。

于 2012-07-12T20:44:02.090 回答
1

alert()函数会阻止其他所有内容,直到它被解除。您可以使用所谓的模态对话框来创建自己的不阻塞的警报样式消息。

jQuery UI 有这个特性。

于 2012-07-12T20:30:21.477 回答