2776

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

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

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

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

20 回答 20

2291

这现在可以在 Chrome、Safari、Firefox 4+ 和 Internet Explorer 10pp4+ 中完成!

有关更多信息,请参阅此问题的答案: Updating address bar with new URL without hash or reloading the page

例子:

 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 文章

于 2010-07-28T15:30:31.523 回答
753

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

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

从这里阅读更多相关信息

于 2010-08-17T13:59:35.013 回答
181

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

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

这将“破坏”后退按钮功能。这在某些情况下可能是必需的,例如图片库(您希望后退按钮返回到图库索引页面,而不是返回浏览您查看的每张图片),同时为每张图片提供自己的唯一网址。

于 2012-11-19T10:32:31.463 回答
164

这是我的解决方案(newUrl 是您要替换为当前 URL 的新 URL):

history.pushState({}, null, newUrl);
于 2015-06-10T18:25:35.763 回答
116

注意:如果您使用的是 HTML5 浏览器,则应忽略此答案。从其他答案中可以看出,这现在是可能的。

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

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

于 2009-05-05T10:57:05.867 回答
90
parent.location.hash = "hello";
于 2009-05-13T22:14:44.193 回答
49

在现代浏览器和 HTML5中,有一个名为pushStateon window的方法history。这将更改 URL 并将其推送到历史记录而不加载页面。

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

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

这将更改 URL,但不会重新加载页面。此外,它不会检查页面是否存在,因此如果您执行一些对 URL 做出反应的 JavaScript 代码,您可以像这样使用它们。

此外,还有history.replaceState()一个完全相同的事情,除了它会修改当前历史而不是创建一个新历史!

您也可以创建一个函数来检查是否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');

此外,您可以更改不会重新加载页面的#for 。这就是Angular根据标签<HTML5 browsers用来做SPA的方式......

改变#很容易,像这样:

window.location.hash = "example";

你可以像这样检测它:

window.onhashchange = function () {
  console.log("#changed", window.location.hash);
}
于 2017-07-02T08:03:02.443 回答
28

正如 Vivart 和 geo1701 已经提到的,HTML5 replaceState 就是答案。但是,并非所有浏览器/版本都支持它。 History.js包装了 HTML5 状态特性,并为 HTML4 浏览器提供了额外的支持。

于 2012-11-21T11:09:02.650 回答
27

在 HTML5 之前我们可以使用:

parent.location.hash = "hello";

和:

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

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

于 2014-01-24T08:49:08.117 回答
24

如果您尝试做的是允许用户为页面添加书签/共享页面,并且您不需要它是完全正确的 URL,并且您没有将哈希锚用于其他任何事情,那么您可以分两次执行此操作部分; 你使用的位置。hash 上面讨论的,然后在主页上进行检查,以查找其中包含 hash 锚点的 URL,并将您重定向到后续结果。

例如:

  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/将用户重定向到www.site.com/section/page/6,使用如下内容:

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

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

于 2011-04-19T11:43:59.900 回答
19

下面是在不重新加载页面的情况下更改 URL 的功能。它仅支持 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');
于 2015-10-27T08:33:13.017 回答
15

您可以在应用程序的任何位置使用这个漂亮而简单的功能来执行此操作。

function changeurl(url, title) {
    var new_url = '/' + url;
    window.history.pushState('data', title, new_url);
    
}

您不仅可以编辑 URL,还可以更新标题。

于 2019-11-29T09:48:00.910 回答
13

如果您不只是更改 URL 片段,则任何位置更改(或window.location或)都将导致对该新 URL 的请求。document.location如果您更改 URL,则您更改 URL。

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

于 2009-05-05T10:58:53.303 回答
11

您可以添加锚标记。我在我的网站上使用它,以便我可以使用 Google Analytics 跟踪人们在页面上访问的内容。

我只需添加一个锚标记,然后添加我要跟踪的页面部分:

var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);
于 2009-12-13T22:57:11.873 回答
9

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

自那个答案以来已经过去了将近一年,History.js 成长并变得更加稳定和跨浏览器。现在它可用于管理 HTML5 兼容以及许多仅支持 HTML4 的浏览器中的历史状态。在这个演示中,您可以看到它如何工作的示例(以及能够尝试其功能和限制。

如果你在如何使用和实现这个库方面需要任何帮助,我建议你看一下演示页面的源代码:你会发现它很容易做到。

最后,有关使用哈希(和 hashbang)可能存在的问题的全面解释,请查看Benjamin Lupton 的此链接

于 2013-09-05T13:55:24.220 回答
8

history.pushState()从 HTML 5 History API使用。

有关更多详细信息,请参阅HTML5 历史 API

于 2015-08-15T11:55:32.923 回答
8

您的新网址。

let newUrlIS =  window.location.origin + '/user/profile/management';

从某种意义上说,调用 pushState() 类似于设置 window.location = "#foo",因为两者都会创建并激活与当前文档关联的另一个历史记录条目。但是 pushState() 有几个优点:

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

您可以查看根目录:https ://developer.mozilla.org/en-US/docs/Web/API/History_API

于 2020-07-18T06:34:31.907 回答
1

这段代码对我有用。我在 ajax 的应用程序中使用了它。

history.pushState({ foo: 'bar' }, '', '/bank');

一旦使用 ajax 将页面加载到 ID 中,它会自动更改浏览器 url 而无需重新加载页面。

这是下面的ajax函数。

function showData(){
    $.ajax({
      type: "POST",
      url: "Bank.php", 
      data: {}, 
      success: function(html){          
        $("#viewpage").html(html).show();
        $("#viewpage").css("margin-left","0px");
      }
    });
  }

示例:从任何页面或控制器,如“仪表板”,当我点击银行时,它会使用 ajax 代码加载银行列表,而无需重新加载页面。此时,浏览器 URL 不会更改。

history.pushState({ foo: 'bar' }, '', '/bank');

但是当我将此代码用于 ajax 时,它会更改浏览器 url 而无需重新加载页面。这是下面的完整 ajax 代码。

function showData(){
        $.ajax({
          type: "POST",
          url: "Bank.php", 
          data: {}, 
          success: function(html){          
            $("#viewpage").html(html).show();
            $("#viewpage").css("margin-left","0px");
            history.pushState({ foo: 'bar' }, '', '/bank');
          }
        });
      }
于 2021-01-10T15:02:21.397 回答
0

这就是您无需重新加载即可导航的全部内容

// add setting without reload 
location.hash = "setting";

// if url change with hash do somthing
window.addEventListener('hashchange', () => {
    console.log('url hash changed!');
});

// if url change do somthing (dont detect changes with hash)
//window.addEventListener('locationchange', function(){
//    console.log('url changed!');
//})


// remove #setting without reload 

history.back();

于 2020-06-09T23:07:19.513 回答
-6

简单地使用,它不会重新加载页面,而只是 URL :

$('#form_name').attr('action', '/shop/index.htm').submit();
于 2021-08-05T17:55:21.400 回答