【问题标题】:onbeforeunload event not executed when the page is closed during Javascript running在Javascript运行期间关闭页面时未执行onbeforeunload事件
【发布时间】:2013-11-25 09:34:17
【问题描述】:

我的情况有点复杂,但我可以在以下示例中很快重现我的问题:

<html>
 <head>
  <script type="text/javascript">
  function fnUnloadHandler() {
       alert("Unload event.. session termination request to be sent to server");
  }
  function f() { 
       i = 1;
       while(1==1){
          i++;
       }
   }
  </script>
 </head>
<body onbeforeunload="fnUnloadHandler()">
 <p><button href="#" onClick="f();" >do</button></p>
 </body>
</html>

现在;一旦单击“do”按钮,f() 就会无限循环地获取浏览器。在那段时间里,如果我关闭页面,我会得到两种不同的行为:

  • 在 IE7 上:终止 Javascript 执行,触发 onbeforeunload 事件并显示警报然后关闭页面。
  • 在IE9:终止Javascript执行,触发onb​​eforeunload事件NO并显示NO警报并直接关闭页面。

我想知道为什么 IE9 在这种情况下不能正确处理 onbeforeunload .. 是否有任何修复/补丁可应用于 IE9 来解决此问题?

非常感谢!

菲拉斯

【问题讨论】:

  • 我猜这是因为在 IE7 中有 2 个不同的线程用于处理 f() 调用和 onbeforeload 事件......但你到底想达到什么目的?为什么要进入无限循环
  • 嗨 Shai,实际上我的产品中肯定没有这个循环 :-),我只是想抽象一下这个问题.. 循环模拟 IE 上的繁重 JS 处理,最多需要 5 秒。并且在此期间关闭页面时会出现问题。

标签: javascript html internet-explorer internet-explorer-9 onbeforeunload


【解决方案1】:

JavaScript 至少大部分(如果不是全部)实现是单线程的。如果你调用f函数,其中包含一个无限循环,那一个JS线程正忙。 onbeforeunload 处理程序已排队,当函数f 返回时将调用它。不幸的是,f 永远不会回来。但是,有些实现会采用 while(1==1) 之类的结构,并将终止该循环,因为它不会去任何地方。 IE 经常向您显示 conform 警报,说类似 “脚本正在运行,但看起来没有到达任何地方,您希望终止它吗?” p>

从逻辑上讲,onbeforeunload 处理程序会被调用的唯一原因是,如果 f 函数没有被调用,或者特定浏览器的实现不会在出现错误时放弃调用队列遇到,处理程序仍将被调用。
顺便说一句,一些代码审查:

function f()
{
    i = 1;
}

正在创建一个 evil 隐含的全局变量,将其更改为:

function f()
{
    var i = 1;
}

以避免混乱全局命名空间。此外,onbeforeunload 事件通常附加到全局对象,以免您要处理特定元素的卸载。如果您想处理全局卸载(客户端离开页面),IE7 和 IE8 将内存泄漏check the solution here,该代码示例显示了如何使用附加到全局的事件处理程序来避免内存泄漏对象。

【讨论】:

    【解决方案2】:

    请看这个链接http://msdn.microsoft.com/en-us/library/ie/ms536907%28v=vs.85%29.aspx希望对你有帮助

    <!DOCTYPE html>
    <html>
    <head>
    <script>
      function closeIt()
      {
        return "any string";
      }
      window.onbeforeunload = closeIt;
    </script>
    </head>
    <body>
      <a href="http://www.microsoft.com">Click here to navigate to 
          www.microsoft.com</a>
    </body>
    </html>
    

    【讨论】:

    • window.onbeforeunload 导致内存泄漏,请注意。我添加了一个链接到我的答案,并解释了如何泄漏可能发生,以及如何避免它
    • 不客气……我们都在这里为您提供帮助,并分享我们所知道的。如果您不介意我的代表嫖娼:投票(链接答案或我的答案)将是感谢我的更好方式,事实上:在本网站的帮助部分you are asked not to add thank you comments,但投票而是:)
    • 但是你没有回答任何问题只能找到你自己的问题答案。
    • 嗯,这就是为什么我没有将我的答案标记为接受的答案,但我确实把它放在那里,仅仅是因为我认为我获得的信息可能对其他人有益,并且工具提示(在悬停时在投票向上箭头上)说:“这个答案很有用”,而不是“这个答案实际上回答了这个问题”。此外:我回答了这个问题,不是吗?
    • 抱歉有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多