【问题标题】:go to another url without reloading page转到另一个网址而不重新加载页面
【发布时间】:2013-08-22 04:16:56
【问题描述】:

如果我去一个域的子路径,正常的方法是做<a href="/somepath">Some Path</a>。这将完全重新加载页面。

但在 Facebook 上,当你打开一张照片时,地址栏上的 url 会发生变化,但整个页面不会重新加载,它只会加载照片平台。因此,人们可以通过这种方式分享照片的网址。我想知道这是怎么做到的?

我进行了一些搜索,有些人建议使用history.pushState,但是,这仅适用于大多数现代浏览器。 Facebook 上的那个也可以在 IE 7 上运行,我想知道他们是怎么做到的?

【问题讨论】:

    标签: javascript jquery html node.js socket.io


    【解决方案1】:

    如您所说,history.pushState 仅适用于modern browsers (noteably IE>=10)

    对于旧版浏览器,以任何方式更改 URL 的唯一方法(据我所知)是使用 "hashbang" technique - 使用/滥用 URL 中的哈希功能来保留页面信息。然后你会得到一个类似于index.php#!page=x&foo=bar 的 URL,其中哈希将用于表示当前页面。然后,该 URL 将与 index.php?page=x&foo=bar 之类的链接一对一映射,并且在刷新页面时,JavaScript 可以读回哈希并适当地显示页面。这绝不是一个很好的解决方案,特别是浏览器没有正确存储您的历史记录,但它仍然很受欢迎。

    如果您希望同时使用 Ajax 重新加载页面并更改 URL,那么也许可以查看诸如 History.js / Ajaxify 之类的库,它们会尝试在可用的情况下使用 pushState,但是回退到在必须的地方使用 hashbang。

    您似乎认为 facebook 支持 Ajax for Legacy IE。我不知道这一点,因为我不能说 IE7 通常是我的首选浏览器,但是 IIRC Twitter 用于旧的、功能较少的浏览器的时间要少得多,并且回退到一个非常简化的界面(我 认为它甚至使用了基本的移动视图)。如果它是我的网站,我可能会采取类似的立场,并在可用的情况下使用pushState,并在没有的情况下简单地提供独立页面。在这些领域进行向后兼容性工作往往相当艰巨(尽管上述插件会减轻相当大的负担),除非您需要提供支持,否则可能不值得?

    【讨论】:

      【解决方案2】:

      我不知道,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.
      

      这是onhashchange提到的文章。 这可能是要走的路。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 2016-04-19
        • 1970-01-01
        相关资源
        最近更新 更多