改变散列而不触发hashchange事件

我正在使用哈希dynamic加载内容。 为了使后退button工作,我正在捕获哈希更改。 但有时我需要更改散列而不触发散列更改函数(例如,当页面被redirect到服务器端,并且在内容返回时我需要更新散列)。

我提出的最好的解决scheme是取消绑定hashchange事件,进行更改,然后重新绑定它。 然而,由于这是asynchronous发生的,我发现它重新绑定的速度太快,而且还能捕捉到哈希值的变化。

目前我的解决scheme非常差:以setTimeout重新绑定。 有没有人有更好的主意?

$(window).unbind( 'hashchange', hashChanged); window.location.hash = "!" + url; setTimeout(function(){ $(window).bind( 'hashchange', hashChanged); }, 100); 

编辑:
Amir Raminfar的build议促使我提出了一个不需要超时的解决scheme。 我添加了一个类variables

 _ignoreHashChange = false; 

当我想默默地改变哈希值时,我这样做:

 _ignoreHashChange = true; window.location.hash = "!" + url; 

和哈希改变事件做到这一点:

 function hashChanged(event){ if(_ignoreHashChange === false){ url = window.location.hash.slice(2); fetchContent(url); } _ignoreHashChange = false; } 

你可以有这样的function:

 function updateHash(newHash){ ... oldHash = newHash } 

然后在你的setTimeOut你需要做的

 function(){ if(oldHash != currenHash){ updateHash(currenHash); } } 

所以现在你可以手动调用更新散列,而不会被事件触发。 你也可以在updateHash中有更多的参数来做其他事情。

顺便问一下,你看了jQuery的历史插件? http://tkyk.github.com/jquery-history-plugin/

您可以使用history.replaceState并附加散列,以replace当前URI而不触发hashchange事件:

 var newHash = 'test'; history.replaceState(null, null, document.location.pathname + '#' + newHash); 

JSFiddle示例