使用新的URL更新地址栏,而不散列或重新加载页面


643

我梦ed以求的是chrome(开发者通道)实现了一种无需重新加载页面即可通过javascript(地址而不是域)更新地址栏的方法,或者他们确实做到了。

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

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

ps我不是在谈论window.location.hash等。如果上述内容存在,则此问题的答案将不成立。



1
@tobiaskienzler 2009年最初提出该问题时,是不可能的。
大卫·默多克

3
当然不是。但是现在,这些问题要求相同。遗憾的是,另一个人接受了过时的答案(我注意到,您回答了)……您知道吗?让我们以另一种方式
骗人

@tobiaskienzler,另一个问题没有被接受的过时答案。
大卫·默多克

2
@TobiasKienzler这是一个有6年历史的问题,为什么你要打扰这个问题?只需享受惊人的答案,并在您的应用程序中实现它即可。六年来,成千上万的SO用户同意这是一个了不起的问题,请保持原样。
伊玛目阿西迪基奇

Answers:


874

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

这是我阅读的原始文章(发布于2010年7月10日):HTML5:更改浏览器URL而不刷新页面

要更深入地了解pushState / replaceState / popstate(又称HTML5历史API),请参阅MDN文档

TL; DR,您可以执行以下操作:

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

有关基本操作方法,请参阅我的答案,无需重新加载页面即可修改URL


3
嗯,该功能位于WebKit中,并于几个月前登陆< bugs.webkit.org/show_bug.cgi?id=36152 >。好发现!
oldestlivingboy

6
它现在由github使用,而树导航
Valerij 2011年

1
@Vprimachenko:是的。他们偶尔会打断我的后退按钮。
大卫·默多克

现在可以在Chrome,Safari,FF4 +和IE10pp3 +中完成此操作!(摘自David Murdoch对stackoverflow.com/questions/824349/…的回答 )
Zach Lysobey 2011年

11
Protip:您也可以将相对路径与这些功能一起使用(例如../new-url../../new-url。它们似乎至少在Chrome中能达到您的预期。)
Mahn

156

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

document.location.hash = 'lookAtMeNow';

更改完整的URL。Chrome,Firefox,IE10 +

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

上面的操作将在历史记录中添加一个新条目,因此您可以按“后退”按钮进入以前的状态。要在适当位置更改URL而不向历史记录添加新条目,请使用

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

立即尝试在控制台中运行它们!


13
replaceState正是我所需要的,感谢您扩大了最初的回应。
Choylton B. Higginbottom

“域名和协议必须与原始域名相同!” 这样可以防止某些钓鱼网站更改地址栏网址。
瑞克(Rick)

3
您不应将绝对URL传递给此函数。如果这样做,则很可能需要从当前方案,主机和端口动态构建它-仅将其设置为相对URL(“ foo.html”甚至“ /foo.html”时,就需要大量工作”),然后让浏览器来处理。
DimeCadmium

1
@DimeCadmium很好的简化。更新。
Pawel

history.replaceState添加到历史记录ff 66.0b1
azzamsa

33

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

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

9
document.location.href重新加载页面
paullb

1
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?foo=bar';
window.history.pushState({path:newurl},'',newurl);

3
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
MaxiMouse

@MaxiMouse感谢您的耐心等待,我会牢记这一点。
凯文·门德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.