使用新 URL 更新地址栏而不使用哈希或重新加载页面 [重复]

Posted

技术标签:

【中文标题】使用新 URL 更新地址栏而不使用哈希或重新加载页面 [重复]【英文标题】:Updating address bar with new URL without hash or reloading the page [duplicate] 【发布时间】:2011-03-21 07:11:22 【问题描述】:

我要么梦想 chrome(开发通道)实现一种通过 javascript(路径,而不是域)更新地址栏而不重新加载页面的方法,要么他们真的做到了。

但是,我找不到我认为读过的文章。

我疯了还是有办法做到这一点(在 Chrome 中)?

附言我不是在谈论 window.location.hash 等。如果上述存在the answer to this question 将是不真实的。

【问题讨论】:

@tobiaskienzler 当这个问题最初是在 2009 年被问到时,这是不可能的。 当然不是。但现在是,questions 要求相同。可惜对方接受了一个过时的答案(你,我注意到了)......你知道吗?让我们反过来说,没有人说“原始”必须是旧的,实际上有先例 @tobiaskienzler,另一个问题没有过时的公认答案。 好的,没有过时,但更复杂。尽管如此,这两个问题在我看来确实几乎相同,但也许我在这里遗漏了细微差别...... @TobiasKienzler 这是一个已有 6 年历史的问题,您为什么要为这个问题烦恼?只需享受惊人的答案并将其实施到您的应用程序中即可。 6 年来,成千上万的 SO 用户一致认为这是一个了不起的问题,请保持原样。 【参考方案1】:

您现在可以在大多数“现代”浏览器中执行此操作!

这是我阅读的原始文章(2010 年 7 月 10 日发布):html5: Changing the browser-URL without refreshing page。

如需更深入地了解 pushState/replaceState/popstate(又名 HTML5 History API)see the MDN docs。

TL;DR,你可以这样做:

window.history.pushState("object or string", "Title", "/new-url");

请参阅我对Modify the URL without reloading the page 的回答,了解基本操作方法。

【讨论】:

啊,这个功能在 WebKit 中并在几个月前登陆 bugs.webkit.org/show_bug.cgi?id=36152>。很好的发现! 这个现在被github使用了,而树形导航 @Vprimachenko:是的。他们每隔一段时间就会打破我的后退按钮。 Protip:您也可以在这些函数中使用相对路径(例如 ../new-url../../new-url。它们似乎至少在 Chrome 中符合您的预期。 我想补充一点,window.replaceState 更容易设置并且通常更可取,例如当您想在用户更改某些下拉列表或搜索字段的值后更新 URL 时。如果要使用pushState,那么还需要适当支持onpopstate事件。【参考方案2】:

仅更改哈希后的内容 - 旧浏览器

document.location.hash = 'lookAtMeNow';

更改完整网址。 Chrome、火狐、IE10+

history.pushState('data to be passed', 'Title of the page', '/test');

以上将在历史记录中添加一个新条目,因此您可以按“返回”按钮返回上一个状态。要在不向历史添加新条目的情况下更改 URL,请使用

history.replaceState('data to be passed', 'Title of the page', '/test');

现在尝试在控制台中运行这些!

【讨论】:

replaceState 正是我所需要的,感谢您扩展原始回复。 '域名和协议必须和原来的一样!'这可以防止某些钓鱼网站更改地址栏网址。 您不应将绝对 URL 传递给此函数。如果这样做,您很可能需要从当前方案、主机和端口动态构建它——当您可以将其设为相对 URL(“foo.html”甚至“/foo.html ") 并让浏览器处理它。 @DimeCadmium 很好的简化。已更新。 history.replaceState 添加到 ff 66.0b1 中的历史记录【参考方案3】:

更新 Davids 的答案,甚至可以检测不支持 pushstate 的浏览器:

if (history.pushState) 
  window.history.pushState("object or string", "Title", "/new-url");
 else 
  document.location.href = "/new-url";

【讨论】:

document.location.href 重新加载页面【参考方案4】:
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?foo=bar';
window.history.pushState(path:newurl,'',newurl);

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 @MaxiMouse 感谢您的支持,我会记住的。 建议编辑: const url = new URL(window.location); url.searchParams.set('foo', 'bar'); window.history.pushState(, '', url);

以上是关于使用新 URL 更新地址栏而不使用哈希或重新加载页面 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

更改浏览器中的 URL 而不使用 JavaScript 加载新页面

在移动浏览器上隐藏地址/导航栏而不需要滚动内容?

如何使用新的 url 和一些参数重新加载数据表而不重新初始化它

在 iOS 7 中更新导航栏而不更改视图

如果 url 中的所有更改都是哈希,如何强制页面重新加载?

HTML5 History对象,Javascript修改地址栏而不刷新页面