Javascript 如何在不重新加载页面的情况下修改URL?
有没有一种方法可以在不重新加载页面的情况下修改当前页面的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
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是最简单、最干净的解决方案。