使用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');
它被所有主要浏览器支持:
MDN:
请注意,这里使用的最后一个 URL 参数可以是任何 URL,因此不仅限于哈希值。replaceState
可能是更好的选择。 pushState
会将一个项目添加到历史记录中,而 replaceState
则不会。 - A Fwindow.location.hash
进行验证,它可以正常工作。 - Barbz_YHOOL简单易懂
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
你可以尝试的另一件事是暂时更改哈希指向的元素的ID。对我有效!
function changeHashWithoutScrolling(hash) {
const id = hash.replace(/^.*#/, "")
const elem = document.getElementById(id)
if (elem) {
elem.id = id + "-tmp"
window.location.hash = hash
elem.id = id
}
}
document.getElementById(id);
。 - AlienWebguy根据Sunny的回答,我制作了这个函数,也避免了undefined和null:
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;
}
}
}
这种行为是完全可能的。你应该查找一些已开发的库,以提供此功能。
真正简单的历史记录: http://code.google.com/p/reallysimplehistory/ SWFAddress: http://www.asual.com/swfaddress/
我想在Catherine的回答下添加评论,但我还没有足够的声望 -
这是一个很好的解决方案,但在Chrome中对我不起作用,因为$('html').scrollTop()总是返回0 - 进行微小的编辑即可解决问题:
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);