【发布时间】:2010-11-05 14:17:31
【问题描述】:
我正在使用哈希来动态加载内容。为了使后退按钮起作用,我正在捕获哈希更改。但是有时我需要在不触发散列更改函数的情况下更改散列(例如,当页面被重定向到服务器端时,我需要在内容返回后更新散列。)
我想出的最佳解决方案是取消绑定 hashchange 事件,进行更改然后重新绑定它。但是,由于这种情况是异步发生的,我发现它重新绑定太快并且仍然捕获哈希更改。
我目前的解决方案很差:在 setTimeout 中重新绑定。有人有更好的主意吗?
$(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;
}
【问题讨论】:
-
你可能想看看 Cowboy 的 BBQ 库,它让你可以很好地控制 Back 和 Hashchange:benalman.com/code/projects/jquery-bbq/docs/files/…
-
一个不错的简单解决方案,您应该将其作为答案
-
唯一剩下的就是在设置_ignoreHashChange=true之前检查新的哈希值不等于旧的哈希值;
-
你在哪里定义 hashChanged 事件?
-
存储 _ignoreHashChange 的原始值并重置为该值可能会更好。例如
var _ = _ignoreHashChange; [...]; _ignoreHashChange = _
标签: javascript jquery