提问人:David Murdoch 提问时间:7/27/2010 最后编辑:CommunityDavid Murdoch 更新时间:2/8/2022 访问量:563769
使用新 URL 更新地址栏(不带哈希值)或重新加载页面 [duplicate]
Updating address bar with new URL without hash or reloading the page [duplicate]
问:
我要么梦想着 chrome(开发频道)实现一种通过 javascript(路径,而不是域)更新地址栏而无需重新加载页面的方法,要么他们真的做到了这一点。
但是,我找不到我认为我读过的文章。
我是疯了还是有办法做到这一点(在 Chrome 中)?
p.s. 我不是在谈论 window.location.hash 等。如果存在上述情况,这个问题的答案将是不正确的。
答:
您现在可以在大多数“现代”浏览器中执行此操作!
这是我读到的原始文章(发布于 2010 年 7 月 10 日):HTML5:在不刷新页面的情况下更改浏览器 URL。
要更深入地了解 pushState/replaceState/popstate(又名 HTML5 历史 API),请参阅 MDN 文档。
TL的;DR,您可以执行以下操作:
window.history.pushState("object or string", "Title", "/new-url");
请参阅我的回答 在不重新加载页面的情况下修改 URL,了解基本操作方法。
评论
../new-url
../../new-url
window.replaceState
pushState
onpopstate
state
state
pushState()
state
popstate
state
state
state
"object or string"
仅更改哈希之后的内容 - 旧浏览器
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');
立即尝试在控制台中运行这些!
评论
replaceState
这正是我需要的,感谢您扩展原始回复。
history.replaceState
添加到FF 66.0B1的历史
更新了 Davids 答案,甚至可以检测不支持 pushstate 的浏览器:
if (history.pushState) {
window.history.pushState(stateObj, "title", "url");
} else {
window.history.replaceState(stateObj, "title**", 'url');
// ** It seems that current browsers other than Safari don't support pushState
// title attribute. We can achieve the same thing by setting it in JS.
document.title = "Title";
}
状态Obj
state 对象是一个 JavaScript 对象,它与传递给 replaceState 方法的历史记录条目相关联。state 对象可以为 null。
标题
大多数浏览器目前都忽略了这个参数,尽管它们将来可能会使用它。在此处传递空字符串应该是安全的,不会将来对方法进行更改。或者,您可以传递该州的简短头衔。
url 可选
历史记录条目的 URL。新 URL 必须与当前 URL 的来源相同;否则 replaceState 将引发异常。
评论
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?foo=bar';
window.history.pushState({path:newurl},'',newurl);
评论