2011-08-14 79 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); 
} 
相關問題