以编程方式更新哈希,而不触发hashchange事件

Updating the hash programmatically without triggering hashchange event?

本文关键字:hashchange 事件 编程 方式 更新 哈希      更新时间:2023-09-26

我正在使用jQuery BBQ插件将状态推送到location.hash。

为了防止反馈循环,我想在以编程方式设置状态时暂时禁用hashchange侦听器。

我见过这样的解决方案:在不触发hashchange事件的情况下更改哈希

不幸的是,它似乎不是很健壮,因为它有时会触发,即使我这样做:

updateURL(obj){
  $(window).unbind( 'hashchange');
  $.bbq.pushState(obj);
  setTimeout( function() { bindHashChange()}, 500);
}

现在是否有更好的方法以编程方式推送状态?也许是另一个JS库?

使用超时执行此操作将无法可靠地工作。链接答案的重要部分是设置一个处理程序知道的标志。代码见更新后的问题。

或者,将一个临时处理程序绑定到负责重建处理程序的事件:

function updateState(state, handler) {
    var win = $(window);
    function temporaryHandler() {
        win.unbind('hashchange', temporaryHandler);
        win.bind('hashchange', handler);
    };
    win.unbind('hashchange', handler);
    win.bind('hashchange', temporaryHandler);
    $.bbq.pushState(state);
}