【问题标题】:Is it possible to trigger the onbeforeunload event programmatically?是否可以以编程方式触发 onbeforeunload 事件?
【发布时间】:2011-03-30 06:04:56
【问题描述】:

我目前正在使用jquery-form-observe 插件,它使用onbeforeunload 来提示用户有关“未保存”的更改。

但是我有一个场景,我需要在单击按钮时触发它:按钮单击最终会导致页面更改,但我想在用户开始按钮单击开始的过程之前提示他们......

那么有没有办法通过jQuery或其他方式触发onb​​eforeunload?

【问题讨论】:

    标签: javascript jquery jquery-plugins dom-events


    【解决方案1】:

    我不知道是否有直接的方法可以做到这一点,但您始终可以自己模拟浏览器的确认框。这是我根据specs at MSDN 编写的一个简单函数:

    function triggerBeforeUnload() {
      var event = {};
      handler(event);
    
      if (typeof event.returnValue == 'undefined' ||
          confirm('Are you sure you want to navigate away from this page?\n\n' + event.returnValue + '\n\nPress OK to continue, or Cancel to stay on the current page.')) {
        // Continue with page unload
      } else {
        // Cancel page unload
      }
    }
    

    编辑:jquery.formobserver.js,紧跟function beforeunload(e) { ... }的定义之后,添加这一行:

    handler = beforeunload;
    

    注意原代码的变化:window.onbeforeunload已被handler替换。

    【讨论】:

    • 在 Firefox 和 IE8 上,调用 window.onbeforeunload 时出现错误。 Firefox 错误是“window.onbeforeunload 不是函数”,IE 返回“对象不支持此属性或方法”
    • 好的,问题是插件通过addEventListener/attachEvent而不是直接通过window.onbeforeunload附加事件处理程序。我想您必须修改插件代码才能获得对 beforeunload 函数的引用。
    • 谢谢!现在可以了。有什么关于避免使用全局 for 处理程序的建议吗?
    • 我想不到。不过这应该不是问题,只需将 handler 重命名为不会与其他名称冲突的名称即可。
    • @casablanca 你能做个小提琴吗
    【解决方案2】:

    您可以使用.trigger() 方法来做到这一点:

    $('button').click(function(){
        $(window).trigger('beforeunload');
    });
    

    【讨论】:

    • 这几乎是我尝试的第一件事,但似乎触发器不能用于 'beforeunload',因为当我调用它时似乎什么都没有发生。
    • @mutex 在回答之前我也在想同样的事情,所以我设置了这个简单的测试:jsfiddle.net/LpGq9。也许它与表单观察插件如何绑定 onbeforeunload 事件处理程序有关。
    • 是的,你可能是对的。该插件不使用绑定;而是这样做: if(window.attachEvent){ window.attachEvent('onbeforeunload', beforeunload); }else if(window.addEventListener){ window.addEventListener('beforeunload', beforeunload, true); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多