HTML5/history

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

会话历史和导航

浏览上下文的会话历史

浏览上下文中的文档序列构成了它的会话历史。

历史对象提供一个在浏览上下文的会话历史中的页面的表示。每一个浏览上下文,包括嵌套的浏览上下文,都有一个独特的会话历史。

在浏览上下文的会话历史中的每一个文档对象关联着一个独特的历史对象实例,尽管它们全都必须模仿基本的会话历史。

Window接口的历史属性必须返回实现了这个Window对象的Document的历史接口的对象。

历史对象将它们的浏览上下文的会话历史表示为一个平坦的会话历史入口的列表。每一个会话历史包含一个URL或者一个状态对象,或者两者,可能还有一个标题,一个文档对象,表单数据,一个滚动位置和其他相关的信息。

这并不意味着用户界面需要是线性的。参考下面的注释。

和会话历史入口相关联的标题不必与文档的当前标题有任何关系。一个会话历史入口的标题想用于说明那是文档的状态,以便用户可以游览文档的历史。

当用户或脚本一页一页的浏览时,没有相关联的状态对象的URLs被添加到会话历史。

一个状态对象是一个表示用户接口状态的对象。

页面可以在它们的会话历史入口和下一个(“前进”)入口之间添加状态对象。当用户(或脚本)回到历史,它们就会被返回给脚本,这就可以使作者甚至在一个单页面应用中能够使用“导航”

状态对象被用作两个主要目的:第一,保存一个URL中的预先准备的状态描述以便在简单情况下作者不必做解析(不过还是需要解析来处理用户传入的URL,因此这只是一个小优化),第二,以便作者能够保存不能保存在URL中的状态,因为它只应用到当前文档实例并且如果一个新的文档被打开,它将不得不被重构。

An example of the latter would be something like keeping track of the precise coordinate from which a popup div was made to animate, so that if the user goes back, it can be made to animate to the same location. Or alternatively, it could be used to keep a pointer into a cache of data that would be fetched from the server based on the information in the URL, so that when going back and forward, the information doesn't have to be fetched again. At any point, one of the entries in the session history is the current entry. This is the entry representing the active document of the browsing context. The current entry is usually an entry for the location of the Document. However, it can also be one of the entries for state objects added to the history by that document.

An entry with persisted user state is one that also has user-agent defined state. This specification does not specify what kind of state can be stored.

For example, some user agents might want to persist the scroll position, or the values of form controls.

Entries that consist of state objects share the same Document as the entry for the page that was active when they were added.

Contiguous entries that differ just by fragment identifier also share the same Document.

All entries that share the same Document (and that are therefore merely different states of one particular document) are contiguous by definition.

User agents may discard the Document objects of entries other than the current entry that are not referenced from any script, reloading the pages afresh when the user or script navigates back to such pages. This specification does not specify when user agents should discard Document objects and when they should cache them.

Entries that have had their Document objects discarded must, for the purposes of the algorithms given below, act as if they had not. When the user or script navigates back or forwards to a page which has no in-memory DOM objects, any other entries that shared the same Document object with it must share the new object as well.

History接口

interface History {
  readonly attribute long length;
  readonly attribute any state;
  void go(in optional long delta);
  void back();
  void forward();
  void pushState(in any data, in DOMString title, in optional DOMString url);
  void replaceState(in any data, in DOMString title, in optional DOMString url);
};
window.history.length
返回会话历史集中的项目数量
window.history.state
返回当前的状态对象
window.history.go([delta])
在会话历史集中向后或向前步进指定的量
如果delta为0则重新加载当前页面
如果delta超过了允许的范围,什么也不做
window.history.back()
在会话历史集中向后步进1
如果没有前一页,则什么也不做
window.history.forward()
在会话历史集中向前步进1
如果没有下一页,则什么也不做
window.history.pushState(data, title [,url])
将给定的数据,按指定的标题及可选的URL压入会话历史中
window.history.replaceState(data, title [,url])
更新会话历史中的当前项,使之持有给定的数据、标题和可选的URL

历史记录集是指共享History对象的顶级浏览上下文的那些活动Document对象所持有的浏览上下文中的会话历史的集合,并从中去除每个会话历史的当前项,但保留历史记录集的当前项。

