Javascript 在不触发hashchange事件的情况下更改哈希
我正在使用哈希动态加载内容。为了使后退按钮工作,我正在捕获哈希更改。然而,有时我需要在不触发hash changed函数的情况下更改hash(例如,当页面被重定向到服务器端时,我需要在内容返回后更新hash) 我提出的最佳解决方案是解除hashchange事件的绑定,进行更改,然后重新绑定它。但是,由于这种情况是异步发生的,我发现它重新绑定的速度太快,仍然捕获哈希更改 目前我的解决方案非常糟糕:在setTimeout中重新绑定。有人有更好的主意吗Javascript 在不触发hashchange事件的情况下更改哈希,javascript,jquery,Javascript,Jquery,我正在使用哈希动态加载内容。为了使后退按钮工作,我正在捕获哈希更改。然而,有时我需要在不触发hash changed函数的情况下更改hash(例如,当页面被重定向到服务器端时,我需要在内容返回后更新hash) 我提出的最佳解决方案是解除hashchange事件的绑定,进行更改,然后重新绑定它。但是,由于这种情况是异步发生的,我发现它重新绑定的速度太快,仍然捕获哈希更改 目前我的解决方案非常糟糕:在setTimeout中重新绑定。有人有更好的主意吗 $(window).unbind( 'h
$(window).unbind( 'hashchange', hashChanged);
window.location.hash = "!" + url;
setTimeout(function(){
$(window).bind( 'hashchange', hashChanged);
}, 100);
编辑:
Amir Raminfar的建议促使我提出了一个不需要超时的解决方案。 我添加了一个类变量
_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 updateHash(newHash){
...
oldHash = newHash
}
然后在setTimeOut中,您需要执行以下操作
function(){
if(oldHash != currenHash){
updateHash(currenHash);
}
}
因此,现在您可以手动调用updatehash,它不会被事件触发。您还可以在updateHash中使用更多参数来执行其他操作
顺便问一下,你看过jquery历史插件了吗 您可以使用
history.replaceState
并附加哈希,以替换当前URI,而不触发hashchange
事件:
var newHash = 'test';
history.replaceState(null, null, document.location.pathname + '#' + newHash);
需要设定一个时间间隔,但原则上这是可行的。谢谢。是的,我看过几个插件。对于我的需求来说,它们都太臃肿或太多了。你促使我找到了一个不需要暂停的更好的解决方案。有关详细信息,请参见我的主要帖子中的编辑。感谢您的帮助您可能想查看Cowboy的BBQ库,它可以让您很好地控制所有返回的内容和Hashchange:一个好的、简单的解决方案,您应该将其作为一个答案唯一剩下的事情是在设置_ignoreHashChange=true之前检查新的哈希是否与旧的哈希不相等;您在哪里定义hashChanged事件?最好存储_ignoreHashChange的原始值并重置为该值。e、 g.
var=ignoreHashChange;[...]; _ignoreHashChange=.
history.replaceState
也不会将hashchange推送到历史记录中,但如果需要,可以使用history.pushState
;)