改变散列而不触发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示例