【问题标题】:Cancel onbeforeunload event handler?取消 onbeforeunload 事件处理程序?
【发布时间】:2011-06-08 08:17:29
【问题描述】:

我有一个附加到页面的 onbeforeunload 事件处理程序,该处理程序在每次页面重新加载/被重定向时执行。

window.onbeforeunload = function() {
  console.log("do something");}

我不希望此脚本在我的测试期间运行。我想在自己的测试环境中禁用它。

有没有办法解除绑定这个 onbeforeunload 事件?我正在使用 JavaScript,以 jQuery 作为框架,所以 jQuery 的答案会很好。

【问题讨论】:

    标签: javascript jquery onbeforeunload


    【解决方案1】:

    在 javascript 中的函数可以被覆盖。您可以简单地为其指定一个新用途:

    window.onbeforeunload = function () {
      // blank function do nothing
    }
    

    这将完全覆盖window.onbeforeunload 的现有版本。

    注意:为什么不简单地删除设置此功能的代码行?或者如果你不能,你必须在定义后设置这个空白函数,以确保它不会再次被覆盖

    【讨论】:

    • 这在我们遇到同样问题的 AJAX 函数中完美运行。 +1
    • window.onbeforeunload = null;
    • 一旦之前的方法被调用,这不会被覆盖。如果以前的方法调用一次,即使在分配新方法后对我的情况也无济于事。它仍然采用以前的方法。
    • 只能在调用前覆盖它。
    【解决方案2】:

    添加:

    function f_beforeunload(e) {console.log("do something");}
    window.addEventListener("beforeunload", f_beforeunload);
    

    删除:

    window.removeEventListener("beforeunload", f_beforeunload);
    

    【讨论】:

      【解决方案3】:

      与此问题没有直接关系,但可能对某人有所帮助。这是我在 Angular 1.x 和 TypeScript 中使用的:

      this.$window.onbeforeunload = () => undefined;
      

      【讨论】:

      • 可能是因为这需要 angular 和 TypeScript 来完成一些没有它可以在一行代码中完成的事情。
      • 也许,但我明确指出,虽然有点无关,但可能正在使用 Angular 的人可能会在此找到用途。这段代码中的 TypeScript 是无关紧要的——它恰好是我设置的一部分。我可以理解不赞成投票,但反对投票有点小意思。话又说回来,也许我在这里搞砸了。
      • 仅供参考:此方法导致 IE11 显示带有消息“null”的确认消息。用 undefined 替换 null 可以修复它。
      • 必须是函数吗? onbeforeload的默认值是null,那你就不能直接设置成null吗? this.$window.onbeforeunload = null;
      【解决方案4】:

      jQuery ≥ 1.7

      从 jQuery 1.7 开始,事件 API 已更新,.bind()/.unbind() 仍可用于向后兼容,但首选方法是使用 on()/off() 函数。下面是,

      $('#myimage').click(function() { return false; }); // Adds another click event
      $('#myimage').off('click');
      $('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
      $('#myimage').off('click.mynamespace');
      $( window ).on( "unload", handler )
      

      由于 .unload() 方法只是 .on( "unload", handler ) 的简写,因此可以使用 .off( "unload" ) 进行分离

      $( window ).off( "unload", handler )
      

      【讨论】:

      • 这和onbeforeunload有什么关系?
      • 由于 .unload() 方法只是 .on( "unload", handler ) 的简写,因此可以使用 .off( "unload" ) 进行分离
      • @murthynaikak unload != onbeforeunload 因此是 onbefore
      猜你喜欢
      • 2016-08-30
      • 1970-01-01
      • 2017-10-05
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多