转到另一个网址,无需重新加载页面

如果我转到域的子路径,通常的方法是执行<a href="/somepath">Some Path</a> 。 这将完全重新加载页面。

但在Facebook上,当您打开照片时,地址栏上的网址会发生变化,但整个页面不会重新加载,只会加载照片平台。 所以用这种方式人们可以分享照片的网址。 我想知道这是如何完成的?

我做了一些搜索,有人建议使用history.pushState ,但是,这只适用于大多数现代浏览器。 Facebook上的那个也适用于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 ,但是可以退回到使用hashbang的地方不得不。

您似乎认为Facebook支持Legacy IE的Ajax。 我没有意识到这一点,因为我不能说IE7经常是我的浏览器,但是IIRC Twitter的时间要少很多,功能较少,浏览器功能也较少,并且可以回到简化的界面(我认为它甚至使用基本的移动视图)。 如果是我的网站,我可能会采取类似的立场,并在可用的情况下使用pushState ,并在不提供独立页面的情况下提供。 在这些领域向后兼容的工作往往会相当艰难(尽管上述插件需要相当大的负载),除非需要提供支持,否则它不值得?


我不知道,Facebook是如何做到的,但如果你看看Backbone.JS的“路由”一章,你会看到,那

对于尚不支持History 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.

这是提到的文章tohashchange。 这可能是一条路。

链接地址: http://www.djcxy.com/p/70285.html

上一篇: go to another url without reloading page

下一篇: Chrome Javascript Debugger, when paused, won't reload page