使用 JavaScript,有没有办法在不滚动网页的情况下更新 window.location.hash?
我有可点击的标题元素,可以直接在它们下方切换 div 的可见性。单击标题时我想要历史记录中的 /foo#bar ,但不希望页面滚动。因此,当导航离开 /foo#bar 时,我将能够使用后退按钮并让 ID 在 window.location.hash 中的 div 在返回时可见。
这种行为可能吗?
使用 JavaScript,有没有办法在不滚动网页的情况下更新 window.location.hash?
我有可点击的标题元素,可以直接在它们下方切换 div 的可见性。单击标题时我想要历史记录中的 /foo#bar ,但不希望页面滚动。因此,当导航离开 /foo#bar 时,我将能够使用后退按钮并让 ID 在 window.location.hash 中的 div 在返回时可见。
这种行为可能吗?
要在不重新加载/滚动页面的情况下更改哈希,您现在可以简单地使用 html5 history.pushState
。
history.pushState(null,null,'#hashexample');
所有主流浏览器都支持它:
医疗器械网络:
另请注意,我们在这里使用的最后一个 url 参数,它可以是任何 url,因此不限于哈希。
尽可能简单
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
您可以尝试的另一件事是临时更改哈希指向的元素的 id。为我工作!
function changeHashWithoutScrolling(hash) {
var id = hash.replace(/^.*#/, ''),
elem = document.getElementById(id)
elem.id = id+'-tmp'
window.location.hash = hash
elem.id = id
}
这种行为很有可能。您应该查看一些为您提供此功能而开发的库。
真正简单的历史:http ://code.google.com/p/reallysimplehistory/ SWFAddress:http ://www.asual.com/swfaddress/
想为凯瑟琳的回答添加评论,但我还没有代表 -
Great solution however it wasn't working for me in Chrome as $('html').scrollTop() always returns 0 - a minor edit resolves the issue:
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Bas on the answer from Sunny I made this function that also avoids undefined and nulls:
function changeHashWithoutScrolling(hash) {
var id;
var elem;
id = hash.replace(/^.*#/, '');
if (id) {
elem = document.getElementById(id);
if (elem) {
elem.id = id + '-tmp';
window.location.hash = hash;
elem.id = id;
}
}
}