我可以在没有网页滚动的情况下更新window.location.hash吗?

Jon*_*ney 26 javascript back-button deep-linking browser-history

使用JavaScript,有没有办法更新window.location.hash而无需滚动网页?

我有可点击的标题元素,可以直接在它们下方切换div的可见性.单击标题但我不希望页面滚动时,我想要历史记录中的/ foo #bar.因此,当离开/ foo #bar导航时,我将能够使用后退按钮,并且在返回时可以看到其ID在window.location.hash中的div.

这种行为可能吗?

Luc*_*lin 37

要在不重新加载/滚动页面的情况下更改哈希,您现在只需使用html5即可history.pushState.

history.pushState(null,null,'#hashexample');
Run Code Online (Sandbox Code Playgroud)

它受到所有主流浏览器的支持:

http://caniuse.com/history

MDN:

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState().C2.A0method

另请注意我们在这里使用的最后一个url参数,它可以是任何url,因此它不仅限于哈希.

  • `replaceState`可能是更好的方式.不同之处是`pushState`会在您的历史记录中添加一个项目,而`replaceState`则不会. (7认同)
  • 哦,我希望我能拥抱你. (6认同)

小智 30

尽可能容易

var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Run Code Online (Sandbox Code Playgroud)

  • 似乎在Chrome中不起作用,或者仅仅是我?在Firefox中使用A1 ... (3认同)
  • 我认为第一行应该是"var scrollmem = $('html,body').scrollTop();" 匹配第三个.否则它在firefox中对我不起作用. (2认同)

Sun*_*nny 22

您可以尝试的另一件事是更改哈希指向临时的元素的id.为我工作!

function changeHashWithoutScrolling(hash) {
  var id = hash.replace(/^.*#/, ''),
      elem = document.getElementById(id)
  elem.id = id+'-tmp'
  window.location.hash = hash
  elem.id = id
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*lem 3

这种行为是很有可能的。您应该研究一些为提供此功能而开发的库。

非常简单的历史: http: //code.google.com/p/reallysimplehistory/ SWFAddress:http://www.asual.com/swfaddress/

  • @shruggernaut 在 09 年写下这个答案时,这比你自己写要好得多。浏览器支持非常分散,这个库允许您专注于创建产品,而不是自己创建库(当时需要实现此功能)。也就是说,我认为 Stackoverflow 应该在某个时候过时答案。特别是对于浏览器等快速移动的平台。 (2认同)