历史记录集的当前项是指最后一个变为会话历史中的当前项的项。

历史记录集中的项是按其加入到各自会话历史的时间顺序排列的。(由于这些浏览上下文在概念上共享一个事件循环,它们的会话历史中添加项的顺序始终是明确的)每一项都有一个索引,最早的一项索引为0,后续项的索引为依次递增的整型(1、2、3……)。

History接口的length属性必须返回历史记录集中历史项的数量。

无法通过脚本访问真正的历史项。

History接口的state属性必须返回用户代码最后一次为其赋的值。对于一个初始的History接口,其值必须为null。

当调用go(delta)方法时,如果没有传递参数或者参数值为0,则用户代理必须按调用location.reload()的方式进行。其他情况下,用户代理必须以方法参数指定的值为差值遍历历史。

当调用back()方法时,用户代理必须以-1为差值遍历历史。

当调用forward()方法时,用户代理必须以1为差值遍历历史。

Location 接口

安全性

会话历史实现说明

浏览网页

在文件之間瀏覽

某些動作會讓瀏覽上下文瀏覽」到新的資源。瀏覽總是帶有一個負責啟動瀏覽的瀏覽上下文:資源瀏覽上下文

舉例來說,打開超連結表單提交window.open()location.assign() 方法都可能讓瀏覽上下文進行瀏覽。

除了本規範定義的方法之外,使用者代理可提供各種方法讓使用者直接啟動瀏覽上下文的瀏覽行為。

當使用者代理將一個瀏覽上下文瀏覽到一個新資源的時候,使用者代理必須執行下列步驟:

  1. 若資源已獲得(例如,使用者代理正在提供資源給 object 元素的新的子瀏覽上下文),則跳過這個步驟。

    否則:

    若新資源會被 HTTP GET 或同等機制獲取,且存在以與資源 URL 相同來源的 URL 標示的適用的應用程式快取,且這個 URL 有出現在除去外來項目的其中一個項目裡,則從最適合的應用快取裡取得該資源。

    舉例來說,想像有一個 HTML 頁面裡有一個從應用程式快取讀近來的圖片跟一個表單,圖片在其他應用程式快取裡面。若使用者在圖片上點右鍵並選了「檢視圖片」,則使用者代理可以決定從這些應用程式快取裡的任何一個顯示該圖片,但是對使用者最有用的快取會是讀入剛剛那個 HTML 頁面用的那一個。另一方面,若使用者提交了表單且表單以 POST 提交,則使用者代理不會使用應用程式快取而是網上提交。
  2. 若資源不是從應用程式緩存獲取,且資源本來要用 HTTP GET 或同等機制獲取,且資源的 URL 批配一個以上適用的應用程式快取的備取命名空間,且成功批配的應用程式快取裡面的最適合的應用快取沒有一個與資源 URL 相同來源且是資源 URL 前輟批配的項目在其線上白名單裡,且使用者沒有在上一步取消瀏覽,且瀏覽過程發生錯誤(例如,服務器傳回 4xx 或 5xx 或等價狀態,或是 DNS 發生錯誤),則:

    候選為配到的備取命名空間對應的備取資源。若成功批配的應用程式快取不只一個,使用者代理必須使用最適合的應用快取的備取資源。

    候選沒被標注為外來的,則使用者代理必須丟棄失敗的載入過程並使用候選當作資源繼續接下來的步驟。文件的位址(若適當),會是原先要求的 URL,而不是備取 URL。使用者代理可告知使用者原來頁面載入失敗的情形、現在頁面正使用備取資源的情形、備取資源的真實 URL。

    页面加载HTML文件的处理模型

    当一个HTML文档在浏览上下文中被加载完毕时,用户代理必须队列一个任务创建用来创建一个 Document 对象,标记它是 HTML 文档,创建 HTML 解析器,并且关联到文档中。

    页面加载XML文件的处理模型

    页面加载文本文件的处理模型

    页面加载图像的处理模型

    页面加载使用插件内容的处理模型

    页面加载没有DOM的内联内容的处理模型

    导航到一个片段标识符

    穿越历史

    事件定义

    卸载文档

    事件定义
    ==== 中止文档加载 ====