【问题标题】:Is there anyway to prevent onbeforeunload event from triggering when using Internet Explorer无论如何,在使用 Internet Explorer 时是否可以防止触发 onbeforeunload 事件
【发布时间】:2011-02-15 08:50:29
【问题描述】:

我有一个假设在用户关闭浏览器时触发的函数,并且我已将代码放入 window.onbeforeunload 函数中。

问题是每次如果我在 Internet Explorer 中重新加载页面,onbeforeunload 事件也会触发,这是一个问题,因为我只希望它仅在用户关闭或导航离开当前页面时触发,而不是在页面刷新/重新加载时。

因此,我不确定onbeforeunload 是否打算在页面刷新/重新加载时触发,如果它打算触发,那么还有其他方法可以解决它吗?

【问题讨论】:

    标签: javascript internet-explorer refresh dom-events onbeforeunload


    【解决方案1】:

    由于您依赖 javascript,因此您可能需要研究解决为什么他们必须刷新页面的问题。您可以使用 XMLHttprequest 为它们刷新内容,以便仅在需要时调用所需的 onbeforeunload 函数。

    【讨论】:

      【解决方案2】:

      没有聪明的方法可以解决它。页面上的任何卸载操作都会触发unloadbeforeunload 事件,并且无法区分刷新和导航。

      您可以尝试几件事,但没有 100% 的方法。例如,捕获 F5Ctrl+R 键将识别刷新,您可以取消设置 onbeforeunload 处理程序,但它不适用于单击工具栏上的刷新/重新加载按钮的用户。您可以将事件处理程序附加到对 <a> 元素或任何 <form> onsubmits 的所有点击,但这对于从您的页面在地址栏中键入新地址的用户没有帮助。

      【讨论】:

      • 这很有趣,安迪。 Q1:你会使用 keyup 还是 keypress 来捕捉 F5? Q2:您如何捕获对 元素的所有点击?
      • @cf_PhillipSenn: A1: keydown - keypress 不会在 F5 的所有浏览器中触发,并且 keyup 没有很多 真正的 用途,使用其他方式无法更好地完成技巧。 A2:最好的方法是捕获bodydocument 对象的点击事件,并检查原始目标是<a> 元素,例如(event.target || event.srcElement).tagName == "A".
      【解决方案3】:

      即使使用 XMLHttprequest 刷新,IE 也有问题。您必须调用包含 XMLHttprequest 的 javascript 函数,例如,

      <a href="javascript:void(0)" onclick="addContent();">click to add content</a> 
      

      会在 IE 上触发 onbeforeunload 事件,但不会在 Safari 或 Firefox 上触发。

      在某些情况下可行的一种解决方案是有条件地处理事件,当您要加载内容时将其关闭,然后再将其重新打开

      var guard = true; 
      function myOnbeforeunloadHandler() 
      {   
          if(guard)
          {
              return "you are about to leave the page and lose data";
          } 
      }
      
      function addContent()
      {
          getElementById("myDiv").html = "<p>some content</p>";
          guard = true;
      }
      
      <a href="javascript:void(0) onclick="guard=false;addContent();> click to add content</a>
      

      【讨论】:

      • 或者另一种解决方案是根本不创建链接,而是拥有一些其他内容元素(span 或 div)并将点击附加到它,然后您在 IE 中就不会遇到问题。我猜 IE 将点击每个链接视为尝试卸载。
      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2010-10-27
      • 2015-11-02
      • 1970-01-01
      相关资源
      最近更新 更多