有没有一种方法可以在不重新加载页面的情况下修改当前页面的 URL?
如果可能,我想访问# 哈希之前的部分。
我只需要更改域后的部分,所以这不像我违反了跨域策略。
window.location.href = "www.mysite.com/page2.php"; // Sadly this reloads
有没有一种方法可以在不重新加载页面的情况下修改当前页面的 URL?
如果可能,我想访问# 哈希之前的部分。
我只需要更改域后的部分,所以这不像我违反了跨域策略。
window.location.href = "www.mysite.com/page2.php"; // Sadly this reloads
这现在可以在 Chrome、Safari、Firefox 4+ 和 Internet Explorer 10pp4+ 中完成!
有关更多信息,请参阅此问题的答案: 使用新 URL 更新地址栏,无需散列或重新加载页面
例子:
function processAjaxData(response, urlPath){
document.getElementById("content").innerHTML = response.html;
document.title = response.pageTitle;
window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
}
然后您可以使用window.onpopstate
来检测后退/前进按钮导航:
window.onpopstate = function(e){
if(e.state){
document.getElementById("content").innerHTML = e.state.html;
document.title = e.state.pageTitle;
}
};
要更深入地了解操纵浏览器历史记录,请参阅此 MDN 文章。
HTML5 引入了history.pushState()
和history.replaceState()
方法,它们分别允许您添加和修改历史条目。
window.history.pushState('page2', 'Title', '/page2.php');
从这里阅读更多相关信息
如果您想更改 url 但不想将条目添加到浏览器历史记录中,您也可以使用 HTML5 replaceState:
if (window.history.replaceState) {
//prevents browser from storing history with each change:
window.history.replaceState(statedata, title, url);
}
这会“破坏”后退按钮的功能。这在某些情况下可能是必需的,例如图片库(您希望后退按钮返回到图库索引页面,而不是返回浏览您查看的每张图片),同时为每个图片提供自己唯一的 url。
这是我的解决方案(newUrl 是您要替换为当前 URL 的新 URL):
history.pushState({}, null, newUrl);
注意:如果您使用的是 HTML5 浏览器,那么您应该忽略此答案。现在可以在其他答案中看到这一点。
如果不重新加载页面,就无法在浏览器中修改URL。URL 表示上次加载的页面是什么。如果您更改它 ( document.location
) 那么它将重新加载页面。
一个明显的原因是,你在上面写了一个www.mysite.com
看起来像银行登录页面的网站。然后你把浏览器的 URL 栏改成www.mybank.com
. 用户将完全没有意识到他们真的在看www.mysite.com
。