ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

 window.location.href = "www.mysite.com/page2.php";  // this reloads
只是为了让问题更容易理解,例如,当您打开照片时,Facebook 就是这样做的。网址栏更改为直接指向该照片,因此您可以共享网址而不会丢失您在网站中的位置。还记得基于过去十年框架的网站吗?您只能获取主页 url,因为只有内部框架发生了变化。那太可怕了。
虽然 history.pushState() 在这里可能是正确的答案,但在这种情况下(取决于具体情况......)您可能需要考虑使用服务器端重定向(例如通过使用 Apache 的 RewriteRule 指令)的可能性,或者至少知道。只是觉得应该提一下!
window.history.replaceState(null, document.title, "/page2.php") 可能是大多数人正在寻找的。

P
Peter Mortensen

这现在可以在 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;
    }
};

如需更深入地了解如何操纵浏览器历史记录,请参阅 this MDN article


请注意,OP 明确表示他们不尝试导航到不同的来源; “不像我违反跨域政策。” -- 但是,我正在尝试这样做,而 window.history API 不允许通过 pushState 进行跨域导航,(这是合理的......正如 Mozilla 网站所说,“新 URL 必须与当前 URL 同源;否则 pushState() 将抛出异常。")
请问response.html的值是什么?那是一串HTML吗?
应该将哪些数据传递给“响应”?
@EdisonPebojot 当您更改 URL 时,您还应该更改他页面的 html 内容。从哪里获得 HTML 完全取决于开发人员,您不必像本示例中那样做。您还需要支持后退/前进按钮并重新创建页面内容。
是否有任何解决方法可以使用不同的域进行更改?这仅在目标 URL 位于同一域下时有效。
s
squarecandy

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

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

here 阅读有关此内容的更多信息


IMO 最简单、最干净的解决方案。
很好的答案,也可以使用 replaceState() 更改当前历史记录而不是添加另一个历史记录; developer.mozilla.org/en-US/docs/Web/API/History_API/…
我得到A history state object with URL 'file:///C:/Users/.../newUrl' cannot be created in a document with origin 'null' and URL 'file:///C:/Users/.../oldUrl.pdf' 。是因为它是本地磁盘 URL 吗?
如果我使用 null 作为 pushState() 的第一个参数会发生什么?
G
George Filippakos

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

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

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


P
Peter Mortensen

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

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

最好先用 if (history.pushState) {} 进行测试,以防万一旧浏览器。
这在 Firefox 中不再起作用:操作不安全。
而且用户甚至可以用这种方式设置书签,漂亮!我现在可以更新用户输入的 url,他可以直接为他的设置添加书签。
嘿 kkatusic,这就是 Craig Jacobs 说 TEST 的原因。您通过尝试执行新的 html5 版本(测试 1)对其进行测试,如果失败,则测试旧版本,如果失败,则表示有问题,如果任一对象的测试成功,那么您就知道浏览器是新的还是旧的。很简单的逻辑哥们!为克雷格点赞! :)
@GregoryBowers 我不认为 kkatusic 说该方法不存在,他说它在运行时显示安全错误/警告。这样该测试就不会失败,并且仍然会运行该功能。 Craig 建议的测试没有“尝试执行新的 html5”功能,它只是检查它是否存在于历史对象中。
P
Peter Mortensen

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

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

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


删除它或添加 html4,因为目前它在谷歌搜索中显示为快速答案
M
Martin.
parent.location.hash = "hello";

我想更改 URL,而不仅仅是哈希 - #mydata
更改哈希值在 ajax 中很有用,因为它是一种不使用 cookie 的状态,可添加书签,并且与浏览器后退按钮兼容。 Gmail 现在使用它来使其对浏览器更加友好。
@Jarvis:有什么区别?
@noisy 服务器端跟踪无法看到哈希,除非明确发送到跟踪服务。
这只是部分回答了这个问题。我们希望改变 url,而不是哈希。
t
turivishal

在现代浏览器和 HTML5 中,窗口 history 上有一个名为 pushState 的方法。这将更改 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');

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

更改 # 非常简单,如下所示:

window.location.hash = "example";

你可以像这样检测它:

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

在这种情况下,window.onhashchangewindow.onpopstate 会做同样的事情吗?
如何加载页面内容?它只是替换了 URL
像通常使用 ajax 一样加载内容。
T
Thomas Stjernegaard Jeppesen

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


P
Patrioticcow

在 HTML5 之前我们可以使用:

parent.location.hash = "hello";

和:

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

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


history.pushState(..) 的问题是,如果您想重定向到另一个域,跨域策略就会生效。使用window.location.replace(..)重定向到另一个域是可能的。
J
JoSSte

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

例如:

用户在 www.site.com/section/page/4 用户执行一些操作将 URL 更改为 www.site.com/#/section/page/6(带有哈希)。假设您已将第 6 页的正确内容加载到页面中,因此除了散列之外,用户不会受到太大干扰。用户将此 URL 传递给其他人,或为其添加书签 其他人或同一用户在以后访问 www.site.com/#/section/page/6 www.site.com/ 上的代码重定向用户到 www.site.com/section/page/6,使用如下内容:

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

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


O
Onur A.

下面是在不重新加载页面的情况下更改 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');

@Green,页面是您要移动到的状态的简短标题。 Firefox 当前忽略此参数,尽管它可能在未来使用它。在此处传递空字符串应该可以安全地防止将来对该方法进行更改。来自:developer.mozilla.org/en-US/docs/Web/API/…
t
turivishal

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

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

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


即使对主播来说也很有魅力window.history.pushState('data', 'Title', '#new_location');
为什么不在 pushState 中使用 'title' 参数作为标题?
G
Gumbo

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

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


我可以使用“location.pathname”吗?
不,更改该属性也会导致请求。
J
Jean-François Fabre

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

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

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

E
Erenor Paz

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

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

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

最后,有关使用哈希(和 hashbang)可能存在的问题的全面说明,请查看 Benjamin Lupton 的 this link


P
Peter Mortensen

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

有关详细信息,请参阅 HTML5 History API


V
Vinay Kaithwas

您的新网址。

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


请添加对 pushState 的所谓“优势”的引用:)
W
Webdeveloper011

这段代码对我有用。我在 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');
          }
        });
      }

C
Community

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

// 添加设置而不重新加载 location.hash = "setting"; // 如果 url 用 hash 改变,做 somthing window.addEventListener('hashchange', () => { console.log('url hash changed!'); }); // 如果 url 改变做一些事情(不检测哈希变化) //window.addEventListener('locationchange', function(){ // console.log('url changed!'); //}) // 删除 #setting无需重新加载 history.back();


“如果可能,我想访问 之前 # 散列的部分。”
J
James Bond

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

$('#form_name').attr('action', '/shop/index.htm').submit();

这没有任何意义
即使问题中从未提到过 jQuery,这也需要 jQuery。这会在 <form> 上调用 submit,默认情况下会重新加载页面,而该页面被明确要求避免。 “它不会重新加载页面,而只是 URL” 保证为 false。为什么将其发布为该问题的答案?