如何确保绑定到hashChange事件不会冒泡?

fre*_*ent 5 javascript jquery events event-bubbling

我试图保持我的hashChange事件绑定冒泡.

我有这个:

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

我的脚本管理页面上的面板,每个面板都有自己的历史堆栈.上面的每次转换都会触发,但是我阻止了前向转换的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... 
Run Code Online (Sandbox Code Playgroud)

一切正常(= hashChange触发一次),直到我在初始设置之前到达页面.在最后一步,上面的hashChange绑定会触发两次.我已经尝试永远设置一个标志来阻止第二个hashChange,但它不能像我希望的那样工作.

问题:
怎样才能确保这不会冒泡?我正在尝试这样的事情,但它不起作用:

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

Mat*_*att 3

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

\n\n
$(window).one(\'hashchange\', function( e ) {\xc2\xa0 \xc2\xa0 \n    console.log("hash fired");\n\xc2\xa0 \xc2\xa0 // run hashChange routine\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n