【问题标题】:Using html5 history in place of hash urls to restore the history of the user使用 html5 历史代替哈希 url 来恢复用户的历史
【发布时间】:2016-03-15 19:02:58
【问题描述】:

我们有一个基于查询字符串加载结果的单页应用程序。

查询字符串如下所示: ?city=德里&pn=1

SPA 在同一个网页上有不同的部分。当用户导航到这些部分时,我们使用哈希更改来维护历史记录。例如: ?city=Delhi&pn=1#sort :显示 SPA 的排序参数部分。 ?city=Delhi&pn=1#filters : 显示 SPA 的过滤器部分。

我们现在计划放弃使用 url 中的哈希更改来维护历史记录,而是开始使用 html5 历史记录 API。

如何替换这些哈希并使用历史插件执行相同的功能?

我尝试使用 + 号,例如 (?city=Delhi&pn=1+sort)。但看起来用户无法为此添加书签,并且页面会中断,因为 api 不处理 + 符号。 + 号在 ajax api 请求中被当作空格。

还有哪些优雅的处理方式?

【问题讨论】:

    标签: javascript jquery html history.js html5-history


    【解决方案1】:

    对查询字符串中的数据进行编码的标准方法是添加另一个键=值对。

    ?city=Delhi&pn=1&sort=true
    

    请注意,如果您使用的是历史 API,那么您应该拥有能够生成与 JavaScript 生成的相同视图的服务器端代码。

    例如

    1. 用户到达/,获取服务器下发的首页
    2. 用户点击指向/?city=Delhi&pn=1&sort=true 的链接,Ajax 将页面转换为另一个页面。
    3. 用户书签链接
    4. 用户离开
    5. 用户改天回到他们的书签,服务器(不是 JavaScript)构建 /?city=Delhi&pn=1&sort=true
    6. 用户点击另一个链接,JS 启动

    这意味着:

    • 站点在初始加载时执行速度更快。您不必加载主页,然后等待 JS 发出其他请求将其转换为您最初要求的页面。
    • 它是搜索引擎的好食物
    • 它继续工作when JS fails

    【讨论】:

    • 在我们的场景中,我认为我们不需要从服务器端代码生成相同的视图。我认为如果我简单地忽略服务器端的这些附加参数就可以了。如果用户粘贴这样的 url 并加载结果而忽略它,只使用原始查询字符串参数,我们很好。
    • "在我们的场景中,我认为我们不需要从服务器端代码生成相同的视图。" — 那么使用历史 API 代替 hash bangs 就没有意义了。
    • 我们这样做是有原因的——因为它的搜索页面有多个不同的过滤器,用户可以一个一个地应用,我们希望为浏览器提供功能,以便他可以通过一个一个地删除过滤器浏览器回来。我同意这也可以通过 hashbang 来完成,但这将是完全手动的,而 history api 会让我们更容易。如有错误请指正。
    • 可以使用 hashchange 事件。 AFAIK 为您提供与历史 API 一样多的功能。
    • 我已经为应用一级过滤器完成了它,例如通过放置#filter,但我将如何为所有过滤器的每个嵌套级别执行此操作。我每次都必须附加#filterName。
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2012-11-02
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多