8

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

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

我见过这个解决方案: 更改哈希而不触发 hashchange 事件

不幸的是,它似乎并不完美,因为即使我这样做,它有时也会触发:

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

现在有更好的方法来以编程方式推动状态吗?也许另一个 JS 库?

4

1 回答 1

2

使用超时执行此操作将无法可靠地工作。链接答案的重要部分是设置您的处理程序知道的标志。有关代码,请参阅更新的问题。

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

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);
}
于 2011-08-14T17:21:38.163 回答