【问题标题】:How can I change the URI without refreshing the page?如何在不刷新页面的情况下更改 URI?
【发布时间】:2011-09-01 09:35:42
【问题描述】:

我用 CodeIginer 建立了一个网站,我想在我的一个页面中实现 AJAX 和 JQuery。问题是当我加载内容时,URL 没有改变。

假设我有这些 URI:

  • http://www.example.com/controller/function/param
  • http://www.example.com/controller/function/param2

如何在单击按钮时从第一个更改为第二个?

【问题讨论】:

    标签: javascript jquery ajax uri


    【解决方案1】:

    可以使用 hash (#),然后放任何你喜欢的东西。

    这是我使用它构建的一个网站 - 然后我让 JavaScript 读取哈希并调用适当的函数:

    http://bannerhouse.com.au/#/popup=media&id=don

    旁注:

    这对于 Flash 网站或 Flash 内容也很有用;您可以使用 FlashVars 将哈希值解析为 SWF 并基于此加载适当的部分/屏幕。

    【讨论】:

      【解决方案2】:

      在 HTML5 中,您可以更改 URL:

      window.history.pushState("object or string", "Title", "/new-url");
      

      查看http://spoiledmilk.com/blog/html5-changing-the-browser-url-without-refreshing-page/

      文档:https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_pushState().c2.a0method


      更新

      概述哪些浏览器支持新的 HTML5 历史 API:

      http://caniuse.com/#search=pushState(caniuse.com 值得收藏!)

      已经有一些框架可以为您完成艰苦的工作,甚至可以优雅地回退到常见的标签解决方案:

      History.js

      History.js 优雅地支持 HTML5 历史/状态 API (pushState, replaceState, onPopState) 在所有浏览器中。包含 继续支持数据、标题、replaceState。支持jQuery, MooTools 和原型。对于 HTML5 浏览器,这意味着您可以 直接修改 URL,不再需要使用哈希。为了 HTML4 浏览器将恢复使用旧的 onhashchange 功能。

      Backbone.js

      Backbone 通过以下方式为大量 JavaScript 应用程序提供结构 为模型提供键值绑定和自定义事件、集合 具有丰富的可枚举函数 API,带有声明性事件的视图 处理,并将其全部连接到您现有的应用程序 RESTful JSON 接口。 ... PushState 支持存在于 Backbone 中纯粹的选择加入的基础上。 不支持 pushState 的旧浏览器将继续使用 基于散列的 URL 片段,并且如果一个散列 URL 被 支持pushState的浏览器,会透明升级为真实URL。

      Mootools (via Plugin)

      MooTools 是一个紧凑、模块化、面向对象的 JavaScript 框架,专为中高级 JavaScript 开发人员设计。 [...] 通过 popstate 或 hashchange 进行历史管理。在不重新加载的情况下替换页面的 URL,并在旧版本上回退到 Hashchange 浏览器。

      dojo toolkit

      Dojo 将 Web 标准用作 它的平台。这是经验丰富的开发人员用来构建高 高质量的桌面和移动网络应用程序。 [...] dojox.app 管理导航 通过 HTML5 pushState 标准的历史并将其委托给启用的浏览器 历史管理。

      ...仅举几例。


      (!!) 注意

      使用pushState 时的一个重要副作用(来自Backbone documentation 的引用):

      请注意,使用真实 URL 需要您的网络服务器能够 正确呈现这些页面,因此需要进行后端更改 好吧。例如,如果您有 /documents/100 的路由,则您的网络 如果浏览器访问该 URL,服务器必须能够提供该页面 直接地。为了获得完整的搜索引擎可抓取性,最好有 服务器为页面生成完整的 HTML ......但如果它是一个网络 应用程序,只需渲染您将拥有的相同内容 根 URL,并用 Backbone Views 和 JavaScript 填充其余部分 工作正常。

      【讨论】:

      • 太好了.. 感谢您的帮助.. 感谢所有在此线程中发表评论的人... :)
      • 您知道,根据我对 history.pushState 的经验,它不会优雅地降级,并且在 IE9 中不起作用,它实际上破坏了我的脚本。请务必实施修复,或改用 document.location.hash。您可以使用modernizer.js 来检测浏览器是否支持它。
      【解决方案3】:

      通过 Javascript 使用哈希标签,因此在按钮的单击事件处理程序中: location.hash = "param2" 这将改变http://example.com/mypage/#whateverhttp://example.com/mypage/#param2

      当然,您也可以将“文件夹”放在哈希之后,因此,使用基本 url http://example.com/ 然后添加: location.hash = "/MyPage/MySubPage/MyInfo"; 将其更改为http://example.com/#/MyPage/MySubPage/MyInfo

      【讨论】:

      • 当我尝试这样做时,第一个 url http://www.example.com/controller/function/param 变成了http://www.example.com/controller/function/param/#/controller/function/param2,如果我在 URL 上按 Enter,我得到的内容与第一个 URL 相同。我如何将内容更改为当我按 URL 时第二个??
      【解决方案4】:

      A similar thread 推断不,除非使用哈希标签。

      提出但强烈反对的一个想法是使用 204 HTTP 响应。

      从W3开始:

      无响应 204

      服务器已收到请求,但 没有信息可以发回, 并且客户应该保持不变 文档视图。这主要是为了让 脚本的输入而不更改 同时记录。

      【讨论】:

        【解决方案5】:

        以下是 WHATWG 的 HTML 生活标准(以前称为 HTML5)§ 7.10.2 The session history of browsing contexts 的相关摘录:

        会话历史记录中的多个连续条目可以共享同一个文档。当通过正常导航到达初始条目并通过history.pushState() 添加以下条目时,可能会发生这种情况。或者它可以通过导航到片段来发生。

        【讨论】:

          猜你喜欢
          • 2011-06-15
          • 1970-01-01
          • 1970-01-01
          • 2020-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-23
          • 2016-05-25
          相关资源
          最近更新 更多