最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

internet explorer - Javascript setTimeout and redirect - IE freezes - Stack Overflow

programmeradmin6浏览0评论

I have a script on my page that is dealing with session timeouts, redirecting the user on the client side when the session is due to expire. The plete code is somewhat more plex, but I have trimmed down the code to what is causing me the issue:

<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>

This code works as expected, redirecting after (roughly) ten seconds. However, if after the interval calls to CheckActivity have finished (after 5 seconds), I lock my screen and then unlock it after the redirect has due to have happened (another 5 seconds), the URL in my IE window has gone to 'test2.aspx', but the window seems to have frozen (still showing the first page).

This eventually un-freezes, but it takes 10s of seconds to get to the next page.

This only seems to happen in IE (IE9 on my machine), and is fine in chrome and firefox (and oddly IE6).

(Test2.aspx is a very simple page, only containing the text 'success'.)


Just noting that if I change the redirect from test.aspx to /, this does not seem to be a problem. Still does not work however if I change the test2.aspx to be an absolute URL (the only main difference being that this would be a localhost address).

I have a script on my page that is dealing with session timeouts, redirecting the user on the client side when the session is due to expire. The plete code is somewhat more plex, but I have trimmed down the code to what is causing me the issue:

<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>

This code works as expected, redirecting after (roughly) ten seconds. However, if after the interval calls to CheckActivity have finished (after 5 seconds), I lock my screen and then unlock it after the redirect has due to have happened (another 5 seconds), the URL in my IE window has gone to 'test2.aspx', but the window seems to have frozen (still showing the first page).

This eventually un-freezes, but it takes 10s of seconds to get to the next page.

This only seems to happen in IE (IE9 on my machine), and is fine in chrome and firefox (and oddly IE6).

(Test2.aspx is a very simple page, only containing the text 'success'.)


Just noting that if I change the redirect from test.aspx to http://www.google./, this does not seem to be a problem. Still does not work however if I change the test2.aspx to be an absolute URL (the only main difference being that this would be a localhost address).

Share Improve this question edited Jul 20, 2012 at 15:19 Paddy asked Jul 20, 2012 at 11:18 PaddyPaddy 33.9k15 gold badges81 silver badges121 bronze badges 9
  • Is the variable 'redirectTimeout' declared anywhere? Since its working oddly try clearing redirectTimeout. Just a shot in the dark ;D. – Matt Commented Jul 20, 2012 at 11:24
  • Sorry, redirectTimeout should have been in there. – Paddy Commented Jul 20, 2012 at 11:26
  • 1 What about window.location.replace("Test2.aspx"); or window.navigate("Test2.aspx"); Or self.location=Test2.aspx have you tried these and do these also freeze? – 03Usr Commented Jul 20, 2012 at 11:33
  • @03Usr - none of these three made a difference to the result. – Paddy Commented Jul 20, 2012 at 13:02
  • 1 @Paddy - I am experiencing this same issue now in IE10. Did you end up finding a solution? The marked answer below does not work for me. It appears that the JavaScript events are still executing on time while the puter is locked.... however the window is just not repainted yet. Another thing I discovered is that if you click really fast about 3-5 times with your mouse on the frozen screen, it will repaint almost right away.... instead of having to wait 10 seconds. For me, it really has already redirected to new URL.... just has not repainted the screen to show this. – Jason Parker Commented Mar 4, 2014 at 21:46
 |  Show 4 more ments

3 Answers 3

Reset to default 4

I was running into the same type of issue, and I created a different question so I could focus in on what I perceived to be the heart of the issue. (IE not repainting while puter is in lock screen.)

Anyway, I finally figured out a way to resolve this. You can see my answer here. Essentially you can fix your issue by putting some JavaScript inside your auto-logout destination page to periodically update the page content.... and this will force IE to repaint the page.

This way I can execute any Auto Saving logic I want right before their session expires on their current page, and then kick them to the Auto-Logout page.

Sounds as if IE is going into some form of "pause"-mode when you lock the screen, to avoid using cycles on rendering etc. Maybe you can try linking the redirection to the onFocus-event of the window, like this:

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

In theory, this should redirect the page as soon as focus is regained (ie when you unlock the screen). If the window already has focus, then this should not make any difference anyway.

I don't have IE here so I can't verify, but maybe you can postpone the call to TimeoutRedirect until after the window is active again.

I've built a sample page to illustrate this.

The principle is rather simple. You while you run the interval and timeout, you;re setting a variable if the window bees inactive, either because the user switches the tab or locks the screen. Once the timeout is up, you check if the window has focus. If not, set another variable to tell the focus handler to run your session end function. This should help with the redirect.

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);
        }
    }

},

For older IE versions which don't support the handleEvent function I've used the polyfill found at CSS NInja and modified it a little bit.

I hope this helps.

发布评论

评论列表(0)

  1. 暂无评论