IE10 JavaScript在计算机锁定时无法重新绘制窗口?

时间:2014-03-04 23:02:27

标签: javascript windows internet-explorer internet-explorer-10 repaint

问题

在IE10上发生。 (IE8工作正常。)

我编写了一些JavaScript代码,在20分钟不活动后,将浏览器重定向到另一个URL以指示用户已注销。通常这很好。但是我注意到一个奇怪的情况......如果用户的 Windows计算机在此超时期间被锁定,那么似乎没有任何事情发生。

但是,当我查看浏览器的URL栏时,我可以清楚地看到该URL已经更新到自动注销页面。但是浏览器窗口的整个内容仍然显示旧页面!由于某种原因,浏览器窗口没有重新绘制/刷新。看起来它已经冻结了。

此时......如果我在页面上快速鼠标点击,则浏览器“醒来”并显示新内容。 (似乎只有一次鼠标点击是不够的。你点击的速度越快,“醒来”就越快。)

理论

我最好的猜测是IE10浏览器在计算机锁定时停止重新绘制窗口。但是,我确实认为JavaScript引擎仍然在运行,因为我测试了另一个具有多个JS新Date()时间戳的场景,并且在屏幕最终重新绘制时,每个日期时间都是唯一的,显示它实际发生的时间。

重新创建问题 - 版本1

  1. 在IE10中启动以下JavaScript代码
  2. 在10秒钟之前锁定我的Windows计算机。
  3. 等待10秒钟,然后解锁我的电脑。
  4. 看到IE10窗口无法重新绘制。
  5. 我注意到这只发生在重定向到公司本地Intranet上的URL时。我不知道为什么会这样......但如果我有URL作为谷歌或雅虎的主页....那么我无法重新创建这个问题。它只是正常工作。让我想知道它是否可能是某种组策略/可信区域/内联网与互联网问题......

    <!DOCTYPE HTML>
    <html>
    <head></head>
    <body>    
    <script>
        var url = 'http://IntranetWebApps.OurCompany.com/MyWebApp/Home';  // fails
        //url = 'http://www.yahoo.com';  // this 'Internet' site works
        //url = 'http://www.google.com';  // this 'Internet' site works 
    
        setTimeout(function () { 
                window.location.href = url;
            }, 10000  // wait 10 seconds, then execute redirect
        );
    </script>
    </body>
    </html>
    

    问题

    有没有人有任何想法如何解决这个问题,以便IE10窗口将始终立即重绘,而不是显示陈旧的内容?

1 个答案:

答案 0 :(得分:4)

终于找到了克服这种荒谬烦恼的方法。我在我的自动注销登录页面(我重定向用户的位置)中添加了一些JavaScript。此JavaScript每秒更新一次页面内容。

瞧!

这里真正的问题是,即使IE10窗口内容被合法更新并且应该在计算机被锁定时重新绘制(例如重定向时),它也不会重新绘制。

IE10仅在计算机解锁时发生页面内容更新操作时重新绘制。

下面的JavaScript通过将DIV的内容设置为当前时间(包括秒)来每秒更新页面内容。这意味着如果用户锁定他们的计算机并进行午餐一小时,他们的浏览器页面将超时并在他们离开时重定向到注销页面。当用户回来并解锁他们的计算机时...他们将看到旧的陈旧内容1秒....然后运行的JavaScript强制重新绘制,他们将很快看到注销屏幕的内容。

<h1>Due to inactivity, you were automatically logged out.  (Deal with it.)</h1>
<div id="div1" style="background-color: white; color: white;">
</div>
<script>
    (function ()
    {
        var forceRepaint = function ()
        {
            var myDiv = document.getElementById("div1");
            myDiv.innerHTML = new Date().toLocaleTimeString();
        };
        setInterval(forceRepaint, 1000);
    })();
</script>

我确实尝试过设置DIV上的可见性以使其隐藏(而不是设置白色背景和白色文本颜色),但浏览器不会重新绘制。它非常智能地检测是否确实发生了可见的变化。

奖励 - 雅虎/谷歌与我的退出页面

在重定向到Yahoo或Google等外部网站时,我无法创建问题的原因是他们可能运行了一些JavaScript代码,这些代码在加载后确实会更新其页面内容。他们基本上有更多“东西”在继续。而我的原始注销页面非常简单,并且在页面加载时没有执行任何JavaScript代码。