Javascript 我可以在不滚动网页的情况下更新window.location.hash吗?
使用JavaScript,有没有一种方法可以在不滚动网页的情况下更新window.location.hash 我有可点击的标题元素,可以直接在它们下面切换div的可见性。我希望在单击标题时在历史记录中显示/foo#栏,但不希望页面滚动。因此,当导航离开/foo#bar时,我将能够使用“后退”按钮,并使ID位于window.location.hash中的div在返回时可见Javascript 我可以在不滚动网页的情况下更新window.location.hash吗?,javascript,browser-history,back-button,deep-linking,Javascript,Browser History,Back Button,Deep Linking,使用JavaScript,有没有一种方法可以在不滚动网页的情况下更新window.location.hash 我有可点击的标题元素,可以直接在它们下面切换div的可见性。我希望在单击标题时在历史记录中显示/foo#栏,但不希望页面滚动。因此,当导航离开/foo#bar时,我将能够使用“后退”按钮,并使ID位于window.location.hash中的div在返回时可见 这种行为可能吗?这种行为非常可能。您应该查看一些为提供此功能而开发的库 非常简单的历史: SWFAddress:您可以尝试的另
这种行为可能吗?这种行为非常可能。您应该查看一些为提供此功能而开发的库 非常简单的历史:
SWFAddress:您可以尝试的另一件事是临时更改散列点所在元素的id。为我工作
function changeHashWithoutScrolling(hash) {
var id = hash.replace(/^.*#/, ''),
elem = document.getElementById(id)
elem.id = id+'-tmp'
window.location.hash = hash
elem.id = id
}
很容易
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
要在不重新加载/滚动页面的情况下更改哈希,现在只需使用html5
history.pushState
history.pushState(null,null,'#hashexample');
所有主要浏览器都支持它:
MDN:
还要注意,我们在这里使用的最后一个url参数可以是任何url,因此它不限于散列。想在Catherines答案中添加注释,但我还没有代表- 很好的解决方案,但是它在Chrome中作为$('html')不起作用。scrollTop()总是返回0-一个小的编辑就解决了这个问题:
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
根据Sunny的回答,我制作了这个函数,它也避免了未定义和空值:
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;
}
}
}
伟大的除了RSH的现有文档外,这些看起来不错。我认为这件连衣裙看起来是目前最好的选择。我觉得缺少RSH的文档。我使用SWFAddress,到目前为止,它工作得很好。对于这样一个简单的任务来说,这是非常过分的。与添加新的库和依赖项相比,几行代码更可取。@shruggernaut在'09年编写此答案时,这比自己编写更可取。浏览器支持非常分散,该库允许您专注于创建产品,而不是自己创建库(实现此功能时需要创建库)。也就是说,我认为Stackoverflow在某种程度上应该超过答案。特别是对于快速移动的平台,比如浏览器,这真是太棒了。很好用。我想你指的是
document.getElementById(id)代码>谢谢@AlienWebguy,修复了评论中的函数。非常有效。谢谢我认为第一行应该是“var scrollmem=$('html,body').scrollTop();”以匹配第三行。否则,它在firefox中对我不起作用。@Anthony是对的,他不在firefox中工作Sunny function works wellSee和/或我提供了一个基本脚本来解决这个问题。谢谢。我已经检查了这个问题和你的自定义脚本。哦,我希望我能拥抱你。replaceState
可能是更好的方式。区别在于pushState
向您的历史记录中添加了一个项目,而replaceState
没有。完成此操作后,请使用window.location.hash
验证它是否有效