【译】Dive Into HTML5 - History

原文:MANIPULATING HISTORY FOR FUN & PROFIT · Dive Into HTML5
说明:因个人水平有限,如有误译,欢迎指正。

浏览器地址栏可能是这世上所有用户界面中最复杂的一部分了。广告牌上,火车身上,甚至街头涂鸦上都能看到 URL 的身影。借助于导航按钮(无疑是浏览器中最重要的按钮),您拥有了功能强大的前进和后退的操作,以便地在错综交织的 Web 世界中畅游。

HTML5 history API 是通过脚本操纵浏览器历史的一种标准方式。历史导航功能是此 API 的一部分,并已在 HTML 早期版本中实现。HTML5 为此 API 引入了向浏览器历史中新增条目的功能,这样可以显式地更改浏览器地址栏中的 URL(而不会触发页面刷新),当用户点击浏览器后退按钮的时候,这些条目就会从历史堆栈中移除并触发一个事件。这意味着浏览器地址栏中的 URL 仍将作为当前资源的唯一标识符,即使是在那些甚至没有执行过一个完整页面刷新的脚本密集型应用中。

为什么?

【译】Dive Into HTML5 - History_第1张图片
魔鬼读书

为什么您需要手动修改浏览器地址呢?毕竟,一个简单的链接就能够帮您导航到一个新的 URL,而且这种方式已经伴随着 Web 度过了 20 个年头,并且这种方式仍然有效。HTML5 history API 并不是想要颠覆现有的方式。恰恰相反,近几年,Web 开发者发现了一个新的且令人激动的方式来改变现状而不需要借助于新的标准。HTML5 history API 就是针对脚本密集型应用而设计的。

回到最初的原则,URL 究竟是干什么的?它标识了一个唯一的资源。您可以直接去链接它;可以使用书签收藏;搜索引擎可以对其做索引;可以拷贝粘贴并通过邮件发给别人,任何点击它的人都将看到与你看到的一样的资源。这些都是很棒的特性,也是 URL 重要的原因。

所以我们想要唯一性资源能够有一个唯一的 URL。但是同时,浏览器却有一个基本的限制:如果您更改了 URL,即使是通过脚本,它都会向 Web 服务器触发一个请求并对整个页面执行刷新。耗时又耗费资源,特别是在您导航的页面与当前页面几乎相似的情况下。新页面上所有东西都进行了下载,即使新页面的部分区域与当前页面一样。现如今,没有任何方式告诉浏览器在变更 URL 的时候仅下载页面的某些区域资源。

可是 HTML5 history API 可以协助您实现这样的需求。它不会触发整个页面的刷新,您可以使用脚本下载另外一部分页面。这可能有点难以解释,并且您也需要做一些工作。准备好,可看仔细了!

【译】Dive Into HTML5 - History_第2张图片
魔术师表演纸牌魔术

假设您有两个页面,页面 A 和 页面 B。这两个页面 90% 的内容是相似的,只有 10% 的页面内容是不一样的。用户首先导航到页面 A,然后他尝试导航到页面 B。但是这并没有触发整个页面的刷新,您中断了这个导航并手动执行了以下步骤:

  1. 从页面 B 下载与页面 A 不同的那 10% 部分((可以使用 XMLHttpRequest)。这需要服务器端做一些修改。您需要编写代码以返回页面 B 与页面 A 那不同的 10% 部分。这可以是终端用户正常情况下看不到的隐藏的 URL 或查询参数。
  2. 替换掉不同的部分(使用 innerHTML 或其它的 DOM 方法)。您可能也需要修改被替换部分的元素的事件处理器。
  3. 使用页面 B 的 URL 更新浏览器地址栏,这需要借助 HTML5 history API 中的一个方法,待会就向您介绍。

这个假象结束时(如果您执行正确),浏览器就有了页面 B 的 DOM,就好比您直接导航到页面 B。但是您从未真正导航到页面 B,并且没有发生整个页面的刷新。这就是假象。但是因为这个“编译的”页面与页面 B 看上去一样并且拥有相同的 URL,那么用户就不会发现有什么不同(也不会了解到您事无巨细地提升他们的用户体验)。

怎么做?

HTML5 history API 是 window.history 对象的一系列方法,加上 window 对象的一个事件。您可以使用这些方法来 测试浏览器对 history API 的支持。

dive into dogs 是一个使用 HTML5 history API 的例子。它展示了一个常见的模式:一篇很长的文章中关联了一个内联的相册。在支持的浏览器中,点击相册上的 Next 和 Previous 链接可以同时更新照片及浏览器地址栏中的 URL,而这个过程不会触发整个页面的刷新。在不支持的浏览器中——或者支持的浏览器却被用户禁用了脚本——那么这个链接就如同普通的链接一样,刷新整个页面以获取一个新的页面。

现在让我们深入学习 dive into dogs 这个示例,看一下它是如何工作的。下面是一个照片相关的标记语言:


这里没有什么不寻常的。照片本身是一个 并放置在

中,链接也是普通的 元素,并且整个放置在一个

你可能感兴趣的:(【译】Dive Into HTML5 - History)