我使用哈希来动态加载内容。为了使后退按钮正常工作,我正在捕获哈希更改。然而,有时我需要更改哈希值而不触发哈希更改函数(例如,当页面重定向到服务器端时,我需要在内容返回后更新哈希值。)
我想出的最佳解决方案是取消绑定 hashchange 事件,进行更改,然后重新绑定它。然而,由于这是异步发生的,我发现它重新绑定得太快并且仍然捕获哈希更改。
我目前的解决方案非常糟糕:在 setTimeout 中重新绑定。有人有更好的主意吗?
$(window).unbind( 'hashchange', hashChanged);
window.location.hash = "!" + url;
setTimeout(function(){
$(window).bind( 'hashchange', hashChanged);
}, 100);
Edit:
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;
}
你可以使用history.replaceState
并附加哈希值,以替换当前 URI,而不触发hashchange
event:
var newHash = 'test';
history.replaceState(null, null, document.location.pathname + '#' + newHash);
JSFiddle 示例 https://jsfiddle.net/2zte36c7/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)