2011-08-14 50 views
7

我使用jQuery BBQ插件将状态推送到location.hash。以编程方式更新散列而不触发hashchange事件?

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

我已经看到了这个解决方案: Change hash without triggering a hashchange event

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

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

现在是否有一个更好的方法以编程方式推动国家?也许另一个JS库?

回答

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); 
} 
相关问题