访问stackoverflow.com/#_=_
,window.location.hash
评估为#_=_
。细
现在执行window.location.hash = ''
清除哈希值,网址变为stackoverflow.com/#
。 (注意尾随#
。)
为什么#
中的window.location.hash
不一致包含或排除?如何在不重新加载页面的情况下从URL中删除#
?
(MDN说
[哈希]是#符号后面的URL的一部分,包括#符号。
但是在空哈希的情况下情况并非如此。)
答案 0 :(得分:55)
要回答第二个问题(在没有页面刷新的情况下删除#
):
history.pushState('', document.title, window.location.pathname);
答案 1 :(得分:4)
回答你的第一个问题:
根据Mozilla.org中的window.location doc:“#符号后面的URL部分,如果有符号,则包括#符号。如果网址符号,则为空字符串不包含#或在#。“
之后没有任何内容奇怪的是,该文件刚刚于2013年4月8日更新。检查文档后,不确定是否添加了。
顺便说一下(并参考答案),window.location.hash和pushState是不同的概念,虽然密切相关。
答案 2 :(得分:0)
推动此行为有两件事:
所以基本上,设置hash属性永远不应该导致重新加载,设置任何其他属性应该导致重新加载(或者可能是E-Tag / modified-since标头检查,具体取决于浏览器设置)。
我认为为了保持一致性,浏览器构建器会将设置空哈希,将'#'设置为哈希。这样,位置栏中的URL不会导致重新加载。但后一部分是纯粹的推测。
答案 3 :(得分:-1)
两周前我一直在处理同样的问题,我的结论是没有好的解决方案。没有直接的解决方案,从URL中删除散列总是迫使浏览器重新加载页面,即使有一个类似于黑客的解决方案,我宁愿在url的末尾使用哈希而不是使用模糊的解决方案。