javascript - 如何确保绑定(bind)到 hashChange 事件不冒泡?

标签 javascript jquery events event-bubbling

我试图防止我的 hashChange 事件绑定(bind)冒泡。

我有这个:

$(window).bind('hashchange', function( e ) {
    console.log("hash fired");
    // run hashChange routine
    });

我的脚本管理页面上的面板,每个面板都有自己的历史堆栈。上面的代码在每次转换时都会触发,但我在向前转换时阻止了 hashChange,所以我可以更深入地导航到面板中。在向后“转换”时,只有 hashChange 触发并且没有被阻止,所以我可以返回。

导航可能如下所示:

panel A, start down > page2
panel A, page2 down > page3
panel A, page3 up > page2
panel A, page2 up > start - hashChange fires twice here... 

一切正常(= hashChange 触发一次),直到我到达初始设置之前的页面。在最后一步,上面的 hashChange-binding 触发了两次。我一直试图在某处设置一个标志来阻止第二次 hashChange,但它并没有像我希望的那样工作。

问题:
怎样才能保证这个不冒泡呢?我正在尝试类似的方法,但它不起作用:

var $blockBubblingHashes = 0;
$(window).bind('hashchange', function( e ) {       
   if ($blockBubblingHashes == 0) {
      // run hashChange routine
      $blockBubblingHashes = 1; 
      } else {
         $blockBubblingHashes = 0;
         }
    });

最佳答案

如果您希望事件处理程序只触发一次,您应该考虑使用 one()函数,它在第一次执行后删除处理程序。

$(window).one('hashchange', function( e ) {    
    console.log("hash fired");
    // run hashChange routine
});

如果你特别想停止事件冒泡,而不是删除处理程序,你应该检查 stopPropagation()stopImmediatePropagation() on 方法事件对象。不幸的是,我得到的印象是你将所有的 hashchange 处理程序绑定(bind)到 window,而 jQuery 没有记录绑定(bind)到同一元素的事件处理程序的执行顺序;所以您将没有可靠的方法知道首先调用哪个处理程序。

关于javascript - 如何确保绑定(bind)到 hashChange 事件不冒泡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267999/

相关文章:

C#:form.Close 方法、FormClosing 事件和 CloseReason 事件参数。设置自定义关闭原因?

javascript - while 循环中 regex.exec() 赋值的更好解决方案

javascript - ES6 将数组元素的出现次数计算为对象数组中的值的最佳方法

javascript - 如何在具有已知类名的特定行第一次出现之后/之前移动行?

javascript - 如何将 JSON 对象写入现有 JSON 文件

android - 检测设备是否振动?

javascript - 返回错误后执行 Node.js Restify 代码

javascript - 相同高度盒子的优雅解决方案

jquery - 在加载横幅图像之前不要加载页面

javascript - Vue.js 3 this.$root.$on 不是函数