2012-07-13 94 views
8

我使用history.js,我有一個事件處理程序如何更改狀態而不觸發history.js中的statechange?

$(window).bind('statechange', function(){ 
    // Loads the content representing the state via ajax 
}); 

大多數內容變化觸發了History.pushState([...])當用戶點擊一個鏈接或按鈕。

但是在某些情況下,內容更改是由JavaScript直接管理的(即通過更改,添加或刪除DOM元素),並且不需要通過ajax加載表示新狀態的內容。

不過,我需要推動的狀態並更改URL以反映新的狀態,如果用戶重新加載命中或以後想使用後退按鈕等

所以我的問題是:如何做我推在某些情況下避免加載內容的狀態?是否有一種標誌可以傳遞給statechange事件處理程序,或者我可以完全繞過它嗎?

回答

7

我也想知道這個問題。我的決定是使用全局變量。舉例來說,你可以初始化window.stateChangeIsLocal爲假:

window.stateChangeIsLocal = false; 

statechange處理器可以看起來像這樣:

History.Adapter.bind(window,'statechange',function(){ 
    if (!window.stateChangeIsLocal) { 
     someAjaxLoadFunction(History.getState().url); 
    } 
    else { 
     window.stateChangeIsLocal = false; 
    } 
}); 

當您更改狀態,不希望加載的內容一個新的狀態,只需將window.stateChangeIsLocal設置爲true;

也許有一些更優雅的解決方案,但我找不到它們並使用它。

+0

我自己的解決方案是類似的,除了我設置全局歷史對象的屬性。有關此問題的更多信息,另請參閱此問題(http://stackoverflow.com/questions/8744487/statechange-is-firing-whenever-i-do-a-push-state?rq=1)。 – jgivoni 2012-10-19 18:52:45

相關問題