2012-07-13 90 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

相关问题