30

访问stackoverflow.com/#_=_window.location.hash评估为#_=_。美好的。

现在执行window.location.hash = ''清除哈希,URL 变为stackoverflow.com/#. (注意尾随#。)

为什么#inwindow.location.hash不一致地包含或排除?如何在#不重新加载页面的情况下从 URL 中删除?

MDN

[哈希是] URL 中 # 符号之后的部分,包括 # 符号。

但对于空散列,情况并非如此。)

4

3 回答 3

57

要回答第二个问题(删除#不刷新页面):

history.pushState('', document.title, window.location.pathname);
于 2013-03-10T14:19:26.707 回答
4

回答你的第一个问题:

根据Mozilla.org中的window.location 文档: “URL 中 # 符号之后的部分,如果有的话,包括 # 符号。 如果 url 不包含 # 或 # 后没有任何内容,则为空字符串。 "

奇怪的是,该文件刚刚在 2013 年 4 月 8 日更新。不确定是否在您检查文档后添加。

顺便说一句(并参考答案), window.location.hash 和 pushState 是不同的概念,尽管密切相关。

于 2013-04-09T18:48:27.597 回答
0

有两件事推动了这种行为:

  • “设置散列属性导航到命名的锚点,而无需重新加载文档。” (这里
  • “当您设置位置对象或其任何属性时,除了 hash[...] 在 JavaScript 1.1 及更高版本中,设置位置的效果取决于用户通过网络将文档与原始文档进行比较的设置。” (这里

所以基本上,设置 hash 属性不应该导致重新加载,设置任何其他属性应该导致重新加载(或者可能是 E-Tag/modified-since 标头检查,具体取决于浏览器设置)。

我假设为了保持一致性,浏览器构建器将设置一个空的哈希值转换为将“#”设置为哈希值。这样,地址栏中的 url 不会导致重新加载。但后半部分纯属猜测。

于 2013-03-10T14:04:18.217 回答