Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不重新加载页面的情况下修改URL?_Javascript_Html_Url_Url Rewriting_Friendly Url - Fatal编程技术网

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

Javascript 如何在不重新加载页面的情况下修改URL?,javascript,html,url,url-rewriting,friendly-url,Javascript,Html,Url,Url Rewriting,Friendly Url,有没有一种方法可以在不重新加载页面的情况下修改当前页面的URL 如果可能的话,我想访问散列之前的部分 我只需要更改域后的部分,这样就不会违反跨域策略 window.location.href = "www.mysite.com/page2.php"; // Sadly this reloads 注意:如果你使用的是HTML5浏览器,那么你应该忽略这个答案。从其他答案中可以看出,这是可能的 如果不重新加载页面,则无法在浏览器中修改。URL表示最后加载的页面是什么。如果将其更改为documen

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

如果可能的话,我想访问散列之前的部分

我只需要更改域后的部分,这样就不会违反跨域策略

 window.location.href = "www.mysite.com/page2.php";  // Sadly this reloads
注意:如果你使用的是HTML5浏览器,那么你应该忽略这个答案。从其他答案中可以看出,这是可能的

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


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

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


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

您可以添加锚定标记。我在我的网站上使用它,这样我就可以通过谷歌分析跟踪人们在页面上访问的内容

parent.location.hash = "hello";
我只需添加一个锚定标记,然后添加我要跟踪的页面部分:

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

现在可以在Chrome、Safari、Firefox 4+和InternetExplorer10pp4+中完成

有关更多信息,请参阅此问题的答案:

例如:

 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;
    }
};
要更深入地了解如何操纵浏览器历史记录,请参阅。

HTML5介绍了和方法,它们允许您分别添加和修改历史记录条目

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

中了解更多信息如果您尝试的是允许用户为页面添加书签/共享页面,而您不需要它是正确的URL,并且您没有使用哈希锚来做任何其他事情,那么您可以分两部分来做;你使用这个位置。上面讨论的散列,然后在主页上实现检查,以查找包含散列锚点的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,如下所示:

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');
window.onhashchange = function () {
  console.log("#changed", window.location.hash);
}
如果window.location.hash.length>0{ window.location=window.location.hash.substring1; }

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

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

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

这将“破坏”后退按钮的功能。在某些情况下可能需要这样做,例如图像库中,您希望“后退”按钮返回到库索引页,而不是返回查看的每个图像,同时为每个图像提供自己的唯一url。

如Vivart和geo1701所述,HTML5替换状态就是答案。但是,并非所有浏览器/版本都支持它。
包装HTML5状态功能并提供对HTML4浏览器的额外支持。

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

这个答案已经过去了将近一年,History.js不断发展,变得更加稳定,可以跨浏览器使用。现在,它可以用于管理HTML5兼容浏览器以及许多仅HTML4浏览器中的历史状态。您可以看到一个示例,说明它是如何工作的,并且可以尝试它的功能和限制

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


最后,要全面解释使用哈希和hashbang的问题,请查看Benjamin Lupton的文章

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

parent.location.hash = "hello";
以及:


此方法将重新加载您的页面,但HTML5引入了history.pushStatepage、caption、replace\u url,不应重新加载您的页面。

这是我的解决方案newUrl是您要用当前url替换的新url:

history.pushState({}, null, newUrl);
使用HTML5历史API中的history.pushState


有关更多详细信息,请参阅。

下面是在不重新加载页面的情况下更改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');
在现代浏览器和HTML5中,有一种称为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');
window.onhashchange = function () {
  console.log("#changed", window.location.hash);
}

此外,您还可以更改for,您可以在应用程序的任何位置使用此漂亮而简单的函数

function changeurl(url, title) {
    var new_url = '/' + url;
    window.history.pushState('data', title, new_url);
    
}
您不仅可以编辑URL,还可以随URL一起更新标题。

这就是您在不重新加载的情况下导航所需的全部内容

//添加设置而不重新加载 location.hash=设置; //如果url随哈希值更改,请执行以下操作 window.addEventListener'hashchange',=>{ 日志“url哈希已更改!”; }; //如果url更改,请不要使用哈希检测更改 //window.addEventListener'locationchange',函数{ //console.log'url已更改!'; //} //删除设置而不重新加载 历史回顾 你的新网址

let newUrlIS =  window.location.origin + '/user/profile/management';
在某种意义上,调用pushState类似于设置window.location=foo,因为两者都将创建和激活与当前文档关联的另一个历史记录条目。但pushState有几个优势:

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

您可以查看根目录:

这段代码适合我。我在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');
          }
        });
      }

我可以使用location.pathname吗?不,更改该属性也会导致请求。我想更改URL,而不仅仅是哈希-MyDataChange哈希在ajax中很有用,因为它是一种不使用cookies的状态,可以添加书签,并且与浏览器后退按钮兼容。Gmail现在使用它使浏览器更友好。@Jarvis:有什么区别吗?@Noised Server-side tracking无法查看哈希,除非显式发送到跟踪服务。如果您使用的是基于哈希路由的mvc框架,例如主干,这是没有用的。为了更容易理解这个问题,例如,当你打开一张照片时,Facebook就是这么做的。url栏更改为直接指向该照片,因此您可以共享url,而不会丢失您在站点中的位置。还记得过去十年基于框架的网站吗?您只能获取主页url,因为只有内部框架在更改。这太可怕了。虽然history.pushState可能是正确的答案,但在这种情况下,取决于具体情况。。。使用服务器端重定向(如使用Apache的ReWrruleRead指令)的可能性是您可能需要考虑的,或者至少应该注意到。只是觉得应该提一下@绿色,页面是您要移动到的州的简短标题。Firefox目前忽略此参数,尽管将来可能会使用它。在这里传递空字符串应该是安全的,以防将来对方法进行更改。From:最好先用if history.pushState{}进行测试,以防旧浏览器出现。在Firefox中,这将不再有效:操作不安全。用户甚至可以用这种方法设置书签,漂亮!我现在可以在用户输入时更新url,他可以直接为他的设置添加书签。嘿,卡图西奇,这就是克雷格·雅各布斯说测试的原因。您可以通过尝试执行新的html5版本测试1来测试它,如果测试失败,您将测试旧版本,如果测试失败,您将遇到问题,如果测试成功,您将知道浏览器是新的还是旧的。很简单的逻辑,伙计!投票给克雷格@GregoryBowers我不认为kkatusic是说该方法不存在,他说它在运行时显示了一个安全错误/警告。这样测试就不会失败,并且仍然可以运行函数。Craig建议的测试并没有尝试执行新的html5函数,它只是检查历史对象中是否存在该函数。。就是说,如果您想重定向到另一个域,跨域策略将生效。当使用window.location.replace..时,可以重定向到另一个域。window.onhashchange和window.onpopstate在这种情况下也可以这样做吗?如何加载页面内容?它只是取代了URLLoad内容,就像你通常使用ajax做的那样
n表示锚窗口。历史。pushState'data','Title','new_location';为什么不在pushState中使用“title”参数作为title?请添加对pushState假定优势的引用:请注意,OP明确表示他们没有尝试导航到其他来源;不像我违反了跨域策略。-但是,我正在尝试这样做,并且不允许通过pushState进行跨原点导航,这是合理的。。。正如Mozilla网站所说,新的URL必须与当前的URL来源相同;否则,pushState将引发异常。我可以问response.html的值是多少吗?这是一个HTML字符串吗?应该向响应传递哪些数据?IMO是最简单、最干净的解决方案。