转到另一个url而不重新加载页面
go to another url without reloading page
如果我转到域的子路径,通常的方法是执行<a href="/somepath">Some Path</a>
。这将完全重新加载页面。
但在Facebook上,当你打开一张照片时,地址栏上的url会发生变化,但整个页面不会重新加载,它只加载照片平台。因此,通过这种方式,人们可以共享照片的url。我想知道这是怎么做到的?
我已经做了一些搜索,有些人建议使用history.pushState
,然而,这只适用于大多数现代浏览器。脸书上的那个也适用于IE 7,我想知道他们是怎么做到的?
正如您所说,history.pushState
仅在现代浏览器上可用(注意IE>=10)。
对于较旧的浏览器,以任何方式更改URL的唯一方法(据我所知)是使用"hashbang"技术——使用/滥用URL中的哈希来保留页面信息。然后,您会得到一个类似于index.php#!page=x&foo=bar
的URL,其中的散列将用于表示当前页面。然后,URL将使用index.php?page=x&foo=bar
之类的链接进行一一映射,在刷新页面时,JavaScript可以读回哈希并适当地显示页面。这绝不是一个好的解决方案,尤其是浏览器不能正确存储您的历史记录,但它仍然非常受欢迎。
如果您希望使用Ajax来重新加载页面并同时更改URL,那么也许可以查看History.js/Ajaxify等库,它们会尝试在可用的情况下使用pushState
,但在必要的情况下会使用hashbangs。
你似乎认为facebook支持Ajax for Legacy IE。我不知道这一点,因为我不能说IE7经常是我的首选浏览器,但IIRC Twitter使用旧的、功能不全的浏览器的时间要少得多,而且只能使用一个简化得多的界面(我认为它甚至使用了一个基本的移动视图)。如果这是我的网站,我可能会采取类似的立场,在可用的地方使用pushState
,在不可用的地方只提供独立页面。在这些领域进行向后兼容性的工作往往相当困难(尽管上面提到的插件会减少相当大的工作量),除非你需要提供支持,否则这可能不值得?
我不知道,facebook是怎么做到的,但如果你在Backbone.JS的"路由"一章中查看,你会发现,
对于还不支持历史API的浏览器,路由器处理优雅的后退和对URL片段版本的透明转换。
如果你进一步观察,源代码显示:
// Backbone.History
// ----------------
// Handles cross-browser history management, based on either
// [pushState](http://diveintohtml5.info/history.html) and real URLs, or
// [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)
// and URL fragments. If the browser supports neither (old IE, natch),
// falls back to polling.
这是onhashchange提到的文章。这可能是要走的路。
- 在新的浏览器选项卡上加载新的aspx页面后调用JavaScript函数
- 更改css链接并等待加载新的css
- 如何在Ajax加载新内容时停止JavaScript执行
- 当在ng视图中加载新路由时,Tabbing(tabindex)针对错误的元素
- 如何使用输入数据加载新的extjs图表
- JQuery Masonry.Ajax图标和“;加载新项目”;绳子放错地方了
- 通过javascript在同一个打开的选项卡中重新加载新的网页内容
- 当用户到达页面右侧时加载新内容
- 数据表 AJAX 筛选器重新加载数据
- 超链接单击以加载新页面并执行JavaScript
- 单击时加载新的 SVG
- 在RadWindow中加载新页面,然后从加载的窗体中关闭窗口
- ajax在页面刷新之前不会加载新的sql结果
- 谷歌地图API-在从ajax页面加载新数据之前清除标记、多段线
- 使用Ajax加载页面,并在必要时加载新脚本
- 加载新页面时的过渡效果,AJAX
- Ajax没有正确加载新页面
- 正在加载新的Javascript,但正在调用旧的Javascript.MVC
- 咕噜咕噜的手表:实时加载重新加载落后 1 步....
- 我怎么能有一个花哨的盒子一样的弹出体加载,但与cookie不连续加载重新加载