我试图防止我的 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/