Javascript设置超时和重定向-IE冻结

Javascript设置超时和重定向-IE冻结,javascript,internet-explorer,Javascript,Internet Explorer,我的页面上有一个处理会话超时的脚本,在会话到期时在客户端重定向用户。完整的代码稍微复杂一些,但我已将代码缩减到导致问题的原因: <head runat="server"> <script src="javascript/jquery-1.7.2.min.js" type="text/javascript"> </script> <script type="text/javascript"> /*

我的页面上有一个处理会话超时的脚本,在会话到期时在客户端重定向用户。完整的代码稍微复杂一些,但我已将代码缩减到导致问题的原因:

<head runat="server">
    <script src="javascript/jquery-1.7.2.min.js" type="text/javascript">
    </script>
    <script type="text/javascript">

        /*

            Please see document ready method at the bottom that sets
            up this code, calling CheckActivity() at intervals.

        */

        var warningInterval, redirectTimeout;
        var now = 1;

        function TimeoutRedirect() {
            window.location.href = "Test2.aspx";
        }

        //In this example this is a bit of a null op, but in real
        //code this will display a warning a minute or so prior to redirect.
        //This is required to recreate...
        function CheckActivity() {
            if (now > 4) {
                clearInterval(warningInterval);

                redirectTimeout = setTimeout(function () { 
                         TimeoutRedirect(); }, 5000);
            }

            //Some visual activity for testing purposes.
            $("#CheckActivityCount").text(now);
            now++;
        }


        $(document).ready(function () {
            warningInterval = setInterval(function () { 
                CheckActivity(); }, 1000);
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <div id="CheckActivityCount">

        </div>
    </div>
    </form>
</body>

/*
请参阅底部的document ready方法设置
更新此代码,每隔一段时间调用CheckActivity()。
*/
var warningInterval,重定向超时;
var now=1;
函数TimeoutRedirect(){
window.location.href=“Test2.aspx”;
}
//在这个例子中,这是一个有点空的操作,但在现实中
//此代码将在重定向前一分钟左右显示警告。
//这是重新创建。。。
函数CheckActivity(){
如果(现在>4){
清除间隔(警告间隔);
redirectTimeout=setTimeout(函数(){
TimeoutRedirect();},5000);
}
//一些用于测试目的的视觉活动。
$(“#CheckActivityCount”).text(现在);
现在++;
}
$(文档).ready(函数(){
warningInterval=setInterval(函数(){
CheckActivity();},1000);
});
此代码按预期工作,大约在10秒后重定向。但是,如果在对CheckActivity的间隔调用完成后(5秒后),我锁定屏幕,然后在重定向发生后解锁屏幕(再过5秒),IE窗口中的URL已转到“test2.aspx”,但窗口似乎已冻结(仍显示第一页)

这最终会冻结,但需要10秒才能进入下一页

这似乎只发生在IE(在我的机器上是IE9)中,在chrome和firefox(奇怪的是IE6)中也可以

(Test2.aspx是一个非常简单的页面,只包含文本“success”。)



请注意,如果我将重定向从test.aspx更改为,这似乎不是问题。但是,如果我将test2.aspx更改为绝对URL(唯一的主要区别是这将是一个本地主机地址),仍然不起作用。

当您锁定屏幕时,IE听起来好像进入某种形式的“暂停”模式,为了避免在渲染等过程中使用循环,您可以尝试将重定向链接到窗口的onFocus事件,如下所示:

window.onfocus = function(){
    window.location.href = "Test2.aspx";
}
window.location.href = "Test2.aspx";

理论上,这应该在重新获得焦点时(即当你解锁屏幕时)立即重定向页面。如果窗口已经有焦点,那么无论如何这不会有任何区别

我这里没有IE,因此无法验证,但您可以将对TimeoutRedirect的调用推迟到窗口再次激活之后

我建立了一个例子来说明这一点

原则相当简单。当您运行间隔和超时时,您;如果由于用户切换选项卡或锁定屏幕,窗口变为非活动状态,请重新设置变量。超时结束后,检查窗口是否有焦点。如果没有,请设置另一个变量,以告知
焦点
处理程序运行会话结束函数。这将有助于重定向

sessionEnd: function() {
    this.sessionEnded = true;
    var windowEvents;
    if (!this.isInactive) {
        console.log("window active, sessionEnd called");
        alert("THE END");
        this.removeEvents();
        // window.location.href = "test.aspx";
    } else {
        console.log("window inactive, sessionEnd will be called again on focus");
    }

},

handleEvent: function(e) {
    // only do something if the window loses or gains focus
    if (this.eventBlurRegex.test(e.type)) {
        this.isInactive = true;
    } else if (this.eventFocusRegex.test(e.type)) {
        this.isInactive = false;
        if (this.sessionEnded === true) {
            this.sessionEnd.call(this);
        }
    }

},
对于不支持
handleEvent
功能的旧IE版本,我使用了在中找到的polyfill,并对其进行了一些修改


我希望这能有所帮助。

我遇到了相同类型的问题,我提出了一个不同的问题,这样我就可以专注于我认为问题的核心。(即计算机处于锁屏状态时不重新喷漆。)

无论如何,我终于想出了解决这个问题的办法。您可以看到。基本上,您可以通过在自动注销目标页面中添加一些JavaScript来定期更新页面内容,从而解决问题。。。。这将迫使IE重新绘制页面


这样,我就可以在他们当前页面上的会话到期之前执行我想要的任何自动保存逻辑,然后将他们踢到自动注销页面。

变量“redirectTimeout”是否在任何地方声明?由于工作异常,请尝试清除重定向超时。只是黑暗中的一枪;对不起,redirectTimeout应该在那里。window.location.replace(“Test2.aspx”)怎么样
窗口导航(“Test2.aspx”)
self.location=Test2.aspx
您是否尝试过这些方法,并且是否也冻结了这些方法?@03Usr-这三种方法都没有改变结果。@Paddy-我现在在IE10中遇到同样的问题。你最终找到解决办法了吗?下面有标记的答案对我不适用。当计算机被锁定时,JavaScript事件似乎仍在按时执行。。。。然而,窗户还没有重新粉刷。我发现的另一件事是,如果你用鼠标在冻结的屏幕上快速点击3-5次,它几乎会立即重新绘制。。。。而不是等待10秒。对我来说,它真的已经重定向到新的URL。。。。只是没有重新绘制屏幕来显示这一点。我们已经考虑过这样做,但仍然想弄清为什么会发生这种情况。我想确定我没有遗漏一些邪恶的东西。经过一些测试,我很确定这只是IE没有执行渲染;如果你打开页面,然后点击另一个窗口(这样IE就会失去焦点),然后锁定屏幕,10秒后解锁,IE仍然会冻结在锁定屏幕时显示的秒数上。但是,url将被更新。再次聚焦IE窗口,将更新视图,并将您带到重定向页面。换句话说,你似乎已经被重定向了,但它还不可见。事实上,你可以在浏览器栏中看到新的URL,但它还没有呈现出来,需要一段时间