Javascript Chrome中的window.location.hash刷新?
我在网上进行了一些窥探,发现Javascript Chrome中的window.location.hash刷新?,javascript,google-chrome,location,Javascript,Google Chrome,Location,我在网上进行了一些窥探,发现window.location.hash=“etc”是一种广泛采用的方法,可以在不重新加载/刷新页面的情况下更新浏览器的位置。我已经将其应用到了我编造的这个例子中: 在Safari中效果很好,但是 我注意到的是,在Chrome 10+中,更改哈希值时: 有一种类似于重新加载的方式 当用户向下或向上滚动时,产生的症状是打嗝 我的控制台输出将被保留(如果检查控制台,则会输出项目字符串) favicon似乎正在重新加载。 以前有人遇到过这个问题吗?知道修复方法吗?我没有确定
window.location.hash=“etc”
是一种广泛采用的方法,可以在不重新加载/刷新页面的情况下更新浏览器的位置。我已经将其应用到了我编造的这个例子中:
在Safari中效果很好,但是
我注意到的是,在Chrome 10+中,更改哈希值时:
有一种类似于重新加载的方式
当用户向下或向上滚动时,产生的症状是打嗝
我的控制台输出将被保留(如果检查控制台,则会输出项目字符串)
favicon似乎正在重新加载。
以前有人遇到过这个问题吗?知道修复方法吗?我没有确定的答案,但首先我会尝试:
将散列标记(#)前置到值上(即使用window.location.hash=“#etc”)
为处理程序注册一个处理程序
另一方面,如果你想完成的是让后退按钮返回到以前的逻辑位置(你不知道你正在尝试的是什么,你是否想跳转到页面上的一个部分,或者更复杂的东西),你可以考虑使用。
这里最有可能发生两件事:
- favicon和stop/refresh按钮闪烁,原因是(提到了
按钮状态
),但散列更改是无效的
在相同的代码路径上)
- 滚动时出现的轻微问题是因为Chrome会重新绘制整个页面并进行高质量缩放以更新页面缩略图,因为它将哈希更改视为生成新的URL。那也是。您可以在inspector timeline视图中看到这一点,大多数滚动事件会导致窗口宽度x一些小高度的重新绘制,但偶尔会有完整的窗口重新绘制。还有一些细节
这两种方法的一个解决方法是延迟散列的更新,直到用户完成滚动(您仍然可以立即更新显示在当前项下的白色条)。您可以通过以下方式完成此操作:
var scrollTimeout;
window.onscroll = function() {
// update current item display here
if (scrollTimeout)
clearTimeout(scrollTimeout);
scrollTimeout = setTimeout(function() {
scrolTimeout = undefined;
// update hash here
}, 100);
};
因为看起来您正在使用jQuery,所以有一些方法可能会有所帮助
var r='#hello';
if(navigator.userAgent.indexOf('Chrome/')!=-1){
top.history.pushState("", "", r);
return;
};
if(r.charAt(0)=='/'){
top.location.replace(r);
}else{
top.location.hash=r;
};
为我工作。事实上我花了很长时间才弄明白。Firefox现在也支持history
对象,所以我们可能在几年内就可以摆脱整个“散列”的东西
编辑:是的,重新加载是一个Chrome bug。当前跳到锚只有在没有哈希集的情况下才有效。(例如:你的.tld/blog#comment-1)要跳转到一个新的锚点,你必须在应用新的散列(window.location.hash='#comment-2')之前将散列设置为null(window.location.hash=null),然后它才能工作。希望这能帮助别人。