如何在不重新加载页面的情况下修改 URL?

IT技术 javascript html url url-rewriting friendly-url
2020-12-30 23:37:54

有没有一种方法可以在不重新加载页面的情况下修改当前页面的 URL?

如果可能,我想访问# 哈希之前部分

我只需要更改的部分,所以这不像我违反了跨域策略。

 window.location.href = "www.mysite.com/page2.php";  // Sadly this reloads
6个回答

这现在可以在 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 文章

请问response.html的值是多少?那是一串HTML吗?
2021-02-09 23:37:54
什么数据应该传递给“响应”?
2021-02-21 23:37:54
请注意 OP 明确表示他们不会尝试导航到不同的来源“不像我违反了跨域政策。” -- 但是,我正在尝试这样做,并且window.historyAPI不允许通过pushState,进行跨域导航(这是合理的...正如 Mozilla 站点所说,“新 URL 必须与当前 URL 具有相同的来源; 否则, pushState() 将抛出异常。")
2021-02-26 23:37:54

HTML5 引入了history.pushState()history.replaceState()方法,它们分别允许您添加和修改历史条目。

window.history.pushState('page2', 'Title', '/page2.php');

这里阅读更多相关信息

很好的答案,也可以使用 replaceState() 更改当前历史记录而不是添加另一个历史记录;developer.mozilla.org/en-US/docs/Web/API/History_API/...
2021-02-09 23:37:54
IMO 最简单、最干净的解决方案。
2021-03-06 23:37:54

如果您想更改 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);
嘿 kkatusic,这就是 Craig Jacobs 说 TEST 的原因。您通过尝试执行新的 html5 版本(测试 1)来测试它,如果失败,则测试旧版本,如果失败,则说明有问题,如果任一对象的测试成功,则您知道浏览器是新的还是旧的。很简单的逻辑哥们!为克雷格点赞!:)
2021-02-14 23:37:54
这在 Firefox 中不再起作用:操作不安全。
2021-02-26 23:37:54
用户甚至可以用这种方法设置书签,漂亮!我现在可以更新用户输入的 url,他可以直接为他的设置添加书签。
2021-02-27 23:37:54
@GregoryBowers 我不认为 kkatusic 说该方法不存在,他说它在运行时显示安全错误/警告。因此该测试不会失败并且仍会运行该功能。Craig 建议的测试不会“尝试执行新的 html5”函数,它只是检查它是否存在于历史对象中。
2021-03-02 23:37:54
最好先用 if (history.pushState) {} 进行测试,以防旧浏览器。
2021-03-05 23:37:54

注意:如果您使用的是 HTML5 浏览器,那么您应该忽略此答案。现在可以在其他答案中看到这一点。

如果不重新加载页面,就无法在浏览器中修改URLURL 表示上次加载的页面是什么。如果您更改它 ( document.location) 那么它将重新加载页面。

一个明显的原因是,你在上面写了一个www.mysite.com看起来像银行登录页面的网站。然后你把浏览器的 URL 栏改成www.mybank.com. 用户将完全没有意识到他们真的在看www.mysite.com

删除它或添加 html4,因为目前它在谷歌搜索中显示为快速答案
2021-02-22 23:37:54