修改url而不重新加载页面

有什么办法可以修改当前页面的url,而无需重新加载页面?

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

我只需要改变域名的部分,所以它不像我违反跨域政策。

window.location.href = "www.mysite.com/page2.php"; // sadly this reloads 

这现在可以在Chrome,Safari,FF4 +和IE10pp4 +中完成!

请参阅此问题的答案以获取更多信息: 使用新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来检测后退/前进button导航:

 window.onpopstate = function(e){ if(e.state){ document.getElementById("content").innerHTML = e.state.html; document.title = e.state.pageTitle; } }; 

有关操作浏览器历史logging的更深入的介绍,请参阅此MDN文章 。

HTML5引入了history.pushState()history.replaceState()方法,可以分别添加和修改历史条目。

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

阅读更多关于这个从这里

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

在没有重新加载页面的情况下,无法在浏览器中修改URL。 该url代表了上次加载的网页的内容。 如果你改变它(document.location),那么它将重新加载页面。

一个明显的原因是,你在www.mysite.com上写了一个网站,看起来像一个银行login页面。 然后你改变浏览器的url栏www.mybank.com。 用户将完全不知道他们真的在看www.mysite.com。

如果要更改url但不想将条目添加到浏览器历史logging中,也可以使用HTML5 replaceState

 if (window.history.replaceState) { //prevents browser from storing history with each change: window.history.replaceState(statedata, title, url); } 

这将“打破”后退buttonfunction。 在某些情况下,例如图像库(您希望后退button可以返回到图库索引页面,而不是通过您浏览的每个图像返回),同时为每个图像提供自己的唯一url,这可能是必需的。

 parent.location.hash = "hello"; 

这是我的解决scheme:( newUrl是你想要取代当前的新的url)

 history.pushState({}, null, newUrl); 

HTML5 replaceState就是答案,正如Vivart和geo1701所提到的。 但是在所有浏览器/版本中都不支持。 History.js包装HTML5状态function并为HTML4浏览器提供额外的支持。

在HTML5之前,我们可以使用:

 parent.location.hash = "hello"; 

和:

 window.location.replace("http:www.example.com"); 

此方法将重新加载您的页面,但HTML5引入了不应该重新加载页面的history.pushState(page, caption, replace_url)

如果你想要做的是允许用户书签/共享页面,并且你不需要它是完全正确的URL,并且你没有使用哈希锚来做其他事情,那么你可以在两个部分; 您使用上面讨论的location.hash,然后在主页上执行一个检查,查找一个带有哈希锚的URL,并将您redirect到后续结果。

例如:

1)用户在www.site.com/section/page/4上

2)用户做了一些动作,将URL更改为www.site.com/#/section/page/6(使用散列)。 假设你已经将第6页的正确内容加载到了页面中,所以除了散列之外,用户不会太受干扰。

3)用户将此URL传递给其他人或书签

4)其他人或以后的同一用户访问www.site.com/#/section/page/6

5)在www.site.com/上的代码将用户redirect到www.site.com/section/page/6,使用这样的内容:

 if (window.location.hash.length > 0) window.location = window.location.hash.substring(1); 

希望是有道理的! 在某些情况下这是一个有用的方法。

如果您不只是更改URL片段,则任何对loction( window.locationdocument.location )的更改都会导致对该新URL的请求。 如果更改url,则更改url。

如果您不喜欢您当前使用的URL,请使用Apache的mod_rewrite之类的服务器端URL重写技术。

您可以添加定位标记。 我使用这个在我的网站http://www.piano-chords.net/,以便我可以跟踪谷歌分析什么人在网页上访问。; 我只是添加一个锚标签,然后我想追踪的页面的一部分。

 var trackCode = "/#" + urlencode($("myDiv").text()); window.location.href = "http://www.piano-chords.net" + trackCode; pageTracker._trackPageview(trackCode); 

以下是在不重新加载页面的情况下更改URL的function。 它只支持HTML5

  function ChangeUrl(page, url) { if (typeof (history.pushState) != "undefined") { var obj = {Page: page, Url: url}; history.pushState(obj, obj.Page, obj.Url); } else { window.location.href = "homePage"; // alert("Browser does not support HTML5."); } } ChangeUrl('Page1', 'homePage'); 

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

1)这是原文: –

HTML5:更改浏览器URL而不刷新页面。

请参阅MDN文档。

你可以这样做:

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

正如Thomas Stjernegaard Jeppesen指出的那样,您可以使用History.js修改URL参数,同时用户浏览Ajax链接和应用程序。

这个答案已经过去了将近一年了,History.js越来越多,变得更加稳定和跨浏览器。 现在,它可以用来pipe理符合HTML5的历史状态以及许多HTML4浏览器。 在这个演示中,你可以看到一个例子,说明它是如何工作的(以及能够尝试它的function和限制。

如果您需要任何关于如何使用和实现这个库的帮助,我build议你看看演示页的源代码:你会发现这很容易做到。

最后,为了全面解释什么是使用散列(和hashbangs)的问题,请查看Benjamin Lupton的链接 。

有可能没有使用散列,看看现有的jQuery地址插件 :

这里的例子。

请注意,它将在IE中使用散列,没有解决方法。

在现代浏览器和HTML5中,窗口history上有一种叫做pushState的方法。 这将更改URL并将其推送到历史logging,而不加载页面。

你可以像这样使用它,它将需要3个参数,1)状态对象2)标题和URL):

 window.history.pushState({page: "another"}, "another page", "example.html"); 

这将改变url,但不重新加载页面,也不检查页面是否存在,所以如果你的JavaScript代码是反应的URL,你可以像这样的工作。

还有history.replaceState()它完全相同的东西,除了它将修改当前的历史,而不是创build一个新的!

你也可以创build一个函数来检查history.pushState是否存在,然后如下进行:

 function goTo(page, title, url) { if ("undefined" !== typeof history.pushState) { history.pushState({page: page}, title, url); } else { window.location.assign(url); } } goTo("another page", "example", 'example.html'); 

您也可以更改# <HTML5 browsers ,这将不会重新加载页面,这是Angular根据hashtag做SPA的方式…

改变#很容易,做如下:

 window.location.hash = "example"; 

你可以像这样检测它:

 window.onhashchange = function () { console.log("#changed", window.location.hash); } 

使用HTML 5 History API中的history.pushState()

请参阅链接了解更多详情HTML5历史API

使用window.history.pushState("object or string", "Title", "/new-url") ,但它仍然发送新的url请求到服务器

假设你没有试图做一些恶意的事情,你想对自己的url做任何事情都可以用htaccess来搞定。