有没有方法可以在不重新加载页面的情况下修改当前页面的URL?
如果可能的话,我想访问哈希前的部分。
我只需要更改域后的部分,所以这不像是违反跨域策略。
1
| window.location.href="www.mysite.com/page2.php"; // Sadly this reloads |
- 你可以在闪光灯下完成。你只需要一个小的后台应用程序,然后将你的javascript传递到flash来修改位置栏。
- 不使用散列是可能的,请看一下asual jquery地址插件:这里的示例。注意,它将在IE中使用散列,没有解决方法。
- 为了更容易理解这个问题,例如,当你打开一张照片时,Facebook就是这样做的。URL栏会更改为直接指向该照片,因此您可以共享该URL,而不会丢失您在网站中的位置。还记得过去十年基于框架的网站吗?您只能获取主页URL,因为只有内部框架在更改。这太可怕了。
现在可以在Chrome、Safari、Firefox 4+和Internet Explorer 10pp4+中完成!
有关详细信息,请参阅此问题的答案:使用新的URL更新地址栏,而不使用哈希或重新加载页面
例子:
1 2 3 4 5
| 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检测后退/前进按钮导航:
1 2 3 4 5 6
| window.onpopstate = function(e){
if(e.state){
document.getElementById("content").innerHTML = e.state.html;
document.title = e.state.pageTitle;
}
}; |
要更深入地了解操纵浏览器历史记录,请参阅本文MDN。
- @manakor"现在可以在chrome、safari、ff4+和ie10pp3+中完成!"…看起来会的。
- 那么Facebook在IE7中是如何做到的呢?
- 遗憾的是,这不适用于IE9。
- @Chirilo签出history.js,它为不支持HTML5 History API的浏览器提供了一个回退。
- @如果在某个地方的URL中有一个登录,那么这个技巧已经存在多年了。
- "ie10pp4+"的"pp4+"部分是什么意思?
- 平台预览4
- 按钮是否应调用"processAjaxData"方法?
- @davidmurdoch是否应将processAjaxData方法放在事件中??
- 你能详细解释一下processAjaxData()函数吗?
- processAjaxData只是一个例子;它只是为了向您展示history.pushState的典型用例。
- 那么响应对象将如何工作呢?
- 你能知道什么时候按后退和前进按钮吗?
- 当我手动刷新页面时,是否有机会再次将片段加载到content div中?
- @伊兹卡塔,你能给我解释一下如何使用这个标志吗?
- @用户2372006在这里没有机会。试着问个问题。
- 使用您的函数,"我的页面标题"和"内容HTML"返回未定义。
- 如何调用processAjaxData?调用者是否已经提取了页面标题和HTML并将它们放入一个{ pageTitle: ..., html: ... }对象中,或者接口已经由某个内置对象提供?
- 在本例中,Ajax数据的响应对象是{ pageTitle: ..., html: ... };换句话说:该对象是由服务器组合在一起并响应XHR请求而发送的。
- 在我的情况下,e.state也可以是e.originalEvent.state。
- 如何调用此函数??我的意思是,应该怎么做??
- @Scottdavidtesler可能是PP4+表示公开预览4+
- 有什么反应?
- URL必须是绝对路径,还是相对路径?
- 我已经回答了我自己的问题-是的(见下面的Vivart回答)。
- @多米尼克他们有普通的单页应用程序
HTML5引入了history.pushState()和history.replaceState()方法,允许分别添加和修改历史条目。
1
| window.history.pushState('page2', 'Title', '/page2.php'); |
从这里了解更多有关此的信息
- 出于安全原因,可能无法在file:///上工作,例如firefox 30。用python -m SimpleHTTPServer对localhost进行试验。
- 我在点火器上用过这个。
- 第一个参数应该是一个对象,而不仅仅是一个字符串。
- 依我看,这确实是最好的答案。如果您只想更新当前的URL(,空,strNewPath),则只需更新即可。最好先测试if(history.pushstate)
- 如果不想更改前2个参数,您可以只输入空值。您还可以使用第三个参数的绝对URL。
- 如果你能在答案中多加一些信息,那就太好了。我不知道,参数1的作用是什么。
- 这对GA有何影响?我希望在搜索时更改视图,在更改时捕获GA中的URL并避免重新加载。
如果要更改URL但不想将条目添加到浏览器历史记录,也可以使用html5 replaceState:
1 2 3 4
| if (window.history.replaceState) {
//prevents browser from storing history with each change:
window.history.replaceState(statedata, title, url);
} |
这将"破坏"后退按钮的功能。在某些情况下可能需要这样做,例如图像库(您希望"上一步"按钮返回到"库索引"页,而不是在您查看的每个图像中向后移动),同时为每个图像提供自己的唯一URL。
注意:如果您使用的是HTML5浏览器,则应忽略此答案。现在这是可能的,如其他答案所示。
如果不重新加载页面,就无法在浏览器中修改URL。该URL表示上次加载的页面是什么。如果您更改它(document.location),那么它将重新加载页面。
一个明显的原因是,你在www.mysite.com上写了一个看起来像银行登录页面的站点。然后,您将浏览器的URL栏更改为"EDOCX1"(4)。用户将完全不知道他们真的在看www.mysite.com。
- 我不想更改域,只想更改路径和文件名。
- 这仍然无法阻止潜在的安全风险,因为浏览器不知道域/mysite和域/othersite都被用户视为"安全"。也许问题应该是为什么要更改URL?如果要从用户那里隐藏它,您只需在一个iframe中运行应用程序。
- 你可以用闪光灯来做这个。它将允许您在不发出请求的情况下修改URL。这是可能的,因为flash在浏览器之外运行,但与浏览器非常紧密。
- 您可以更改散列/片段,但绝对不能更改位置/路径。
- 我不得不说,有充分的理由想修改地址栏客户端中的URL。例如,如果您有一个带有分页、排序和过滤功能的数据表,并且希望这些内容支持Ajax,但是仍然要更新URL,以便页面的当前状态可以书签。我可以理解修改域名(网络钓鱼等)带来的安全风险,但是为什么浏览器不允许通过脚本修改顶级域右侧的部分URL?
- 这个答案不再是100%正确的。详情请参阅我的答案。
- 在使用Ajax时,用例确实是这样的,您可能会显示另一个文档,但不想重新加载,但是您希望文档可以书签。在这些情况下,我们希望在不更改域的情况下更改URL的路径,从安全性的角度来看,这应该是可以的。
- 想知道Facebook的照片查看器如何在不重新加载整个页面(只加载图像)的情况下修改下一个/上一个导航的URL。它们不会更改哈希,而是更改查询字符串(?id=query_string)是HTML5吗?
- 如果没有办法做到这一点,那么这是如何在谷歌+照片实现的。在那里,当你点击下一张照片(全屏视图)时,URL改变了,但页面没有重新加载,只上传了需要的图片。
- @sundayironfoot如果浏览器允许将部分URL更改到顶级域的右侧,那么使用在线代理(如free proxy online.appspot.com)的人可能会成为网络钓鱼攻击的受害者。
1
| parent.location.hash ="hello"; |
- 我想更改URL,而不仅仅是哈希--mydata
- 在Ajax中更改哈希值非常有用,因为它是一种不使用cookie的状态,可以书签,并且与浏览器后退按钮兼容。现在Gmail使用它来让它更易于浏览。
- @贾维斯:有什么区别?
- @除非显式发送到跟踪服务,否则有噪声的服务器端跟踪无法看到哈希。
- 如果您使用的是在散列(例如主干)上路由的MVC框架,那么这是不有用的。
这里是我的(你的解决方案newurl冰新网址,你想与"replace流式):
1
| history.pushState({}, null, newUrl); |
- 最好先用if(history.pushstate)测试,以防万一老浏览器。
- 这在火狐中已经不起作用了:操作是不安全的。
如Vivart和GEO1701所述,HTML5替换状态是答案。但是,并非所有浏览器/版本都支持它。history.js包含HTML5状态功能,并为HTML4浏览器提供额外支持。
之前,我们可以使用HTML5。
1
| parent.location.hash ="hello"; |
鸭子:
1
| window.location.replace("http:www.example.com"); |
这个方法将加载你的页面,但introduced history.pushState(page, caption, replace_url)HTML5的,你不应该加载页。
- history.pushState(..)的问题是,如果您想重定向到另一个域,跨域策略就会生效。虽然使用window.location.replace(..)可以重定向到另一个域。
如果您要做的是允许用户书签/共享页面,而您不需要它是正确的URL,并且您没有为任何其他内容使用哈希锚,那么您可以分两部分执行此操作:使用上面讨论的location.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:
1 2 3
| if (window.location.hash.length > 0){
window.location = window.location.hash.substring(1);
} |
希望这有道理!在某些情况下,这是一种有用的方法。
在现代browsers和HTML5,有一个方法称为pushState在线history窗口。这将改变的URL和推它的历史没有加载的页。
你可以使用它,这样,它将把参数3、1)2)状态的对象的名称和URL):
1 2 3 4 5 6 7 8 9 10 11 12
| window.history.pushState({page:"another
<div class="suo-content">[collapse title=""]<ul><li>在这种情况下,<wyn>window.onhashchange</wyn>和<wyn>window.onpopstate</wyn>会做同样的事吗?</li><li>如何加载页面内容?它只是替换了URL</li><li>像通常使用Ajax那样加载内容。</li></ul>[/collapse]</div><hr> <P> 下面是两个转变的功能没有reloading页的URL。它是唯一支持HTML5。 <P> [cc lang="javascript"] 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'); |
- 什么是page?
- @绿色,page是您要移动到的状态的简短标题。火狐目前忽略了这个参数,尽管将来可能会用到它。在这里传递空字符串应该是安全的,以防将来对方法进行更改。发件人:developer.mozilla.org/en-us/docs/web/api/&hellip;
可以添加定位标记。我在我的网站http://www.piano-chords.net/上使用它,这样我就可以通过谷歌分析追踪人们在页面上访问的内容。
我只需添加一个锚标记,然后添加我要跟踪的页面部分:
1 2 3
| var trackCode ="/#" + urlencode($("myDiv").text());
window.location.href="http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode); |
如果您不只是更改URL片段,则对位置的任何更改(window.location或document.location都将导致对该新URL的请求。如果更改URL,则更改该URL。
如果您不喜欢当前使用的URL,请使用服务器端的URL重写技术,如Apache的mod_rewrite。
- 我能用"location.pathname"吗??
- 不,更改该属性也将导致请求。
作为城市芒了托马斯stjernegaard PPL,你可以使用两个history.js修改URL参数的navigates whilst用户通过你的链接和AJAX的应用程序。
是年已通过硬件的方式,回答grew鸭,鸭history.js变得更稳定、跨浏览器。现在,它可以被用来处理两个美国历史的兼容HTML5的抵抗细胞多为只读browsers HTML4。在这里,你可以看到的演示如何以信息工程学院(AS抵抗人类能够尽其functionalities和限制。
"你需要任何帮助,在如何使用和实施这个图书馆,知道你采取一看源代码的demo页:你会看到它很容易做。
终于,一个综合解释了什么是什么的问题可以用散列(鸭hashbangs)退房的链接,这个城市他本杰明。
使用HTML 5 history.pushState()从历史的API。
HTML5的历史参考API的更多细节。
Use:
1 2
| let stateObject = { foo:"bar" };
history.pushState(stateObject,"page 2","newpage.html"); |
你可以看到我的博客没有更新的URL的浏览器加载页面。
- 请考虑在此处添加更多描述,而不是剪切粘贴到您的博客文章的链接。
Use window.history.pushState("object or string","Title","/new-url"), but it will still send a new URL request to server.
- 快速搜索显示,在其他答案中,pushState只被提到14次!
假设你不想做一些恶意的事情,你想对你自己的网址做的任何事情都可以通过htaccess神奇地变成现实。
- htaccess只能用于服务器请求。hashtags不会发送到服务器,因此htaccess重写无法工作。
- htaccess重定向允许用户访问地址A,在保持地址A的同时看到地址B的网页。我认为op想做的相反:用户访问地址A,看到地址A和地址B的网页。不过,有意思的建议,因为我必须想出来!