Warning:
This wiki has been archived and is now read-only.

HTML5/impl

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

(暂放) 原文链接 http://www.w3.org/TR/2011/WD-html5-20110525/

本文档开放给所有人编辑,希望参与贡献请移步下面地址注册: http://www.w3.org/Help/Account/Request/Public

Contents

介紹

背景

此章節不具有規範性

對象

此章節不具有規範性

範圍

此章節不具有規範性

沿革

此章節不具有規範性

設計備註

此章節不具有規範性

腳本執行的可序列性

此章節不具有規範性

遵守其他規範

此章節不具有規範性

HTML vs XHTML

此章節不具有規範性

這份規範的結構

此章節不具有規範性

如何閱讀本規範

排版慣例

HTML 的簡短介紹

此章節不具有規範性

對於作者的符合要求

此章節不具有規範性

表象標記

此章節不具有規範性

語法錯誤

此章節不具有規範性

內容模型與屬性值的限制

此章節不具有規範性

建議閱讀

此章節不具有規範性

通用设施

术语

本规范会涉及到HTML/XML attributes和IDL attributes。为避免混淆,我们用content attributes来描述HTML/XML attributes,用IDL attributes来描述IDL接口中的属性。类似的,properties可以用来描述JavaScript对象或CSS的properties。为区分这两种properties,我们分别用object properties和CSS properties来描述上两种不同的properties.

一般来说,如果一个feature既适用于HTML语法,也适用于XHTML语法,则会说该feature适用于HTML或者XHTML。如果某feature只适用于其中的一种语言,则会明确指出该feature不适用于另一种语法,比如:在HTML里......(注意不适用于XHTML)

本规范的document可以是任何HTML格式的文件,包括简短的静态文档,较大的带有多媒体数据的文档,还有复杂的交互应用。

当提到一个文档被呈现给用户的方式时,规范中会用到shown, displayed或者visible.

如果说从算法B返回到算法A。这说明A调用了B。当回到A时,程序将会继续执行调用B的语句的下一条语句。

“透明的黑色”表示R,G,B和alpha通道都被设成了0.


资源

XML

DOM树

脚本

插件

字符编码

規範要求

本規範的所有圖表、範例、備註皆沒有規範性,直接標示無規範性的章節也是如此。本規範其餘的部份具有規範性。

在具有規範性的部份裡,關鍵詞「必須(MUST)」、「必不可(MUST NOT)」、「本規範要求…(REQUIRED)」、「應該(SHOULD)」、「不應(SHOULD NOT)」、「本規範建議…(RECOMMENDED)」、「可(MAY)」、「可以選擇(OPTIONAL)」 按照 RFC2119 的敘述解讀。為方便閱讀,本規範翻譯使用中文的這些關鍵詞。[RFC2119]

作為演算法一部分指令的要求(例如:「剝離所有前頭空白字符」、「回傳假值並退出這些步驟」)以呼叫演算法所用關鍵字(「必須」、「應該」、「可」等等)的意義解讀。

以演算法或是具體步驟呈現的要求可以任何方式實作,唯一的要求是是結果相等。(特別是本規範定義的演算法以容易理解而不以性能高為目的。)

規範類別

本章節不具有實作相關內容

依賴關係

本規範建構在其他規範規範之上。

XML

因為 XHTML 語法使用帶有名稱空間的 XML 序列化,支援 XHTML 語法的實作必須支援某個版本的 XML 與相應的名稱空間規範。[XML] [XMLNS]

DOM

文件物件模型(Document Object Model,DOM)是文件與其內容的一個描述方式也是一個模型。DOM 不只是一套 API — 本規範以在 DOM 上的操作定義規範符合條件。[DOMCORE]

因為本規範著重以 DOM 描述規則並定義部份功能為 DOM Core 各界面的擴充,實作必須支援某個版本的 DOM Core 與 DOM Events。[DOMCORE] [DOMEVENTS]

其中,DOM Core 規範定義了以下功能:[DOMCORE]

  • Attr 界面
  • CDATASection 界面
  • Comment 界面
  • DOMImplementation 界面
  • Document 界面
  • DocumentFragment 界面
  • DocumentType 界面
  • DOMException 界面
  • Element 界面
  • Node 界面
  • NodeList 界面
  • ProcessingInstruction 界面
  • Text 界面
  • createDocument() 方法
  • createElement() 方法
  • createElementNS() 方法
  • getElementById() 方法
  • insertBefore() 方法
  • ownerDocument 屬性
  • childNodes 屬性
  • localName 屬性
  • parentNode 屬性
  • namespaceURI 屬性
  • tagName 屬性
  • textContent 屬性

DOM Events 規範定義了以下功能:[DOMEVENTS]

  • Event 界面
  • EventTarget 界面
  • UIEvent 界面
  • MouseEvent 界面
  • click 事件
  • target 屬性

File API

本規範使用以下 File API 規範定義的界面:[FILEAPI]

  • Blob
  • File
  • FileList

Web IDL

使用者代理必須將本規範裡的所有 IDL 片段解釋為 Web IDL 所說的必要符合 IDL 片段。[WEBIDL]

本規範使用 WebIDL 規範定義的給予屬性索引給予屬性名這兩個詞彙。

除非另外說明,若腳本賦予型態為浮點數(double)的 IDL 屬性 Infinity 或 Not-a-Number(NaN),則使用者代理必須丟出 NOT_SUPPORTED_ERR 例外。

除非另外說明,若腳本以 Infinity 或 Not-a-Number(NaN)作為型態是浮點數(double)的方法參數,則使用者代理必須丟出 NOT_SUPPORTED_ERR 例外。

除非另外說明,若腳本對型態為 DOMString 的 IDL 屬性賦值,或是呼叫的方法有型態為 DOMString 的參數,則使用者代理必須將該 DOMString 轉換成 Unicode 字符串列以提供本規範裡的演算法使用。[WEBIDL]

JavaScript

本規範描述的語言的一部分僅支援 JavaScript 為腳本語言。[ECMA262]

注:由於 JavaScript 這個術語比較為人所知,這裡使用 "JavaScript" 而不是官方的 ECMAScript 以稱呼 ECMA262。同樣的,本規範以最常使用的 text/javascript 作為 JavaScript 的 MIME 型態,儘管 RFC 4329 已正式廢棄這個型態[RFC4329]

媒體查詢(Media Queries)

實作必須支援媒體查詢(Media Queries)語言的某個版本。[MQ]

URI、IRI、IDNA

實作必須支援 URI 與 IRI 規範定義的 URL 語意,並支援《Internationalizing Domain Names in Applications (IDNA)》規範定義的 IDNA 域名語意。[RFC3986] [RFC3987] [RFC3490]

CSS 模組

雖然本規範不要求實作支援 CSS 全部功能(但是本規範鼓勵瀏覽器這樣做),有些功能以特定的 CSS 要求定義。

具體來說,有些功能要求將字串作為 CSS <color> 取值解析。CSS 規範要求使用者代理在解析 CSS 取值的時候使用某些錯誤處理規則,而這些規則也適用於本規範。[CSSCOLOR] [CSS]

舉例來說,本規範要求使用者代理在無預期的發現樣式終點的情況下,關閉所有開構造。因此,在解析 "rgb(0, 0, 0"(少了關閉誇號)字串以獲得色彩值的情況下,使用者代理依錯誤處理規則假設關閉誇號存在,並獲得一個值(黑色)。但是,使用者代理不能解析類似的構造 "rgb(0, 0,(少了括號跟藍色的數值),畢竟關閉這個開構造無法得到可用的取值。


本規範不「要求」使用者代理支援特定的網路協定、樣式表語言、腳本語言或是任何上述以外的 DOM 規範。但是,本規範描述的語言傾向使用 CSS 作為樣式表語言、JavaScript 作為腳本語言、HTTP 作為網路協定,並在幾個功能的描述上假設使用者代理使用這些語言與協定。

注:本規範可能另外在字符編碼、圖像格式、音頻格式、視頻格式上的要求,在各章節提出。

擴展性

字串比較與大小寫

區分大小寫的方式比較兩個字串是指一個代碼點一個代碼點準確比較。

ASCII 不分大小寫的方式比較兩個字串是指除了將在範圍 U+0041 到 U+005A(也就是 LATIN CAPITAL LETTER A 到 LATIN CAPITAL LETTER Z)之間的字符與在範圍 U+0061 到 U+007A(也就是 LATIN SMALL LETTER A 到 LATIN SMALL LETTER Z)之間的對應字符視為一樣之外,一個代碼點一個代碼點準確比較。

UTF-8

当用户代理需要‘包含错误处理地,以UTF-8解码一个字节的字符串’,它意味着除非出现任何错误,字节流必须通过将其解释为UTF-8从而转化为一个Unicode字符串。出现的错误必须被描述为下列列表中的形式。下面的列表中的字节被表示为十六进制。[RFC3629]

  • 一个FE至FF范围内的字节
  • 超长形式(例如:F0 80 80 A0)
  • 一个C0至C1范围内的字节,其后跟随一个80至BF范围内的字节。
  • 一个F0至F4范围内的字节,其后跟随三个80至BF范围内的字节,这三个字节表示一个高于U+10FFFF的码点。
  • 一个F5至F7范围内的字节,其后跟随三个80至BF范围内的字节。
  • 一个F8至FB范围内的字节,其后跟随四个80至BF范围内的字节。
  • 一个FC至FD范围内的字节,其后跟随五个80至BF范围内的字节。
  • 一个C0至FD范围内的字节,其后不跟随80至BF范围内的字节。
  • 一个E0至FD范围内的字节,其后跟随一个80至BF范围内的字节,该字节后不跟随80至BF范围内的字节。
  • 一个F0至FD范围内的字节,其后跟随两个80至BF范围内的字节,最后一个字节后不跟随80至BF范围内的字节。
  • 一个F8至FD范围内的字节,其后跟随三个80至BF范围内的字节,最后一个字节后不跟随80至BF范围内的字节。
  • 一个FC至FD范围内的字节,其后跟随四个80至BF范围内的字节,最后一个字节后不跟随80至BF范围内的字节。
  • 表示U+D800至U+DFFF范围内码点的任意字节序列
    整个匹配的序列必须使用单一的U+FFFD替换字符替换。
  • 一个80至BF范围内的字符,其不跟随在一个80至FD范围内的字节之后。
  • 一个80至BF范围内的字符,其跟随在一个作为完整UTF-8序列一部分的字节之后,该UTF-8序列不包括该字节。
  • 一个80至BF范围内的字符,其跟随在一个作为已经使用U+FFFD替换字符替换过的序列一部分的字节之后,其既不是独立的也不是序列的一部分。
    每个这样的字节必须被使用U+FFFD替换字符替换。

对于上述需要的目的,一个UTF-8的超长形式指的是,使用超过以UTF-8形式编码一个码点所需的最少数量的字节编码该码点所得的一个序列。

例如:字节串"41 98 BA 42 E2 98 43 E2 98 BA E2 98"将被转换成字符串"A��B�C☺�"。

通用微語法

HTML 在很多地方使用不同的資料型態,如日期或數值。此章節描述用這些格式的內容符合規範的條件與解析他們的方法。

注:我們強烈迫切實作者仔細檢驗任何用來解析下述語法的第三方程式庫。舉例來說,日期程式庫實作的錯誤處理行為很可能有與本規範要求的不同,這是因為描述跟本規範用的日期語法相似的規範未定義錯誤處理行為,也因此各種實作在處理錯誤上有很大的不同。

常用解析器慣用語

在本規範裡,空白字符指的是 U+0020 SPACE、U+0009 CHARACTER TABULATION (tab)、U+000A LINE FEED (LF)、U+000C FORM FEED (FF) 與 U+000D CARRIAGE RETURN (CR)。

White_Space 字符是指 Unicode PropList.txt 資料檔裡有 Unicode "White_Space" 屬性的那些字符。[UNICODE]

注:不應該與把這個跟 Unicode.txt 資料檔裡 "Bidi_Class" 屬性的 "White_Space" 值(簡寫為 "WS")搞混。

ASCII 字母數字字符是指範圍 U+0030 DIGIT ZERO (0) 至 U+0039 DIGIT NINE (9)、U+0041 LATIN CAPITAL LETTER A 至 U+005A LATIN CAPITAL LETTER Z、U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z 的字符。

部份下述的微解析器按照以下的模式:有一個輸入變數放正在解析的字串,另一個位置變數指向輸入裡要解析的下一個字符。

對於按照這個模式的解析器,要求使用者代理蒐集一串字符意會著使用者代理必須執行以下演算法,其中字符集是要蒐集的字符集合。

  1. 輸入位置為呼叫此演算法的相同名稱的變數。
  2. 結果為空字串。
  3. 位置沒超過輸入的結尾且位於位置的字符在字符集裡,將該字符附上結果的結尾並將位置向前移到輸入裡的下一個字符。
  4. 回傳結果

跳過空白步驟代表使用者代理必須蒐集一串空白字符跳過 White_Space 字符步驟代表使用者代理必須蒐集一串White_Space 字符。在這兩種情況下,不使用蒐集到的字符。[UNICODE]

當使用者代理要剝離換行符時,使用者代理必須移除該字串中任何的 U+000A LINE FEED (LF) 與 U+000D CARRIAGE RETURN (CR)。

當使用者代理要剝離頭尾空白時,使用者代理必須移除該字串起頭與結尾的空白字符

一個字串的代碼點長度是該字串有的 Unicode 代碼點的個數。

布尔型属性

关键字和枚举类型属性

数字

非负整数
带符号整数
实数
百分比和长度
整数列表
尺寸列表

日期和时间

月份
日期
时间
本地日期和时间
全球日期和时间
星期
Vaguer moments in time

颜色

空格分开的token

一组空格分开的token是一个包含零个或者多个由一个或者多个空白字符分隔的词(称为token)的字符串,每个词由一个或者多个字符组成,这些字符都不能是空白字符。

逗号分开的token

参考

媒体查询

URL

术语

一个URL是一个用于标识资源的字符串。

一个URL是一个有效的URL当且仅当以下条件中至少一个成立:

  • URL是一个有效的URI引用 [RFC3986]
  • URL是一个有效的IRI引用并且它没有查询组件。[RFC3987]
  • URL是一个有效的IRI引用并且它的查询组件不包含未编码的非ASCII字符。[RFC3987]
  • URL是一个有效的IRI引用并且URL的文档的字符编码是UTF-8或者UTF-16。[RFC3987]

一个字符串是有效非空的URL当且仅当它是一个有效的URL但它不是一个空字符串。

一个字符串是一个有效的URL(允许前后有空格)当且仅当它去掉前后空白字符之后,是一个有效的URL


一个字符串是一个有效非空的URL(允许前后有空格)当且仅当它去掉前后空白字符之后,是一个有效非空的URL

本规范定义了URL about:legacy-compat为保留的,尽管不可解析,about: URI,当兼容XML工具需要时,可用于在HTML文档的DOCTYPE中。 [RFC3987]

本规范定义了URL about:srcdoc为保留的,尽管不可解析,about: URI,用于iframe srcdoc文档的document的地址。[RFC3987]

分析URL

Resolving URLs

URL运用与创建

动态改变基础URL

URL运用的接口

获取资源

协议的概念

加密的HTTP及安全考量

決定資源的類型

使用者代理獲得、解讀 Content-Type 後設資料的方式必須不與媒體型態嗅探規範的要求有所衝突。[MIMESNIFF]

使用者代理尋找資源的嗅探型態的方式必須不與媒體形態嗅探規範定義的尋找相關八位元組序列「嗅探型態」的要求有所衝突。[MIMESNIFF]

媒體形態嗅探規範也定義針對圖像嗅探的規則區分資源是文字還是二進制檔案的規則。這兩個規則皆回傳 MIME 型態[MIMESNIFF]

準確遵守媒體形態嗅探規範的規則非常重要。使用者代理用來偵測內容型態的演算法與伺服器預期的不一樣的話,會有安全疑慮。詳細情形請參考媒體形態嗅探規範。[MIMESNIFF]

meta 元素萃取編碼

給定一個字串 s,以下是meta 元素萃取編碼的演算法。本演算法回傳一個編碼或是空值。

  1. 位置為指向 s 的指針,一開始指向字串的起點。
  2. 「迴圈」:找 s位置之後第一組 ASCII 不分大小寫批配 "charset" 的七個字符
    Error creating thumbnail: Unable to save thumbnail to destination
    。若批配不存在,回傳空值並退出這些步驟。
  3. 跳過接著 "charset" 的所有 U+0009, U+000A, U+000C, U+000D 或 U+0020 字符(這些字符不一定存在)
    Error creating thumbnail: Unable to save thumbnail to destination
  4. 若下一個字符不是 U+003D EQUALS SIGN('='),則將位置為指向該字符的正前面並跳回「迴圈」步驟
    Error creating thumbnail: Unable to save thumbnail to destination
  5. 跳過接著等號的所有 U+0009, U+000A, U+000C, U+000D 或 U+0020 字符(這些字符不一定存在)
    Error creating thumbnail: Unable to save thumbnail to destination
  6. 用下述方式處理下一個字符:
    ↪ 若字符為 U+0022 QUOTATION MARK(")且 s 的後面還有一個 U+0022 QUOTATION MARK(")
    ↪ 若字符為 U+0027 APOSTROPHE(')且 s 的後面還有一個 U+0027 APOSTROPHE(')
    回傳此字符跟下一個最近的相同字符之間字串的對應編碼。
    Error creating thumbnail: Unable to save thumbnail to destination
    ↪ 若字符為單一個 U+0022 QUOTATION MARK(")
    ↪ 若字符為單一個 U+0027 APOSTROPHE(')
    ↪ 下一個字符不存在
    回傳空值
    Error creating thumbnail: Unable to save thumbnail to destination
    ↪ 否則
    回傳此字符跟下一個 U+0009, U+000A, U+000C, U+000D, U+0020 或 U+003B 字符或 s 的結尾之間對應編碼。
注:本演算法與 HTTP 規範的那些不同(舉例來說,HTTP 禁止單引號的使用,且要求使用者代理支援本演算法不支援的反斜線跳脫)。雖然這個演算法在使用背景的歷史上與 HTTP 有關,但是實作支援的語法已經差異化一段時間了。[HTTP]

通用DOM接口

在IDL属性中反射内容属性

集合

HTMLCollection
HTMLAllCollection
HTMLFormControlsCollection
HTMLOptionsCollection

DOMTokenList

DOMSettableTokenList

安全地传递结构体类型数据

DOMStringMap

DOM功能点字符串

异常

垃圾回收

命名空间

HTML文档的语义、结构及API

文档

在HTML用户代理中,每个XML和HTML文档都表现为一个Document对象。

文档的地址是一个在Document对象被创建是设置的绝对URL文档的当前地址是一个可以在Document对象生命周期内被修改的绝对URL。举例说明,当用户导航到一个页面的片段标识时,或者使用一个新的URL调用pushState()方法时,文档的当前地址将被修改。在Document对象被创建时,文档的当前地址必须被设为文档的地址

注:可交互的用户代理通常在它们的用户界面上公开显示文档的当前地址

当通过createDocument()createHTMLDocument() API创建一个Document对象时,文档的地址脚本程序的文档文档的地址相同。

Document对象被创建时,除非它们被标记为HTML文档,否则将被假定为XML文档。一个文档是HTML文档还是XML文档将影响某些API的行为和一些选择器的大小写区分情况。

每个Document对象拥有一个原本未设置的重载覆盖标志。该标志在某些情况下通过document.open()document.write()方法设置。若设置了该标志,Document对象同时还拥有一个重载覆盖缓冲区,该缓冲区是一个用作文档在被重载之后的源的Unicode字符串。

当用户代理执行一个覆盖的重载时,必须执行下列操作:

  1. source浏览器上下文活动文档重载覆盖缓冲区的值。
  2. 通过启用更换(replacement enabled)导航浏览器上下文到源为source的资源。当导航算法为此目的而创建一个Document对象时,设置该Document对象的重载覆盖标志并设置它的重载覆盖缓冲区source

DOM中的文档

所有Document对象(对于实现本标准的用户代理而言)必须实现HTMLDocument接口,这可以通过绑定机制实现。(也就是说,文档是不是一个HTML文档,甚至是不是包含任何HTML元素都无所谓)对于用户代理支持的其他命名空间,Document对象必须实现对应的文档级别的接口。

比如一个HTML实现支持SVG,那么这个Document对象必须同时实现HTMLDocumentSVGDocument这2个接口。
注:注意:由于现在的HTMLDocument接口是通过绑定转换的机制来实现的,而不是简单地作为文档对象的主要接口,因此它不再继承于Document
[OverrideBuiltins]
interface HTMLDocument
Error creating thumbnail: Unable to save thumbnail to destination
Error creating thumbnail: Unable to save thumbnail to destination
Error creating thumbnail: Unable to save thumbnail to destination
{
  // 资源元数据管理属性
  [PutForwards=href] readonly attribute Location location;
  readonly attribute DOMString URL;
           attribute DOMString domain;
  readonly attribute DOMString referrer;
           attribute DOMString cookie;
  readonly attribute DOMString lastModified;
  readonly attribute DOMString compatMode;
           attribute DOMString charset;
  readonly attribute DOMString characterSet;
  readonly attribute DOMString defaultCharset;
  readonly attribute DOMString readyState;

  // DOM树访问接口
  getter any (in DOMString name);
           attribute DOMString title;
           attribute DOMString dir;
           attribute HTMLElement body;
  readonly attribute HTMLHeadElement head;
  readonly attribute HTMLCollection images;
  readonly attribute HTMLCollection embeds;
  readonly attribute HTMLCollection plugins;
  readonly attribute HTMLCollection links;
  readonly attribute HTMLCollection forms;
  readonly attribute HTMLCollection scripts;
  NodeList getElementsByName(in DOMString elementName);
  NodeList getElementsByClassName(in DOMString classNames);
  NodeList  getItems(in optional DOMString typeNames); // microdata 
  readonly attribute DOMElementMap cssElementMap;

  // 动态标签插入接口
           attribute DOMString innerHTML;
  HTMLDocument open(in optional DOMString type, in optional DOMString replace);
  WindowProxy open(in DOMString url, in DOMString name, in DOMString features, in optional boolean replace);
  void close();
  void write(in DOMString... text);
  void writeln(in DOMString... text);

  // 用户交互接口
  readonly attribute WindowProxy defaultView;
  readonly attribute Element activeElement;
  boolean hasFocus();
           attribute DOMString designMode;
  boolean execCommand(in DOMString commandId);
  boolean execCommand(in DOMString commandId, in boolean showUI);
  boolean execCommand(in DOMString commandId, in boolean showUI, in DOMString value);
  boolean queryCommandEnabled(in DOMString commandId);
  boolean queryCommandIndeterm(in DOMString commandId);
  boolean queryCommandState(in DOMString commandId);
  boolean queryCommandSupported(in DOMString commandId);
  DOMString queryCommandValue(in DOMString commandId);
  readonly attribute HTMLCollection commands;

  // 事件接口
           attribute function onabort;
           attribute function onblur;
           attribute function oncanplay;
           attribute function oncanplaythrough;
           attribute function onchange;
           attribute function onclick;
           attribute function oncontextmenu;
           attribute function oncuechange;
           attribute function ondblclick;
           attribute function ondrag;
           attribute function ondragend;
           attribute function ondragenter;
           attribute function ondragleave;
           attribute function ondragover;
           attribute function ondragstart;
           attribute function ondrop;
           attribute function ondurationchange;
           attribute function onemptied;
           attribute function onended;
           attribute function onerror;
           attribute function onfocus;
           attribute function oninpput;
           attribute function oninvalid;
           attribute function onkeydown;
           attribute function onkeypress;
           attribute function onkeyup;
           attribute function onload;
           attribute function onloadeddata;
           attribute function onloadedmetadata;
           attribute function onloadstart;
           attribute function onmousedown;
           attribute function onmousemove;
           attribute function onmouseout;
           attribute function onmouseover;
           attribute function onmouseup;
           attribute function onmousewheel;
           attribute function onpause;
           attribute function onplay;
           attribute function onplaying;
           attribute function onprogress;
           attribute function onratechange;
           attribute function onreadystatechange;
           attribute function onreset;
           attribute function onscroll;
           attribute function onseeked;
           attribute function onseeking;
           attribute function onselect;
           attribute function onshow;
           attribute function onstalled;
           attribute function onsubmit;
           attribute function onsuspend;
           attribute function ontimeupdate;
           attribute function onvolumechange;
           attribute function onwaiting;
};
Document implements HTMLDocument;

由于HTMLDocument接口定义了几个不同特性的方法和属性,它的成员将在不同的章节中分别介绍。

安全

当一个HTMLDocument对象被一个脚本访问,且这个脚本的有效脚本源和文档的有效脚本源不同时,用户代理必须抛出一个SECURITY_ERR异常。

资源元数据管理

此区块中不是标准描述,实现要求在下面给出。document . URL 返回文档地址
此区块中不是标准描述,实现要求在下面给出。document . referrer

返回用户导航到此文档对象前所在的 Document地址。如果来源文档地址不可用或者没有这样的文档,则返回空字符串。

noreferrer 連結型態可用來阻擋這的效果。

URL屬性需要返回文档地址

referrer属性需要返回任意<fragment>组件删除后导航操作开始时(将浏览器上下文导航到当前文档的页面)资源浏览器上下文活动文档当前地址,或者当没有这样的原始页面、用户代理被设置为在这种情况下不报告引用、以及导航是通过包含noreferrer关键字的超链接启动的情况下,返回空字符串。

注:在这种情况下,根据HTTP协议,referrerIDL属性将匹配获取(fetching)当前页面时所发送的Referer(原文如此)头。
注:通常情况下,如果引用使用了加密协议而当前页面没有使用,则用户代理默认不报告引用。(例如:从一个https:页面导航至http:页面)
此区块中不是标准描述,实现要求在下面给出。document . cookie [ = value ]

返回应用于该Document的HTTP cookie。如果没有cookie或者cookie不能用于此资源,则返回空字符串。

能够被设置,用于向HTTP cookie添加一个新的cookie元素。

如果内容为特殊源中的沙箱(在标有 sandbox屬性的iframe中)或资源被标记为text/html-sandboxed,则在获取和设置cookie时抛出一个SECURITY_ERR异常。

cookie属性表示创建Document所用资源的cookie。

一个Document对象如果满足一下几条之一,则在对象是无CookieDocument对象

当获取Cookie时,如果文档是一个无CookieDocument对象,则用于代理必须返回空字符串。否则,如果Document不是“协议/主机/端口”元组,用户代理必须抛出SECURITY_ERR异常。否则,用户代理必须首先“获得存储互斥”之后返回一个“non-HTTP”API的文档地址用UTF-8解码且包含错误处理的Cookie字符串。[COOKIES]

当设置Cookie时,如果文档是一个无CookieDocument对象,则用户代理必须停止执行操作。否则,如果Document的源不是“协议/主机/端口”元组,用户代理必须抛出SECURITY_ERR异常。否则,用户代理必须首先“获得存储互斥”之后执行操作,将通过“non-HTTP”API收到的一个文档地址的设置Cookie字符串用UTF-8编码并构成一个新的值。[COOKIES] [RFC3629]

注:由于cookie属性是跨框架访问的,针对cookie的路径限制是管理某个cookie被用于网站的哪部分的唯一工具,并且不存在任何意义上的安全功能。
此区块中不是标准描述,实现要求在下面给出。document . lastModified

返回文档最近一次修改的时间。该时间由服务器返回,格式为用户本地时区的“MM/DD/YYYY hh:mm:ss”形式。

如果不能确定文档的最近修改时间,则返回当前时间。

当获取lastModified属性时,必须返回Document源文件的最后修改的日期和时间,日期和时间为用户所在的时区,且遵循以下格式:

  1. 日期的月份部分
  2. 一个U+002F斜线号字符(/)
  3. 日期的天数部分
  4. 一个U+002F斜线号字符(/)
  5. 日期的年份部分
  6. 一个U+0020空格字符
  7. 时间的小时部分
  8. 一个U+003A冒号字符
  9. 时间的分钟部分
  10. 一个U+003A冒号字符
  11. 时间的秒钟部分

以上所有的数字部分,除年份以外,都必须由两个U+0030数字零(0)至U+0039数字九(9)之间的十进制数字组成,如果必要使用零填充。年份必须由四位或四位以上尽可能短的U+0030数字零(0)到U+0039数字九(9)组成的十进制数字,如果必要使用零填充。

Document源文件的最近修改的日期和时间必须必须来源于网络所使用的协议的相关特征,例如:来源于文档的HTTP Last-Modified头的值,或者本地文件系统中的元数据(metadata)。如果最近修改的日期和时间不确定,这个属性必须返回遵循上述格式的当前的日期和时间。

此区块中不是标准描述,实现要求在下面给出。document . compatMode 为符合标准的文档返回字符串“CSS1Compat”。(为怪癖模式(quirks mode)的文档返回字符串“BackCompat”,但符合标准的文档不可能触发怪癖模式。)

Document被划分为三种模式:默认的“非怪癖模式”(no-quirks mode)、通常用于旧文档的“怪癖模式”(quirks mode)以及被认为“几乎标准”模式的“限制怪癖模式”(limited-quirks mode)。模式只能由HTML解释器基于文档类型声明(DOCTYPE)字符串是否存在以及它的值从默认模式修改。

如果文档没有被HTML解释器设置为怪癖模式,则compatModeIDL属性必须返回字符串“CSS1Compat”,否则应返回字符串“BackCompat”。

此区块中不是标准描述,实现要求在下面给出。document . charset [ = value ]

返回文档的字符编码

能够被设置,用于动态的改变文档的字符编码

如果新值不是用户代理所支持的IANA注册的别名,则忽略此操作。
此区块中不是标准描述,实现要求在下面给出。document . characterSet 返回文档的字符编码
此区块中不是标准描述,实现要求在下面给出。document . defaultCharset 返回用户代理可能的默认字符编码。(用户代理有可能返回完全相反的字符编码,例如:为了保护用户的隐私或者用户代理并非使用单一的默认编码。)
文档拥有一个关联的字符编码。当Document对象被创建时,文档的字符编码必须被初始化为UTF-16
Error creating thumbnail: Unable to save thumbnail to destination
。在页面加载过程中,各种算法通过charset设值函数影响它的值。[IANACHARSET]

当获取charsetIDL属性时,必须返回文档的字符编码首选MIME名称。当设置charsetIDL属性时,如果新值是浏览器支持的IANA注册的别名,则文档的字符编码必须被设置为这个字符编码。(否则不进行操作)

当获取characterSetIDL属性时,必须返回文档的字符编码首选MIME名称

当获取defaultCharsetIDL属性时,必须返回字符编码的首选MIME名称。该字符编码可能是用户的默认编码,也可能是关于用户当前地理位置的编码,或者任意的编码名称。

此区块中不是标准描述,实现要求在下面给出。document . readyState

Document加载时返回“loading”,当解析结束但仍在加载子资源时返回“interactive”,当加载结束返回“complete”。

当此值发生变化时,触发Document对象的readystatechange事件。

每个文档都有一个当前文档准备(current document readiness)。当一个Document对象被创建时,该文档必须拥有它的当前文档准备。如果该文档与HTML解释器XML解释器相关,那么当前文档准备应设为字符串“loading”;否则设为字符串“complete”。页面加载过程中,各种算法将影响此值。当这个值被设置时,用户代理必须触发一个Document对象的名为readystatechange简单事件

如果一个DocumentHTML解释器XML解释器相关,且解释器尚未结束终止,则称该Document拥有一个活动的解释器(active parser)

当获取readyStateIDL属性时,必须当前文档准备

DOM树存取器

如果存在一个文档的html元素,则它是文档的根元素。否则html元素为null。

此区块中不是标准描述,实现要求在下面给出。document . head 返回head元素。

如果存在一个文档的head元素,则它是html元素子元素中的的第一个head元素。否则head元素为null。

当获取head属性时,必须返回当前文档的head元素(一个head元素或null)。

此区块中不是标准描述,实现要求在下面给出。document . title [ - value ]

返回由title元素设置的文档的标题。 能够被设置,用于更新文档的标题。如果没有head元素,则新值将被忽略。

在SVG文档中,SVGDocument接口的title属性有更高的优先级。

如果存在一个文档的title元素,则它是文档中的第一个title元素(在树结构中),否则title元素为null。

当获取title属性时,运行下列算法:

  1. 如果根元素是一个拥有“http://www.w3.org/2000/svg”命名空间的svg元素,且用户代理支持SVG,则返回SVGDocument接口中同名的IDL属性所返回的值。
  2. 否则,将值设置为树结构中title所有子文本节点的数据的数据连接。如果title元素为null,则返回空字符串。
  3. 将值中任何单一或连续的空白字符替换为一个单独的U+0020空格字符。
  4. 去除值中开头或结尾的空白字符。
  5. 返回值。

当设置title属性时,必须运行下列算法。突变事件必须被适当的出发。

  1. 如果根元素是一个拥有“http://www.w3.org/2000/svg”命名空间的svg元素,且用户代理支持SVG,则设值函数必须把操作交由SVGDocument接口中同名的IDL属性的设值函数进行(如果后者为只读,则抛出异常),并在此处结束算法。
  2. 如果title元素和head元素均为空,则属性必须不进行任何操作,且在此处结束算法。
  3. 如果title元素为空,则新建一个新的title元素,将其追加至head元素之中,并将元素设为新建的元素。否则将元素设为title元素。
  4. 必须将元素的所有子节点(如果存在)移除。
  5. 一个独立的数据为被分配的值的Text节点必须被追加到元素之中。

如果用户代理同时支持HTML及SVG,则HTMLDocument接口中的title属性应该与SVGDocument接口制动同名属性相同。

此区块中不是标准描述,实现要求在下面给出。document . body [ = value ]

返回body元素。 能够被设置,用于替换body元素。

如果新值不是body或frameset元素,则抛出一个HIERARCHY REQUEST ERR异常。

文档的body元素是html元素子元素中的第一个body或frameset元素。如果没有这样的元素,则body元素为null,进而,规范要求的由“body元素”触发的时间需要由Document对象代为触发。

当获取body属性时,必须返回当前文档的body元素(body元素、frameset元素或null)。当设置body属性时,必须执行下列算法:

  1. 如果新值不是body或frameset元素,则抛出一个HIERARCHY REQUEST ERR异常,且在此处结束算法。
  2. 否则,如果新值与body元素相同,则不进行操作,且在此处结束算法。
  3. 否则,如果body元素为null,则使用DOM中的新值替换该元素。操作与调用根元素的replaceChild()方法相同,其中两个参数分别为新值和当前body元素。之后在此处结束算法。
  4. 否则,body元素为空。将新值追加到根元素中。
此区块中不是标准描述,实现要求在下面给出。document . images 返回Document中所有img元素的一个HTMLCollection。
此区块中不是标准描述,实现要求在下面给出。document . embeds

document . plugins

返回Document中所有embed元素的一个HTMLCollection。
此区块中不是标准描述,实现要求在下面给出。document . links 返回Document中所有拥有href属性的a和area元素的一个HTMLCollection。
此区块中不是标准描述,实现要求在下面给出。document . forms 返回Document中所有form元素的一个HTMLCollection。
此区块中不是标准描述,实现要求在下面给出。document . scripts 返回Document中所有script元素的一个HTMLCollection。

images属性必须返回一个根植于Document节点的HTMLCollection,其过滤器仅匹配img元素。

embeds属性必须返回一个根植于Document节点的HTMLCollection,其过滤器仅匹配embed元素。

plugins属性必须返回与embeds属性相同的对象。

links属性必须返回一个根植于Document节点的HTMLCollection,其过滤器仅匹配拥有href属性的a元素和area元素。

forms属性必须返回一个根植于Document节点的HTMLCollection,其过滤器仅匹配form元素。

scripts属性必须返回一个根植于Document节点的HTMLCollection,其过滤器仅匹配script元素。

此区块中不是标准描述,实现要求在下面给出。collection = document.getElementsByName(name) 返回Document中name属性为参数name的所有元素的一个NodeList。
此区块中不是标准描述,实现要求在下面给出。collection = document.getElementsByClassName(classes)

collection = element.getElementsByClassName(classes)

返回调用方法的对象(Document或Element)中所有的存在值为参数classes的class的元素的一个NodeList。

参数classes将被解释为class的以空格分隔的列表。

getElementsByName(name)方法以一个字符串name为参数,并且必须返回一个包含文档树结构中所有特定的HTML元素的活动的(live)NodeList,这些元素的name属性的值与name参数相等(区分大小写)。如果方法被Document对象使用相同的参数重复调用,则用户代理可以返回与之前调用返回值相同的对象。其他情况下,则必须返回一个新的NodeList对象。

getElementsByClassName(classNames)方法以一个由表示class的标记以空格分隔所组成的字符串作为参数。当调用该方法时,必须返回一个包含文档树结构中所有特定的元素的活动的(live)NodeList对象。这些元素的class被指定为参数值。class通过按空格分隔字符串(忽略重复)获得。如果参数中没有指定class标记,则方法必须返回一个空的NodeList。如果文档为怪癖模式,则对class的比较必须采用ASCII码的区分大小写方式进行,否则,必须采用区分大小写方式进行。如果方法被Document对象使用相同的参数重复调用,则用户代理可以返回与之前调用返回值相同的对象。其他情况下,则必须返回一个新的NodeList对象。

HTMLElement接口下的getElementsByClassName(classNames)方法必须返回一个活动的(live)NodeList,其中的节点为HTMLDocument的getElementsByClassName()方法使用相同参数所返回的节点,其中不包括调用当前方法的HTMLElement对象的子节点以外的所有节点。如果方法被一个HTMLElement对象使用相同的参数重复调用,则用户代理可以返回与之前调用返回值相同的对象。其他情况下,则必须返回一个新的NodeList对象。

HTML、SVG和MathML元素通过一个不含命名空间的名为class的属性定义了它们所在的class,该属性的值为使用空格分隔的这些元素所属的class的列表。其他规范可能同时允许元素使用命名空间来标记它们属于特殊的class。

下面的片段为XHTML代码:
<div id="example">
  <p id="p1" class="aaa bbb"/>
  <p id="p2" class="aaa ccc"/>
  <p id="p3" class="bbb ccc"/>
</div>

调用document.getElementById('example').getElementsByClassName('aaa')将返回一个包含段落p1和p2的NodeList。 调用getElementsByClassName('ccc bbb')将返回一个节点,即p3。调用document.getElementById('example').getElementsByClassName('bbb ccc')将返回相同的内容。

调用getElementsByClassName('aaa,bbb')将不会返回节点;上述元素中并不存在class为“aaa,bbb”的元素。

HTMLDocument接口支持命名属性。在任何时候,支持的属性名包括: Document中拥有name内容属性的applet、embet、form、iframe、img和fallback-free对象元素的name内容属性的值; Document中拥有id内容属性的applet和fallback-free对象元素的id内容属性的值; Document中同时拥有id和name内容属性的imgid内容属性的值;

当HTMLDocument通过一个名为name的属性检索进行索引,用户代理必须通过执行下列步骤获得返回值:

  1. 设elements为Document中的名为name的已命名元素列表。
    注:根据定义,至少要有一个这样的元素。
  2. 如果elements中仅包含一个元素,且该元素是一个iframe元素,则返回iframe元素说代表的嵌套浏览器上下文的WindowProxy对象,之后在此处结束算法。
  3. 否则,如果elements中仅包含一个元素,则返回该元素,之后在此处结束算法。
  4. 否则,返回一个植根于Document节点的HTMLCollection,其过滤器仅匹配名为name的已命名元素

对于上述算法,“名为name的已命名元素”指的是:

  1. 拥有name内容属性且其值为name的applet、embed、form、img或fallback-free对象元素。或
  2. 拥有id内容属性且其值为name的applet或fallback-free对象元素。或
  3. 拥有id和name内容属性且id属性值为name的img元素

如果一个object元素没有object或embed的后裔,则其被称为fallback-free。

注:HTMLDocument接口的dir属性是由dir内容属性定义的。

创建文档

XML文档可以通过脚本程序在DOMImplementation接口上使用createDocument()方法创建。

HTML文档可以使用createHTMLDocument()方法创建:

此区块中不是标准描述,实现要求在下面给出。document - document.implementation.createHTMLDocument(title) 返回一个基于DOM的,已经使用适当的title元素构建的新的文档。

当调用createHTMLDocument(title)方法时,必须执行下列步骤:

  1. 设doc为一个新创建的Document对象。
  2. 标记doc为一个HTML文档。
  3. 创建一个DocumentType节点,该节点的name属性被设为“html”,其他DocumentType对象的具体属性根据各自情况被设为空字符串、null或空列表。向doc中追加新创建的节点。
  4. 创建一个html元素,将其追加到doc之中。
  5. 创建一个head元素,将其追加到上一步创建的html元素之中。
  6. 创建一个title元素,将其追加到上一步创建的head元素之中。
  7. 创建一个Text节点,将其data属性设为方法参数所给出的字符串(可能为空字符串),将其追加到上一步创建的title元素之中。
  8. 创建一个body元素,将其追加到早前几步创建的html元素之中。
  9. 返回doc。

加载XML文档

一个由DOMImplementation.createDocument()工厂方法创建的XML文档的Document对象,必须同时实现XMLDocumentLoader接口:

load(url)方法必须执行下列步骤:

  1. 设document为调用方法的Document对象。
  2. 相对于入口脚本(entry script)的基本URL(base URL)分析方法的第一个参数。如果不成功,抛出一个SYNTAX ERR异常,之后在此处结束算法。否则,设url为分析所得的绝对URL。
  3. 如果url的源与document的源不相同,则抛出一个SECURITY ERR异常,之后在此处结束算法。
  4. 在不触发任何突变实践的情况下,移除document的所有孩子结点。
  5. 将document的当前文档准备设为“loading”。
  6. 异步地执行下列步骤,并且从方法中返回true。
  7. 设result为一个Document对象。
  8. 设success为false。
  9. 从document的源中提取(Fetch)url,并且设置同步标记(synchronous flag)和强制同源标记(force same-origin flag)。
  10. 如果提取成功,并且资源的内容类型元数据(Content-Type metadata)为XML MIME类型,则执行下列分步骤:
    1. 创建一个与result文档关联的新的XML解析器。
    2. 通过这个解析器提取文档。
    3. 如果出现XML良构(well-formedness)或XML命名空间良构错误,则移除result中的所有子节点。否则设success为true。
  11. 排队任务执行下列步骤:
    1. 设置document的当前文档准备为“complete”。
    2. 使用result的子节点(即使其没有子节点)替换所有document的子节点,触发与插入包含新的子节点的DocumentFragment时相同的突变事件。
    3. 触发document的一个名为load的简单事件。

元素

语义

本章節不具有實作相關內容

DOM中的元素

表示DOM中HTML元素的节点必须实现,并且向脚本程序公开,有关它们的接口将在本规范的相关章节中列出。这包括XML文档HTML元素,即使这些文档在其他上下文中(例如在XSLT转换之内)。

从所有HTML元素的接口继承而来,并且必须被没有额外需求的元素所使用的基本接口,被称为HTMLElement接口。

interface HTMLElement : Element {
  // DOM树访问器
  NodeList getElementsByClassName(in DOMString classNames);

  // 动态标记插入
           attribute DOMString innerHTML;
           attribute DOMString outerHTML;
  void insertAdjacentHTML(in DOMString position, in DOMString text);

  // 元数据属性
           attribute DOMString id;
           attribute DOMString title;
           attribute DOMString lang;
           attribute DOMString dir;
           attribute DOMString className;
  readonly attribute DOMTokenList classList;
  readonly attribute DOMStringMap dataset;

  // 用户互动
           attribute boolean hidden;
  void click();
           attribute long tabIndex;
  void focus();
  void blur();
           attribute DOMString accessKey;
  readonly attribute DOMString accessKeyLabel;
           attribute boolean draggable;
  [PutForwards=value] attribute DOMSettableTokenList dropzone;
           attribute DOMString contentEditable;
  readonly attribute boolean isContentEditable;
           attribute HTMLMenuElement contextMenu;
           attribute boolean spellcheck;

  // 命令API
  readonly attribute DOMString commandType;
  readonly attribute DOMString label;
  readonly attribute DOMString icon;
  readonly attribute boolean disabled;
  readonly attribute boolean checked;
  // styling
readonly attribute CSSStyleDeclaration style;
Error creating thumbnail: Unable to save thumbnail to destination
  // 事件处理行为IDL属性
           attribute Function onabort;
           attribute Function onblur;
           attribute Function oncanplay;
           attribute Function oncanplaythrough;
           attribute Function onchange;
           attribute Function onclick;
           attribute Function oncontextmenu;
           attribute Function oncuechange;
           attribute Function ondblclick;
           attribute Function ondrag;
           attribute Function ondragend;
           attribute Function ondragenter;
           attribute Function ondragleave;
           attribute Function ondragover;
           attribute Function ondragstart;
           attribute Function ondrop;
           attribute Function ondurationchange;
           attribute Function onemptied;
           attribute Function onended;
           attribute Function onerror;
           attribute Function onfocus;
           attribute Function oninput;
           attribute Function oninvalid;
           attribute Function onkeydown;
           attribute Function onkeypress;
           attribute Function onkeyup;
           attribute Function onload;
           attribute Function onloadeddata;
           attribute Function onloadedmetadata;
           attribute Function onloadstart;
           attribute Function onmousedown;
           attribute Function onmousemove;
           attribute Function onmouseout;
           attribute Function onmouseover;
           attribute Function onmouseup;
           attribute Function onmousewheel;
           attribute Function onpause;
           attribute Function onplay;
           attribute Function onplaying;
           attribute Function onprogress;
           attribute Function onratechange;
           attribute Function onreadystatechange;
           attribute Function onreset;
           attribute Function onscroll;
           attribute Function onseeked;
           attribute Function onseeking;
           attribute Function onselect;
           attribute Function onshow;
           attribute Function onstalled;
           attribute Function onsubmit;
           attribute Function onsuspend;
           attribute Function ontimeupdate;
           attribute Function onvolumechange;
           attribute Function onwaiting;
};
interface HTMLUnknownElement : HTMLElement { };

HTMLElement接口拥有的方法和属性与一些不同的特性有关,因此该接口的成员将在本规范的不同章节分别介绍。

HTMLUnknownElement接口必须被用于本规范(或其他适用的规范)中没有定义的HTML元素

全局属性

下列各项是常见的,且可以被所有HTML元素(即使是那些没有在本规范中定义的)所指定的属性。

下列各项是可以被任何HTML元素指定的事件处理函数内容属性。

  • onabort
  • onblur*
  • oncanplay
  • oncanplaythrough
  • onchange
  • onclick
  • oncontextmenu
  • oncuechange
  • ondblclick
  • ondrag
  • ondragend
  • ondragenter
  • ondragleave
  • ondragover
  • ondragstart
  • ondrop
  • ondurationchange
  • onemptied
  • onended
  • onerror*
  • onfocus*
  • oninput
  • oninvalid
  • onkeydown
  • onkeypress
  • onkeyup
  • onload*
  • onloadeddata
  • onloadedmetadata
  • onloadstart
  • onmousedown
  • onmousemove
  • onmouseout
  • onmouseover
  • onmouseup
  • onmousewheel
  • onpause
  • onplay
  • onplaying
  • onprogress
  • onratechange
  • onreadystatechange
  • onreset
  • onscroll*
  • onseeked
  • onseeking
  • onselect
  • onshow
  • onstalled
  • onsubmit
  • onsuspend
  • ontimeupdate
  • onvolumechange
  • onwaiting
注:标记星号的属性被应用于提供同名的Window对象的事件处理函数的body元素时拥有不同的意义。
注:虽然这些属性适用于所有元素,但是并不一定对所有元素都有作用。举例说明,只有媒体元素能够接受用户代理触发的volumechange事件。

自定义数据属性(例如data-foldername或data-msgid)能够被指定在任意HTML元素上,来储存特定于页面的自定义数据。

在HTML文档中,对于HTML命名空间内的元素,该元素可以拥有一个值为“http://www.w3.org/1999/xhtml”的xmlns属性。这不适用于XML文档。

注:在HTML中,xmlns属性没有任何作用。其基本上只是一个护身符。它仅仅是允许向XHTML或从XHTML迁移变得稍显轻松。当使用HTML解析器进行解析时,该属性以没有命名空间的形式结束,而不是向XML所做的那样将“http://www.w3.org/2000/xmlns”命名空间作为命名空间声明属性。
注:在XML中,xmlns属性是命名空间声明机制的一部分,实际上一个元素不能再没有指定命名空间的情况下拥有xmlns属性。

XML规范还允许在一个XML文的的任意一个元素上的XML命名空间中使用xml:space属性。该属性对于HTML元素没有作用,因为在HTML中的默认行为是保留空白。

注:在使用text/html的HTML元素中,无法序列化xml:space属性。

对HTML元素和属性标注“辅助技术产品注释”(ARIA role和aria-*属性),来开启辅助技术产品,将会公开更细颗粒度的接口。

id属性

id属性用于指定其元素的唯一标识符(ID)。它的值必须在元素的根子树(home subtree)的所有ID中保持唯一,并且包含至少一个字符。该值必须不包含任何空白字符。

注:一个元素的唯一标识符能够被用于多种用途,其中最常用的功能包括:使用片段的标识符关联文档的指定部分;在脚本程序中定位一个元素;以及在CSS中样式化指定元素。

若其值不是空字符串,用户代理必须将该元素与指定的值关联起来(确切地,包含任何空格字符),以便在元素的根子树中进行ID匹配(例如CSS中的选择器或DOM中的getElementById()方法)。

标识符是不透明的字符串。尤其是元素的含义不应该来自id属性的值。

如果其他机制(例如DOM核心方法)能够在不与id属性冲突的情况下设置一个元素的ID,本规范亦不排除元素拥有多个ID。

id IDL属性必须反映id内容属性。

title属性

title属性表示元素的资讯信息,例如适当的提示。在链接上,它可能是目标资源的标题或描述;在图片上,它可能是图片来源或图片的描述;在段落中,它可能是该段文字的脚注或评论;在引文中,它可能是来源的详尽信息或出处。该属性的值是文字。

如果这个属性被元素所省略,则意味着与该元素的最近的拥有title属性的祖先HTML元素的title属性同样与该元素有关。通过设置这个属性,可以显式地说明任何祖先的资讯信息都与该元素无关。设置这个属性为空字符串,则说明该元素没有咨询信息。

如果title属性的值包含U+000A换行(LINE FEED, LF)字符,则其内容将被分割为多行。每个U+000A换行(LINE FEED, LF)字符代表一个换行符。

title属性中使用新行需谨慎。 例如,下面的片段实际上定义了一个包含换行符的缩写的展开形式:

<p>我的记录表明很多人对<abbr title="Hypertext
Transport Protocol">HTTP</abbr>感兴趣。</p>

某些诸如linkabbrinput元素在上述语义描述之外赋予了title属性额外的语义。

title IDL属性必须反映title内容属性。

lang和xml:lang属性

lang属性(没有命名空间)表示元素内容以及元素的属性所包含的文字的主要语言。它的值必须为一个有效地BCP 47语言标签或空字符串。将该值设为空字符串表示主语言不明。[BCP47]

拥有XML命名空间的lang属性在XML中定义。[XML]

如果该属性元素被忽略,则元素的语言与其父元素的语言相同。

拥有XML命名空间的lang属性可以被用于XML文档中的HTML元素,如果相关的规范允许,其也可以被用于其他命名空间中的元素(特别是MathML和SVG允许拥有XML命名空间的lang属性被用于其元素之上)。如果拥有XML命名空间的lang属性和没有命名空间的lang属性同时被标记于同一个元素之上,则它们必须在ASCII不区分大小写方式的比较下拥有相同的值。

编码人员不得在HTML文档内的HTML元素上使用拥有XML命名空间的lang属性。为了轻松的从XHTML或向XHTML迁移,编码人员可以为HTML文档中的HTML元素指定一个没有代理的字面上的局部名称为“xml:lang”的没有命名空间的属性,但是这些属性仅能在已经指定了一个没有命名空间的lang属性的情况下指定,且两个属性的值必须在ASCII不区分大小写方式的比较下拥有相同的值。

注:该没有代理的字面上的局部名称为“xml:lang”的没有命名空间的属性在语言处理过程中没有任何作用。

为了确定一个节点的语言,用户代理必须查找最近的祖先元素(如果节点是一个元素,则需包含该元素本身),这些祖先元素需要设置了拥有XML命名空间的lang属性,或者如果是HTML元素则需设置了没有命名空间的lang属性。该属性的值表示节点的语言(不论其值是什么)。

如果拥有XML命名空间的lang属性和没有命名空间的lang属性同时被标记于同一个元素之上,在确定元素的语言时,用户代理必须使用拥有XML命名空间的lang属性,并且忽略没有命名空间的lang属性。

如果节点的祖先(包括根元素)均没有设置上述两种属性,但是设置了杂集默认语言(pragma-set default language),则该值为节点的语言。如果仍然没有设置杂集默认语言,则必须使用上级协议(诸如HTTP)的语言信息作为最终返回的语言。如果没有任何的语言信息且上级协议返回了多个语言,则节点的语言为不明,且设置相应的语言标签为空字符串。

如果返回值不是一个有效地语言标签,则必须将其视为具有指定语言标签的不同于其他语言的一种未知语言。为了与给出该语言标签的服务进行交互与通信,用户代理应该在不进行修改的情况下通过该语言标签。

因此,举例说明,一个包含lang="xyzzy"的元素能够被:lang(zyzzy)选择器所匹配(例如在CSS中),但是不能被:lang(abcde)匹配,即使两种语言均是无效的。同样的,如果一个Web浏览器和屏幕阅读器在元素的语言问题上进行沟通,即使浏览器认为该语言是无效的,浏览器应该告诉屏幕阅读器其语言为“zyzzy”,这是为了防止屏幕阅读器事实上是支持该标签的语言的。

如果返回值是空字符串,则必须将这种情况明确地解释为节点的语言为不明。

用户代理可以使用元素的语言来决定如何恰当的进行处理和渲染(例如,选择适当的字体或发音、选择字典)。

lang IDL属性必须反映没有命名空间的lang内容属性。

xml:base属性

xml:base属性在XML Base中定义。[XMLBASE]

xml:base属性可以被用于XML文档的元素上。编码人员不得在HTML文档中使用xml:base属性。

dir属性

dir属性指定元素文本的书写方向。该属性是一个枚举属性,它的值为下列关键字和状态之一:

  • ltr关键字,映射至ltr状态。
    表示元素的内容是明确的从左至右嵌入文本。
  • rtl关键字,映射至rlt状态。
    表示元素的内容是明确的从右至左嵌入文本。
  • auto关键字,映射至auto状态。
    表示元素的内容是明确的嵌入文本,但方向取决于元素的内容的编写方式。(如下所述)
    注:此状态所使用的判断方法非常粗略(在双向算法中基于段落级的判断方法只关注第一个具有强方向性的字符)。
    编码人员被要求仅在确实不知道文本的方向且不能使用服务器端算法判断方向时使用该值。
    注:对于textareapre元素,判断算法将应用于“每一段落”等级。

该属性没有默认无效值和默认缺失值。

元素的方向只能为'ltr'或'rtl'之一,并且,对于它的值,应该经由逐一匹配下列步骤得出:

  • 如果元素的dir属性为ltr状态
    则元素的方向为'ltr'。
  • 如果元素的dir属性为rtl状态
    则元素的方向为'rtl'。
  • 如果元素的dir属性为auto状态
  • 如果该元素是一个bdi元素且dir属性的值不是一个已定义的状态(例如该状态不存在或者是一个无效的值)
    按照下列标准沿着树形结构查找第一个字符:
    • 该字符来自一个已经确定文字方向的元素的后裔文本节点。
    • 该字符是类型为L、AL或者R的双向字符。[BIDI]
    • 该字符不再一个文本节点之中,且该节点拥有一个已知方向的元素的后裔元素作为其祖先元素,且该元素为下列元素之一:
    • 如果找到满足条件的字符,并且该字符是类型为AL或者R的双向字符,则元素的方向为'rtl'。
      否则元素的方向为'rtl'。
  • 如果该元素是一个根元素且dir属性的值不是一个已定义的状态(例如该状态不存在或者是一个无效的值)
    则元素的方向为'ltr'。
  • 如果该元素有一个父元素且dir属性的值不是一个已定义的状态(例如该状态不存在或者是一个无效的值)
    则元素的方向与其父元素的方向一致。

这个属性的作用主要在表现层。举例说明,在本规范的渲染部分定义了从该属性到CSS的'direction'和'unicode-bidi'属性的映射,并且,CSS针对这些属性所定义了渲染方式。

此区块中不是标准描述,实现要求在下面给出。

document .dir [-value]
如果存在,返回html元素的dir属性的值。
能够被设置,其值只能为“ltr”,“rtl”或“auto”之一,其值将用于替换html元素的dir属性的值。
如果不存在html元素,则返回空字符串,并且忽略新值。

dir IDL属性必须反映元素的dir内容属性,且仅限已知的值。

如果HTMLDocument对象中的html元素存在[HTML5#dir属性|dir]]内容属性,则dir IDL属性必须反映html元素的dir内容属性,且仅限已知的值。如果没有,则该属性必须返回空字符串并且不执行设值函数。

注:我们强烈的鼓励编码人员使用dir属性替代CSS来声明文本的方向,因为这种方法能够在缺少CSS的情况下继续工作(例如在搜索引擎中展示)。

这是一个即时通讯谈话的标记片段。

<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> How do you write "What's your name?" in Arabic?</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> ما اسمك؟</p>
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> Thanks.</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> That's written "شكرًا".</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> Do you know how to write "Please"?</p>
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> "من فضلك", right?</p>

给定一个样式表并且设置p元素的默认对齐方式,即将文本对齐到段落的开始边缘(start edge),则渲染结果如下:

File:Http://www.w3.org/TR/2011/WD-html5-20110525/im.png

如之前所说,auto值并不是万能的。例子中的最后一段被错误的渲染为从右到左属性的文本,因为该段由阿拉伯语字符开始,这导致“right?”被显示在了阿拉伯语文本的左侧。

class属性

任意HTML元素都可以指定class属性。

如果指定了该属性,则其值必须为以空格分隔的该元素所属各类名称的集合。

指定给HTML元素的类,来自于将该元素class属性的值按照空格分割所得的所有的类(忽略重复)。

注:为元素分配类,将影响CSS选择器的匹配、DOM中的getElementsByClassName()方法以及其他特性。

对于编码人员使用的用于class属性的值的名称没有额外的限制,但是我们鼓励编码人员使用“内容的性质”而不是“内容的预期表现”作为该属性的值。

className和classList IDL属性都必须反映元素的class内容属性。

style属性

所有HTML元素都可以设置style属性。这是一个定义自CSS样式属性语法规范的CSS样式属性。

对于支持CSS的用户代理,该属性的值必须在被增加或修改时按照CSS样式属性给出的规则进行解析。

对于其中任意元素使用了style属性的文档,如果这些属性被移除,则该文档必须仍然能够被理解和可用。

注:使用style属性来隐藏和显示内容,或者传达不列入该文档的意义,是不符合规范的。(应该使用hidden属性来实现隐藏和显示内容)。
此区块中不是标准描述,实现要求在下面给出。document . style
返回元素style属性的CSSStyleDeclaration对象。

style IDL属性都必须返回其值表示该属性所指定的声明的CSSStyleDeclaration对象。为了改变CSSStyleDeclaration对象,必须为该元素创建一个style属性(如果不存在)并且将其值改为表示CSSStyleDeclaration对象序列化形式的值。

在下列示例中,使用span元素标记要改变颜色的文字,并通过style属性使这些文字在视觉媒体上显示为指定的颜色。

<p>我的运动服是<span style="color: green; background: transparent">绿色的</span>,
我的眼睛是<span style="color: blue; background: transparent">蓝色的</span>。</p>
用data-*属性嵌入自定义的不可见数据

自定义数据属性是一个没有命名空间的属性。该属性的名称以字符串“data-”开头,并且在连字符之后有至少一个字符,为了兼容XML,这些字符还不能包含U+0041到U+005A范围内的字符(拉丁大写字母A至拉丁大写字母Z)。

注:对于所有HTML文档内的HTML元素的属性,都自动获得其ASCII小写形式,所以在HTML文档中对ASCII大写字母的限制没有影响。

自定义数据属性被设计用于在没有适当的属性或元素的情况下储存页面或应用范围内的自定义数据。

该属性不是为了独立于使用该属性的网站的软件而设计的。

一个关于音乐的站点,可以通过包含每首曲目长度的自定义数据属性来标记在表示专辑中曲目的列表项上。这些信息能够在之后被用于允许用户按照曲目程度对列表进行排序或筛选。

<ol>
	<li data-length="2m11s">Beyond The Sea</li>
</ol>

对于使用与该网站不相关的通用软件的用户在这些数据中搜索某些长度的曲目,这可能并不恰当。 这是因为这些属性是为了该站点所拥有的脚步程序而设计的,而不是公开可用的元数据的通用扩展机制。

每一个HTML元素都可以通过任意的值指定多个自定义数据属性。

此区块中不是标准描述,实现要求在下面给出。element . dataset

返回一个元素的data-*属性的DOMStringMap对象。

联用的名称将转化为骆驼大小写形式(camel-cased)。举例说明,data-foo-bar=""将转化为element.dataset.fooBar

dataset IDL属性提供对元素的data-*属性的方便的存取功能。当获取时,dataset IDL属性必须参照下列算法返回一个暴露该元素这些属性的DOMStringMap对象:

  • 用于获取名值对里列表的算法
    1. list为一个空的名值对列表。
    2. 对于元素中每一个前五个字符为字符串“data-”且其余字符(如果存在)中不包含U+0041到U+005A范围内的字符(拉丁大写字母A到拉丁大写字母Z)的内容属性,向list添加一个名值对,该名值对的名称为移除了前五个字母的属性名称,值为属性的值。
    3. 对于列表中的每个名称中的每个其后跟随U+0061到U+007A范围内字符(拉丁小写字母A到拉丁小写字母Z)的U+002D“连字符-符号”字符(-),移除U+002D“连字符-符号”字符(-)并且替换其后跟随的字符为相同字符的ASCII大写形式。
    4. 返回list
  • 用于为某值设置名称的算法
    1. name为输入到算法中的名称。
    2. value为输入到算法中的值。
    3. 如果name包含跟随在U+0061到U+007A范围内的字符(拉丁小写字母A-拉丁小写字母Z)之后的U+002D连字符-负号字符(-),则抛出一个SYNTAX ERR异常,并在此处结束算法。
    4. 对于name中的每一个U+0041到U+005A范围内的字符(拉丁大写字母A-拉丁大写字母Z),在该字符前插入一个U+002D连字符-负号字符(-)并将该字符替换为相同字符的ASCII小写形式。
    5. name之前插入字符串“data-”。
    6. 设置名为name的属性,将其值设为value,如果该属性已经存在则替换原值。如果setAttribute()在设置名为name的属性时抛出异常,则本算法必须抛出同样的异常。
  • 用于删除名称的算法
    1. name为输入到算法中的名称。
    2. 对于name中的每一个U+0041到U+005A范围内的字符(拉丁大写字母A-拉丁大写字母Z),在该字符前插入一个U+002D连字符-负号字符(-)并将该字符替换为相同字符的ASCII小写形式。
    3. name之前插入字符串“data-”。
    4. 如果名为name的属性存在,则删除该属性。否则不执行任何操作。

每次调用必须返回相同的对象。

如果一个网页要使用一个元素表示飞船,例如游戏的一部分,则该元素必须使用class属性以及data-*属性:

<div class="spaceship" data-ship-id="92432"
     data-weapons="laser 2" data-shields="50%"
     data-x="30" data-y="10" data-z="90">
 <button class="fire"
         onclick="spaceships[this.parentNode.dataset.shipId].fire()">
  开火
 </button>
</div>

注意API中连字符是如何转换成骆驼型命名法的。

编码人员应该仔细地设计这些扩展,以便当这些属性被忽略或者任意相关CSS被移除后该页面仍然可用。

用户代理禁止通这些属性或值中派生实现行为。规范要求用户代理禁止为这些属性定义任何有意义的值。

JavaScript库可以使用自定义数据属性,因为它们被认为是其所使用的页面的一部分。我们鼓励那些广泛应用的JavaScript库的作者将他们的名字用于属性名之中,以减少冲突的风险。如果需要,我们也鼓励JavaScript库的作者在属性名中使用自定义的严谨的名称,以便那些作者在不知情的情况下使用了相同名称的库可以被用于同一个页面,以及某个库的不同版本能够被用于同一个页面,即使这些版本相互不兼容。

举例说明,一个名叫“DoQuery”的库可以使用类似于data-doquery-range的属性名,而另一个名叫“jJo”的库则可以使用类似于data-jjo-range的属性名。jJo库也可以提供用于设置所使用的前缀的API(例如:J.setDataPrefix('j2'),用于设置属性的名称类似于data-j2-range)。

元素定义

本规范中的每个元素都有一个包含下列信息的定义:

  • 分类
    该元素所属的分类的列表。用于为每个元素设置内容属性。
  • 该元素可用于哪些上下文中
    该元素可被用于的地方的非规范描述。这些信息与哪些允许此元素作为子节点的元素的内容模型信息相互冗余,本信息仅仅为了方便。
    注:为简单起见,只列出了最具体的期望。举例说明,一个既是流式内容又是章节式内容的元素可以用于预期为流式内容或章节式内容的任何地方,但是因为所有预期为流式内容的地方都会同时预期章节式内容(因为所有章节式内容都是流式内容),所以只会列出“这里预期的是章节式内容”。
  • 内容模型
    该元素必须包含为孩子或后继的内容的规范的描述。
  • 内容属性
    该元素可以指定的属性的规范的列表。
  • DOM接口
    该元素必须实现的DOM接口的规范的定义。

这之后将是该元素所表示内容的描述、编码人员和实现可能需要的额外的符合标准的规范。有时可能还会包含示例。

属性

除非另有规定,HTML元素的属性可以包含任意字符串值,包括空字符串。除非明确说明,对于这些属性所指定的文本没有限制。

内容模型

所有本规范内定义的元素都拥有一个内容模型:该元素的预期内容的描述。一个HTML元素的内容必须与该模型的内容模型中描述的需求相匹配。

注:对一致性和术语章节的补充,基于确定一个元素是否与其内容模型匹配的功能,在DOM中,CDATASection节点被视为等同于Text节点,并且实体引用节点被视为它们在该位置展开

元素之间的空白字符是被允许的。在DOM中用户代理以文本节点的形式表示这些源标记中存在于元素之间的字符。空文本节点以及仅包含空白字符序列的文本节点被认为是元素间空白(inter-element whitespace)

元素间空白、注释节点以及处理指令节点在判断元素的内容是否与元素的内容模型相匹配时必须被忽略,另外在使用下列算法定义文档及元素的语义时也必须被忽略。

注:因此,如果一个元素A和元素B拥有相同的父元素且它们之间没有其他元素节点或文本节点(除了元素间空白),则称元素A在另一个元素B的前面或后面。相似的,如果一个元素仅包含元素间空白、注释节点以及处理指令节点而没有其他节点,则该节点成为该元素的唯一孩子。

编码人员仅能将HTML元素用于其显式允许的地方,这些地方由每个元素定义,或被其他规范明确的需要。对于XML复合文档,如果某些元素的定义声明其提供相关的上下文,则这些上下文可以存在于其他命名空间的元素之中。

举例说明,Atom标准定义了一个content元素。如果他的type属性的值为xhtml,则Atom规范要求该元素包含一个独立的HTML div元素。因此,在此上下文中允许div元素,即使本规范没有明确地规范地声明。[ATOM]

此外,HTML元素还可能是一个孤儿节点(例如没有父节点)。

举例说明,创建一个td元素,并且将它保存在脚本程序的全局变量中是符合规范的,即使td元素仅允许在tr元素中使用。

var data = {
  name: "Banana",
  cell: document.createElement('td'),
};
内容种类

HTML中的每个元素都属于零或多个分类(categories),这些分类将元素按照相似的特性分组。下列大类将在本规范中使用:

注:某些元素有可能属于本规范其他部分中定义的其他分类。
Error creating thumbnail: Unable to save thumbnail to destination

此外,某些元素被分类为表单连结元素并且由更细的分类定义其在各自关于表单的处理模型中的角色。

一些元素拥有特殊要求并且不适合于任何特定分类。

元数据式内容

元数据式内容可以被用于说明其他内容的表现或行为、在当前文档和其他文档之间建立联系以及传递其他“带外(out of band)”信息。

basecommandlinkmetanoscriptscriptstyletitle

来自其他命名空间的元素,若其语义主要与元数据相关(例如RDF),则其也是元数据式内容

因此,在XML的序列化中,可是采用如下方法使用RDF:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:r="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <head>
    <title>主页</title>
    <r:RDF>
      <Person xmlns="http://www.w3.org/2000/10/swap/pim/contact#" r:about="http://metadata.example.com/#">
        <fullName>Cat Hedral</fullName>
        <mailbox r:resource="mailto:hedral@damowmow.com"/>
        <personalTitle>Sir</personalTitle>
      </Person>
    </r:RDF>
  </head>
  <body>
    <h1>我的主页</h1>
  </body>
</html>

但是,这不适用于HTML的序列化。

流式内容

在应用程序和文档的主体部分中使用的大部分元素都被分类为流式内容

aabbraddressarea(如果它是map元素的后裔), articleasideaudiobbdibdoblockquotebrbuttoncanvascitecodecommanddatalistdeldetailsdfndivdlemembedfieldsetfigurefooterformh1h2h3h4h5h6headerhgrouphriiframeimginputinskbdkeygenlabelmapmarkmathmenumeternavnoscriptobjectoloutputppreprogressqrubyssampscriptsectionselectsmallspanstrongstyle(如果该元素设置了scoped属性), subsupsvgtabletextareatimeuulvarvideowbrtext

作为通用规则,内容模型允许流式内容的元素,应该拥有至少一个不是元素间空白文本节点或者嵌入式内容的元素节点作为其后裔。该要求的目的在于,del元素及其后裔不能被作为del元素的祖先。

该要求不是硬性要求,因为在很多情况下,一个元素能够合法的被设为空。举例说明,一个元素可能被用作占位符,该元素将在之后通过脚本程序填充;或者一个元素可能作为模板的一部分,该元素可能只在某些页面被填充。

章节式内容

章节式内容是用于定义标题页脚范围的内容。

articleasidnavsection

每一个#sectioning-content章节式内容的元素都隐式的拥有一个标题和一个大纲。查看头和区块章节了解详细信息。

注:同时还存在某些根章节式元素。它们与章节式内容不同,但它们仍然可以拥有大纲
标题式内容

标题式内容定义一个区块/章节(section)(无论是明确的使用章节式内容的元素标记,或者标题式内容自身所隐含的)的标题。

h1h2h3h4h5h6hgroup

段落式内容

段落式内容是文档中的文本、以及标记段落级文本的元素。段落式内容段落中来。

a(如果其只包含段落式内容), abbrarea(如果它是map元素的后裔), audiobbdibdobrbuttoncanvascitecodecommanddatalistdel(如果其只包含段落式内容), dfnemembediiframeimginputins(如果其只包含段落式内容), kbdkeygenlabelmap(如果其只包含段落式内容), markmathmeternoscriptobjectoutputprogressqrubyssampscriptselectsmallspanstrongsubsupsvgtextareatimeuvarvideowbrtext

作为通用规则,内容模型允许任意段落式内容的元素应该拥有至少一个不是元素间空白文本节点或者嵌入式内容的元素节点作为其后裔。该要求的目的在于,del元素及其后裔不能被作为del元素的祖先。

注:大多数被分类为段落式内容的元素能够只包含本身被分为段落式内容的元素,而不是任何流式内容。

在内容模型的上下文中,文本(Text)表示文本节点文本在某些时候被用作其自身的内容模型,但是它仍然是段落式内容,并且可以是元素间空白(如果文本节点为空或者仅包含空白字符)。

嵌入式内容

嵌入式内容是引用到本文档中的其他资源的内容,或者被插入到本文档中的其他词汇的内容。

audiocanvasembediframeimgmathobjectsvgvideo

带有除HTML以外的命名空间且传递元数据以外内容的元素,是本规范中内容模型定义的目的的嵌入式内容。(例如:MathML或SVG)。

某些嵌入式内容元素可以拥有备用内容(fallback content):当外部资源不可用时(例如:因为其为不支持的格式)使用的内容。如果存在该元素,则该元素定义备用内容的状态。

交互式内容

交互式内容是专门用于用户交互的内容。

aaudio(如果设置了controls属性), buttondetailsembediframeimg(如果设置了usemap属性), input(如果type属性不为hidden状态), keygenlabelmenu(如果type属性为toolbar状态), object(如果设置了usemap属性), selecttextareavideo(如果设置了controls属性)

某些HTML元素拥有一个激活行为(activation behavior),该行为表示用于可以激活它们。该行为触发的一些列事件取决于激活机制。该集中通常为click事件,其描述如下。

用户代理应该允许用户手动触发拥有激活行为的元素,例如通过键盘、声音的输入或鼠标点击。当用户通过除点击以外的一个已定义的激活行为触发了一个元素,则互动事件的默认行为必须在该元素上运行合成点击激活步骤(run synthetic click activation steps)

当用户代理在元素上运行合成点击激活步骤时,用户代理必须在元素上运行点击前激活步骤(run pre-click activation steps),之后在元素上触发一个click事件click事件的默认行为必须在元素上运行点击后激活步骤(run post-click activation steps)。如果事件被取消,用户代理必须在元素生改为运行取消激活步骤(run canceled activation steps)。

若一个定点设备(pointing device)被点击,则用户代理必须运行下列步骤:

  1. 若用户代理指定的元素的最近的可激活元素存在,则设其为e
  2. 如果元素e存在,则运行它的点击前激活步骤
  3. 调用所需的click事件。
    如果元素e存在,则click事件必须在元素e上运行点击后激活步骤
    如果元素e存在但事件被取消,则用户代理必须在元素e上运行取消激活步骤。
    注:上述步骤不会发生在任意由作者脚本(author script)派生的合成事件上。然而,click()方法可以被用于通过编程使其发生。

给出一个元素目标target,其最近的可激活元素是通过下列算法返回的:

  1. 如果target拥有一个已定义的激活行为,则返回target并且在次步骤停止。
  2. 如果target拥有一个父元素,则设置target为该父元素并且返回第一步。
  3. 否则,最近的可激活元素不存在。

当一个用户代理在一个元素上运行点击前激活步骤时,如果该元素的点击前激活步骤存在,则必须运行它。

当一个用户代理在一个元素上运行取消激活步骤时,如果该元素的取消激活步骤存在,则必须运行它。

当一个用户代理在一个元素上运行点击后激活步骤时,如果该元素的激活行為存在,则必须运行它。激活行为可以被指向被导致这一点的上述步骤所激活的click事件。

透明内容模型

某些元素被描述为透明的;它们的内容模型描述中存在“透明(transparent)”。一个透明的元素的内容模型是来自它的父元素的内容模型:若一个元素的内容模型中一部分为“透明”,则该元素的需求与该透明元素的父元素中的找到该元素那一部分内容模型的需求相同。

举例说明:一个在ruby元素内的ins元素不能包含rt元素,因为允许ins元素的那一部分ruby元素的内容模型只允许段落式内容,而rt元素不是段落式内容
注:在某些情况下,透明元素相互嵌套,这是上述过程需要迭代应用。

考虑下列标记片段:

<p><object><param><ins><map><a href="/">Apples</a></map></ins></object></p>

为了检查“Apples”是否允许被插入到a元素之中,我们需要研究内容模型。a元素的内容模型是透明的,与map元素相同,与ins元素相同,与object元素在找到ins元素时的一部分相同。object元素在内容模型为段落式内容的p元素之内。因此,“Apples”被允许,因为文本是段落式内容

若一个透明元素没有父元素,则该元素标为“透明”的那一部分内容模型必须被视为接受任何流式内容

段落
注:本节定义的术语段落与之后定义的p元素不同(虽然相关)。在这里定义的段落概念用于描述如何解释文档。

一个段落通常是形成讨论一个特定话题的一或多个句子的文本块的段落式内容。与活版印刷相同,但其还可以被用于更多的一般主题小组。举例说明:一个地址可以是一个段落,就像表单的一部分、署名或诗的一节。

在下面的例子中,一节内有两个段落。其中还包含一个标题,该标题包含了一个不是段落的段落式内容。注意注释和元素间空白不形成段落。

<section>
  <h1>段落的例子</h1>
  这是<em>第一个</em>段落。
  <p>这是第二个段落。</p>
  <!-- 这不是段落。 -->
</section>

流式内容中的段落定义了文档在不包含ainsdelmap元素的情况下的显示形式。因为上述包含混合内容模型的元素可以下下列两个例子中所展示的跨越段落的边界。

注:通常来讲应该尽量避免使用跨越段落边界的元素,因为维护它们可能非常困难。

在下面的例子中使用了前一个例子的标记,并且在某些标记周围插入了insdel元素以展示文本将如何变化(虽然在该情况下,不可否认的变化没有什么意义)。请注意这个例子正好与前一个例子除insdel元素以外使用了相同的段落。——ins元素跨越了标题和第一个段落,del元素跨越了两个段落的边界。

<section>
  <ins><h1>段落的例子</h1>
  这是<em>第一个</em></ins>段落<del>。
  <p>这是第二个段落。</p></del>
  <!-- 这不是段落。 -->
</section>

view为一个DOM视图,该视图将文档内的所有ainsdelmap元素替换为它们的内容。之后,在view中,对于遇到的每一个不被其他类型的内容(允许的内容不是段落式内容的元素以及段落式内容)中断的兄弟段落式内容节点,设first为遇到的第一个节点,设last为遇到的最后一个节点。对于每一个由至少一个既不是嵌入式内容也不是元素间空白的上述结果,在源DOM中都存在一个紧接着firstlast的段落。(因此段落可以跨越ainsdelmap元素)

一致性检查器可能会因为段落相互重叠而发出警告(这可能发生于objectvideoaudiocanvas元素,以及间接通过其他命名空间的元素嵌入的HTML,如svgmath)。

一个段落也可以明确的通过p元素形成。

注:如果无法使用除段落式内容以外的任何内容将段落相互分离,则p元素可以用于包裹个别段落(individual paragraphs)。

在下面的例子中,标题将文本分为两段,链接跨越了段落的一半以及第二段的一半。它跨越了段落以及标题。

<aside>
 Welcome!
 <a href="about.html">
  This is home of...
  <h1>The Falcons!</h1>
  The Lockheed Martin multirole jet fighter aircraft!
 </a>
 This page discusses the F-16 Fighting Falcon's innermost secrets.
</aside>

下面是另一种方法,这次明确的表现了段落,并且将链接分为了三个:

<aside>
 <p>Welcome! <a href="about.html">This is home of...</a></p>
 <h1><a href="about.html">The Falcons!</a></h1>
 <p><a href="about.html">The Lockheed Martin multirole jet
 fighter aircraft!</a> This page discusses the F-16 Fighting
 Falcon's innermost secrets.</p>
</aside>

当使用了某些定义了备用内容的元素是,可能会出现段落重叠。举例说明,在下面的代码中:

<section>
 <h1>My Cats</h1>
 You can play with my cat simulator.
 <object data="cats.sim">
  To see the cat simulator, use one of the following links:
  <ul>
   <li><a href="cats.sim">Download simulator file</a>
   <li><a href="http://sims.example.com/watch?v=LYds5xY4INU">Use online simulator</a>
  </ul>
  Alternatively, upgrade to the Mellblom Browser.
 </object>
 I'm quite proud of it.
</section>

存在五个段落:

  1. 包含内容“You can play with my cat simulator. object I'm quite proud of it.”的段落。其中objectobject元素。
  2. 包含内容“To see the cat simulator, use one of the following links:”的段落。
  3. 包含内容“Download simulator file”的段落。
  4. 包含内容“Use online simulator”的段落。
  5. 包含内容“Alternatively, upgrade to the Mellblom Browser.”的元素。

其中第一个段落与其他四个段落重叠。一个支持“cats.sim”资源的用户代理将只展示第一个段落,但是显示备用内容的用户代理将容易混淆地将第二个段落与第一个段落的第一句作为一个段落进行展示,并且将最后一个段落作为第一个段落的第二句的开始进行展示。

为了避免类似的混乱,可以使用p元素。

关于双向文字处理算法的需求

子节点为文本节点的HTML元素中的文本内容,以及元素自由形式(free-form)文本的HTML元素属性中的文本,可以包含U+202A到U+202E范围内的字符(双向算法格式字符)。然而对这些字符的使用受到了限制,以便防止由这些字符产生的嵌入或者覆盖从不同的父元素中开始和结束,并且使所有这些嵌入和覆盖明确的以一个U+202C POP DIRECTIONAL FORMATTING字符。这将有助于降低文字被以对于双向算法有不可预见影响的形式被重用所带来的风险。

上述限制是通过指定文档中的某些部分形成双向算法格式字符范围(bidirectional-algorithm formatting character range)并且在该范围内实施要求来进行定义的。

如果存在一个HTML元素的文本节点的所有数据串联而形成的字符串,则该字符串为双向算法格式字符范围。

一个HTML元素的缺少命名空间(namespace-less)的属性的值是一个双向算法格式字符范围。

任意的前面描述的作为双向算法格式字符范围的字符串必须匹配下列由ABNF产生的字符集为Unicode的字符串。

string        = *( plaintext ( embedding / override ) ) plaintext
embedding     = ( lre / rle ) string pdf
override      = ( lro / rlo ) string pdf
lre           = %x202A ; U+202A LEFT-TO-RIGHT EMBEDDING
rle           = %x202B ; U+202B RIGHT-TO-LEFT EMBEDDING
lro           = %x202D ; U+202D LEFT-TO-RIGHT OVERRIDE
rlo           = %x202E ; U+202E RIGHT-TO-LEFT OVERRIDE
pdf           = %x202C ; U+202C POP DIRECTIONAL FORMATTING
plaintext     = *( %x0000-2029 / %x202F-10FFFF )
                ; any string with no bidirectional-algorithm formatting characters
字符串         = *( 纯文本 ( 嵌入 / 覆盖 ) ) 纯文本
嵌入           = ( 左向右嵌入 / 右向左嵌入 ) 字符串 弹出方向性格式
覆盖           = ( 左向右覆盖 / 右向左覆盖 ) 字符串 弹出方向性格式
左向右嵌入     = %x202A ; U+202A LEFT-TO-RIGHT EMBEDDING
右向左嵌入     = %x202B ; U+202B RIGHT-TO-LEFT EMBEDDING
左向右覆盖     = %x202D ; U+202D LEFT-TO-RIGHT OVERRIDE
右向左覆盖     = %x202E ; U+202E RIGHT-TO-LEFT OVERRIDE
弹出方向性格式 = %x202C ; U+202C POP DIRECTIONAL FORMATTING
纯文本         = *( %x0000-2029 / %x202F-10FFFF )
                 ; 任意不包含双向算法格式字符的字符串
注:为了方便,编码人员可能更喜欢使用dir属性、bdo元素和bdi元素,以避免手动维护双向算法格式字符。

WAI-ARIA(Accessible Rich Internet Applications)无障碍的富因特网应用程序

除非与下列强原生语义发生冲突,编码人员可以按照ARIA规范所描述的要求在HTML元素上使用ARIA角色及aria-*属性。与强原生语义冲突的例外是为了防止编码人员造成辅助技术产品报告不能反映文档当前状态的无意义的状态。

用户代理被要求在所有HTML元素上像ARIA规范所定义的那样实现ARIA语义。下列被定义的隐式ARIA语义必须通过实现来被承认。

下列表格定义了应用于HTML元素的强原生语义及相应的隐式ARIA语义。第一列的每一个单元格内的语言特性(元素或属性)代表的ARIA语义(角色,状态,和/或属性)在同一行内第二列的单元格内给出。当一个元素被应用的多行时,最后一行的角色定义一个必须被应用的角色,所有行的状态和属性都必须被结合。

语言特性 强原生语义及默认隐式ARIA语义
创建了一个超链接的area元素 link(链接)角色
base 无角色
datalise元素 listbox(列表框)角色,且aria-multiselectable(可多选)属性被设为“false”
details元素 如果元素的open属性存在,则aria-expanded(扩展)状态设为“true”,否则为“false”
head元素 无角色
hgroup元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度
hr元素 separator(分隔符)角色
html元素 无角色
alt属性的值为空的img元素 presentation(展示)角色
type属性的值为多选框(Checkbox)状态的input元素 如果元素的indeterminate IDL属性为真,则aria-checked状态被设为“mixed”;如果元素的checkedness为真,则设为“true”;否则设为“false”
type属性的值为取色器(Color)状态的input元素 无角色
type属性的值为日期(Date)状态的input元素 无角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为日期和时间(Data and Time)状态的input元素 无角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为本地日志和时间(Local Data and Time)状态的input元素 无角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为E-mail状态且没有建议源元素的input元素 textbox(文本框)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为文件上传(File Upload)状态的input元素 无角色
type属性的值为隐藏(Hidden)状态的input元素 无角色
type属性的值为月份(Month)状态的input元素 无角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为数字(Number)状态的input元素 spinbutton(转向按钮)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”;aria-valuemax属性被设为元素的maximum;aria-valuemin属性被设为元素的minimum;如果对元素的value执行解析浮点数值的规则的结果为一个数字,aria-valuenow属性被设为该数字
type属性的值为密码(Password)状态的input元素 textbox(文本框)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为单选按钮(Radio Button)状态的input元素 如果元素的checkedness为真,则aria-checked状态被设为“true”;否则设为“false”
type属性的值为范围(Range)状态的input元素 slider(滑块)角色,且aria-valuemax属性被设为元素的maximum;aria-valuemin属性被设为元素的minimum;如果对元素的value执行解析浮点数值的规则的结果为一个数字,aria-valuenow属性被设为该数字,否则设为默认值
type属性的值为重置按钮(Reset Button)状态的input元素 button(按钮)角色
type属性的值为搜索(Search)状态且没有建议源元素的input元素 textbox(文本框)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为提交按钮(Submit Button)状态的input元素 button(按钮)角色
type属性的值为电话号码(Telephone)状态且没有建议源元素的input元素 textbox(文本框)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为文本(Text)状态且没有建议源元素的input元素 textbox(文本框)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为文本、搜索、电话号码、URL或E-mail状态且存在建议源元素的input元素 combobox(组合框)角色,且aria-owns属性被设为与list属性相同的值,如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为时间(Time)状态的input元素 无角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为URL状态且没有建议源元素的input元素 textbox(文本框)角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
type属性的值为星期(Week)状态的input元素 无角色,且如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
必填的input元素 aria-required(必填项)状态被设为“true”
keygen元素 无角色
label元素 无角色
创建了一个超链接的link元素 link(链接)角色
type属性的值为内容菜单(context menu)状态的menu元素 无角色
type属性的值为列表(list)状态的menu元素 menu(菜单)角色
type属性的值为工具栏(toolbar)状态的menu元素 toolbar(工具栏)角色
meta元素 无角色
meter元素 无角色
nav元素 navigation(导航)角色
noscript元素 无角色
optgroup元素 无角色
在选项列表(list of options)之中或代表datalist元素的一个建议的option元素 option(选项)角色,且如果元素的selectedness为真,则aria-selected(已选中)状态被设为“true”,否则被设为“false”
param元素 无角色
progress元素 progressbar(进度条)角色,且如果进度条被确定,则aria-valuemax属性被设为进度条的最大值,aria-valuemin属性被设为零,aria-valuenow属性被设为进度条的当前值
script元素 无角色
拥有multiple属性的select元素 listbox(列表框)角色,且aria-multiselectable(可多选)属性被设为“true”
不存在multiple属性的select元素 listbox(列表框)角色,且aria-multiselectable(可多选)属性被设为“false”
拥有required属性的select元素 aria-required(必填项)属性被设为“true”
source元素 无角色
style元素 无角色
summary元素 无角色
textarea元素 textarea(文本框)角色,且aria-multiline(多行)属性被设为“true”,如果元素拥有readonly属性,则aria-readonly(只读)状态被设为“true”
拥有required属性的textarea元素 aria-required(必填项)属性被设为“true”
title元素 无角色
一个定义了一个类型为“checkbox”的命令的元素,且它是type属性的值为列表(list)状态的menu元素的后裔 menuitemcheckbox(菜单项复选框)角色,且如果命令的Checked State为真,则aria-checked(已勾选)状态被设为“true”,否则被设为“false”
一个定义了一个类型为“command”的命令的元素,且它是type属性的值为列表(list)状态的menu元素的后裔 menuitem(菜单项)角色
一个定义了一个类型为“radio”的命令的元素,且它是type属性的值为列表(list)状态的menu元素的后裔 menuitemradio(菜单项单选按钮)角色,且如果命令的Checked State为真,则aria-checked(已勾选)状态被设为“true”,否则被设为“false”
禁用(disable)的元素 aria-disabled(禁用)状态被设为“true”
拥有hidden属性的元素 aria-hidden(隐藏)状态被设为“true”
一个作为约束验证候选项但不满足其约束条件的元素 aria-invalid(无效)状态被设为“true”

某些HTML元素拥有可以被重写的自然语义。下面的表格中列出了这些元素、它们的默认隐式ARIA语义以及应用于这些元素上的限制。对于在第一列每一个单元格中的语言特性(元素或属性),除非另有重写,其ARIA语义(角色、状态或属性)将在同一行的第二列的单元格中给出。但是这些语义可以在同一行的第三列单元格中所列出的条件下被重写。此外,任意元素可以无视下列限制被设置为presentation(展示)角色。

语言特性 默认隐式ARIA语义 限制
创建了一个超链接的a元素 link(链接)角色 角色必须为link(链接),button(按钮),checkbox(复选框),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
address元素 无角色 如果指定,则角色必须为contentinfo(内容信息)
article元素 article(文章)角色 角色必须为article(文章),document(文档),application(应用)或main之一
aside元素 note(注意)角色 角色必须为note(注意),complementary(补充)或search(搜索)之一
audio元素 无角色 如果指定,则角色必须为application(应用)
button元素 button(按钮)角色 角色必须为button(按钮),link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),radio(单选框)之一
detail元素 group(组)角色 角色必须支持aria-expanded(扩展)
embed元素 无角色 如果指定,则角色必须为application(应用)、document(文档)或img(图片)之一
footer元素 无角色 如果指定,则角色必须为contentinfo(内容信息)
不是hgroup元素后裔的h1元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度 角色必须为link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
不是hgroup元素后裔的h3元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度 角色必须为link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
不是hgroup元素后裔的h3元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度 角色必须为link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
不是hgroup元素后裔的h4元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度 角色必须为link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
不是hgroup元素后裔的h5元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度 角色必须为link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
不是hgroup元素后裔的h6元素 heading(标题)角色,且aria-level(等级)属性被设为元素的大纲深度 角色必须为link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),tab(选项卡)或treeitem(树形结构项)之一
header元素 无角色 如果指定,则角色必须为banner(横幅)
iframe元素 无角色 如果指定,则角色必须为application(应用)、document(文档)或img(图片)之一
没有设置alt属性的值的img元素 img(图片)角色 无限制
alt属性的值被设定且不为空的img元素 img(图片)角色 无限制
type属性的值为按钮(Button)状态的input元素 button(按钮)角色 角色必须为button(按钮),link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),radio(单选按钮)之一
type属性的值为多选框(Checkbox)状态的input元素 checkbox(多选框)角色 角色必须为checkbox(多选框),menuitemcheckbox(菜单项复选框)之一
type属性的值为图片按钮(Image Button)状态的input元素 button(按钮)角色 角色必须为button(按钮),link(链接),menuitem(菜单项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),radio(单选按钮)之一
type属性的值为单选按钮(Radio Button)状态的input元素 radio(单选按钮)角色 角色必须为menuitemradio(菜单项单选框),radio(单选按钮)之一
作为ol元素或ul元素后裔的li元素 listitem(列表项)角色 角色必须为listitem(列表项),menuitemcheckbox(菜单项复选框),menuitemradio(菜单项单选框),option(选项),tab(选项卡)或treeitem(树形结构项)之一
object元素 无角色 如果指定,则角色必须为application(应用)、document(文档)或img(图片)之一
ol元素 list(列表)角色 角色必须为directory(目录),list(列表),listbox(列表框),menu(菜单),menubar(菜单栏),tablist(选项卡列表),toolbar(工具栏),tree(树形结构)之一
output元素 status(状态)角色 无限制
section元素 region(区块)角色 角色必须为alert(提示),alertdialog(提示对话),application(应用),contentinfo(内容信息),dialog(对话),document(文档),log(日志),main,marguee(选取框),region(区块),search(搜索)或status(状态)之一
ul元素 list(列表)角色 角色必须为directory(目录),list(列表),listbox(列表框),menu(菜单),menubar(菜单栏),tablist(选项卡列表),toolbar(工具栏),tree(树形结构)之一
video元素 无角色 如果指定,则角色必须为application(应用)
主体元素 document(文档)角色 角色必须为document(文档)或application(应用)之一

当使用强原生语义时,项目“无角色”表示不能被用于除presentation(展示)以外的其他角色。当使用隐式ARIA语义时,项目“无角色”表示用户代理没有到ARIA角色的默认映射。(然而可能存在其在无障碍层的映射。)

WAI-ARIA规范既不要求也不禁止用户代理强化基于WAI-ARIA标记的原生展示和交互行为。即使主流用户代理可以选择公开元数据或者直接或通过用户安装的扩展来导航特性;例如通过表达或标志导航来公开需求。用户代理被鼓励向用户提供最大化的功能,其中包括没有残疾的用户。

一致性检查器被鼓励提供更丰富的错误信息,以鼓励编码人员使用更恰当的元素而不是删除无障碍注释。举例说明,如果一个a元素被标记为拥有button(按钮)角色,一致性检查器可以提示“使用更恰当的元素表示一个按钮,例如button元素或input元素”而不是“button角色不能被用于a元素”。

这些特性被用于制作辅助工具,以便以更为有用的方式向它们的用户呈现内容。例如ASCII艺术,它实际上是一幅图画,但又似乎是一段文本。它在没有恰当的注释的情况下,可能被屏幕阅读器呈现为一段非常痛苦的大量标点的朗读语音。在该区块中使用特性描述,可以替换为通过ATs跳过ASCII艺术并且只朗读标题:

<figure role="img" aria-labelledby="fish-caption"> 
 <pre>
 o           .'`/
     '      /  (
   O    .-'` ` `'-._      .')
      _/ (o)        '.  .' /
      )       )))     ><  <
      `\  |_\      _.'  '. \
        '-._  _ .-'       '.)
    jgs     `\__\
 </pre>
 <figcaption id="fish-caption">
  Joan G. Stark, "<cite>fish</cite>".
  October 1997. ASCII on electrons. 28×8.
 </figcaption> 
</figure> 

HTML文档中的API

对于HTML文档以及HTML文档内的HTML元素,在DOM核心(DOM Core)中定义的某些API不区分大小写或大小写可变,这些情况在DOM核心中进行定义或者在下面进行总结或要求。

这部分内容不适用于XML文档及不属于HTML命名空间的元素(尽管它们在HTML文档内)。

Element.tagName及Node.nodeName
这些属性必须返回元素名称的ASCII大写形式,不管它们是在何种情况下创建的。

Document.createElement()
HTML标记的规范形式是全部小写;因此,该方法将在创建必要元素之前将参数转换为小写形式。同时,元素必须被创建在HTML命名空间下。
注:该方法不适用于Document.createElementNS()。因此,若向后者方法传递了一个大小写错误的标记名来创建一个元素,当检查它的tagName属性时,可能会出现与本标准中定义的元素相同的标记名,但是它并不支持相应的接口。“真实的”元素名可以从localName属性中获得。

Element.setAttribute()
Element.setAttributeNode()
属性名称是ASCII小写形式

注意:当通过Element.setAttribute()方法向一个HTML元素设置一个属性时,名称参数必须在对元素产生影响前被转化为ASCII小写形式;另外当通过Element.setAttributeNode()方法向一个HTML元素设置一个Attr节点时,该节点的名称必须在对元素产生影响前被转化为ASCII小写形式
注:该部分不适用于Element.setAttributeNS()及Element.setAttributeNodeNS()方法。

Element.getAttribute()
Element.getAttributeNode()
属性名称是ASCII小写形式

注意:当在一个HTML元素上调用Element.getAttribute()方法或Element.getAttributeNode()方法时,名称参数必须在对获取元素的属性前被转化为ASCII小写形式
注:该部分不适用于Element.getAttributeNS()及Element.getAttributeNodeNS()方法。

Document.getElementsByTagName()
Element.getElementsByTagName()
HTML元素的匹配要求在比较之前将参数转换为小写,从其他命名空间而来的元素被视为在XML(大小写敏感)之内。

注意:这些方法(除了它们对应的命名空间方法)必须以区分大小写方式与给出的参数进行比较,但是当对HTML元素进行比较时,参数必须首先被转换为ASCII小写形式
注:因此,在包含多种命名空间的HTML文档内,这些方法同时在区分大小写和不区分大小写的情况下起作用。

与XPath和XSLT交互

动态注入标记

注:动态插入标记到文档中的API需要与分析器交互,因此它们的行为取决于它们被应用于HTML文档(使用HTML分析器)或者XML文档(使用XML分析器)中的XHTML

打开输入流

open()方法拥有几个带有不同数量参数的形式。

此区块中不是标准描述,实现要求在下面给出。document = document . open( [ type [, replace ] ] )

Document将被立即更换,就像一个新的Document对象,但是重用了之前的对象,之后返回该对象。

如果type参数被忽略或者其值为“text/html”,则返回的Document与HTML分析器相关,以便用其解析使用document.write()出入的数据。否则,所有传入document.write()的内容都将被解析为纯文本。

如果replace参数存在且值为“replace”,则Document对象会话历史记录中的现有条目将被删除。

该方法对仍然在解析中的Document不起作用。

如果Document是一个XML文档,则抛出一个INVALID_STATE_ERR异常。

window = document . open( url, name, features [, replace ] )

其作用与window.open()方法相同。

当使用两个及更少参数调用该方法时,该方法必须执行下列操作:

  1. 如果Document对象没有被标记为HTML文档,则抛出一个INVALID_STATE_ERR异常并且在此停止。
  2. 如果第一个参数的值存在,则设type为该值,否则设为“text/html”。
  3. 如果第二个参数存在且其值ASCII不区分大小写的匹配“replace”,则设replace为真,否则设为假。
  4. 如果文档有一个不是脚本所创建的分析器作为其活动分析器,并且与分析器的输入流相关的插入点不是未定义(undefined)状态(即,其为输入流中某处的一点),则该方法不起作用。跳过之后的步骤,并且返回调用本方法的Document对象。
    注:当document.open()被在解析通过网络传来的数据时所发现的行内脚本程序调用时,它将被忽略。但是当调用异步操作或在一个文档中通过该API填鸭式调用其自身时,仍然需要正常发挥作用。
  5. 执行储存互斥
  6. 提示卸载Document对象。如果用户拒绝允许该文档被卸载,则在这步必须被终止。
  7. 卸载Document对象,并且设recycle属性为真。
  8. 放弃Document对象。
  9. 注销所有该注册在该Document节点及其后裔上的事件侦听器。
  10. 删除任意任务源中与该Document相关的任意任务
  11. 在不触发音译变化事件的情况下删除文档的所有子节点。
  12. 用该对象的新实例替换Document的独立对象。(包括WindowLocationHistoryApplicationCacheNavigator对象、各种BarProp对象、两个Storage对象、各种HTMLCollection对象以及诸如Selection等的定义在其他规范中的对象。还包括所有Document对象的原型在内的所有JavaScript绑定的Web IDL原型。)
  13. 修改文档的字符编码为UTF-8。
  14. 设置Document对象的重载覆盖标志,并且设置Document重载覆盖缓冲器为空字符串。
  15. 修改文档的地址条目脚本文档地址
  16. 创建一个新的HTML分析器,并且将其与文档关联。这是一个由脚本创建的分析器(表示其可以被document.open()document.close()方法关闭,并且其标记生成器将在发出一个文件结束(end-of-file)标记前等待一个明确的document.close()调用。)。编码信赖irrelevant
  17. 设置文档的当前文档准备状态为“loading(载入中)”。
  18. 如果type字符串包含一个U+003B分号字符(;),则删除第一个分号字符到字符串结尾之间的所有字符。
    删除type中所有的前导或后缀的空白字符。
    如果type当前不能ASCII不区分大小写的匹配字符串“text/html”,则操作与标记生成器在一个单独的U+000A换行字符后放置一个标记名为“pre”的开始标记相同,之后切换HTML分析器的标记生成器到纯文本状态
  19. 删除浏览器上下文会话历史记录中所有当前条目之后的所有条目。如果当前条目是会话历史记录中的最后一条,则不删除条目。
    注:该操作可能不会影响用户代理的用户界面。
  20. 通过历史记录遍历任务来源删除任意任务队列。
  21. 删除分享相同Document的任意早期条目。
  22. 如果replace为假,则在最后一个条目之前添加一个新条目,并将其与Document对象相关的上一个解析器所解析的文本及开始这些步骤时文档的状态相关联。这将允许用户通过在会话历史记录中向后跳转,以查看调用document.open()之前的页面。新条目不拥有Document对象,所以如果会话历史记录跨越了该条目,则需要创建一个新的Document对象。
  23. 最后,设置插入点输入流结束之前的最后一点(在该点输入流将为空)。
  24. 返回调用本方法的Document

若使用三个或更多参数调用本方法,则HTMLDocument对象上的open()方法必须使用相同的参数调用HTMLDocument对象的Window对象上的open()方法,并且返回后者的返回值。如果HTMLDocument对象不包含Window对象,则必须抛出一个INVALID_ACCESS_ERR异常。

关闭输入流

此区块中不是标准描述,实现要求在下面给出。document . close()

关闭由document.open()方法创建的输入流。

如果Document是一个XML文档,则抛出一个INVALID_STATE_ERR异常。

close()方便必须执行下列步骤:

  1. 如果Document对象没有被标记为一个HTML文档,则抛出一个INVALID_STATE_ERR异常并跳过这些步骤。
  2. 如果不存在与文档相关的脚本所创建的分析器,则跳过这些步骤。
  3. 在分析器输入流的最后插入一个明确的“EOF”字符
  4. 如果存在一个挂起的阻塞解析的脚本,则跳过这些步骤。
  5. 执行标记生成器,按照标记的放置情况处理结果标记,并在标记生成器遇到明确的“EOF”字符自身事件循环时结束。

document.write()

此区块中不是标准描述,实现要求在下面给出。document . write(text...)

一般情况下,向Document的输入流添加给出的字符串(可能为多个)。

注:该方法的行为非常特殊。在某些情况下,该方法能够影响正在进行解析的HTML分析器的状态,导致DOM与文档的源不相符。在其他情况下,调用该方法会首先像调用了document.open()方法那样清除当前页。在更多的情况下,该方法被简单的忽略或者抛出一个异常。更加糟糕的是,该方法确切的行为会在某些情况下取决于网络延迟,这将导致难以调试的失败。综合这些原因,使用该方法是非常使人泄气的。
若在XML文档上调用该方法,则抛出一个INVALID_STATE_ERR异常。

Document对象拥有一个忽略破坏性写入计数器,该计数器与对script元素的处理一起被用于防止外部脚本能够通过使用document.write()造成隐式调用document.open()来破坏文档。在开始时,该计数器必须被设为零。

document.write(...)方法必须执行下列操作:

  1. 如果方法是在XML文档上调用的,则抛出一个INVALID_STATE_ERR异常并停止操作。
  2. 如果插入点是未定义,并且Document忽略破坏性写入计数器大于零,则停止操作。
  3. 如果插入点是未定义,则在document对象上调用open()方法(没有参数)。如果用户拒绝允许文档被卸载,则停止操作。否则插入点将被设为紧接着(空)输入流结束之前。
  4. 插入点之前的输入流插入由所有参数串联组成的字符串。
  5. 如果Document对象设置了重载覆盖标记,则向Document重载覆盖缓冲区追加由所有参数串联组成的字符串。
  6. 如果不存在挂起的阻塞解析的脚本,让标记生成器处理插入的字符,逐个地像它们被放置一样处理生成的标记,并且在标记生成器遇到插入点或者标记生成器的处理被树形结构段(tree construction stage)终止(可能发生在一个script结束标记被标记生成器处理时)时停止。
    注:如果document.write()方法被内联执行(例如,因为解析器处理了一组script标记而被执行)的脚本调用,则其为一个解析器的折返调用(reentrant invocation)
  7. 最后,从方法返回。

document.writeln()

此区块中不是标准描述,实现要求在下面给出。document . writeln(text...)

Document的输入流添加给出的字符串(可能为多个),并且跟随一个新行字符。如果需要,将首先隐式的调用open()方法。

若在XML文档上调用该方法,则抛出一个INVALID_STATE_ERR异常。

对于document.writeln(...)方法,当调用时,必须像使用相同参数追加了一个额外的由单独的换行字符(U+000A)组成的字符串作为参数调用document.write()方法那样执行。

innerHTML

此区块中不是标准描述,实现要求在下面给出。document . innerHTML [ = value ]

返回一个表现Document的HTML或XML片段。

可以被设置,以便将Document的内容替换为给出的字符串经过解析后的结果。

若对XML文档进行操作:如果Document不能序列化为XML,则抛出一个INVALID_STATE_ERR异常;如果给出的字符串不符合语法规则,则抛出一个SYNTAX_ERR异常。

element . innerHTML [ = value ]

返回一个表现元素内容的HTML或XML片段。

可以被设置,以便将元素的内容替换为给出的字符串经过解析后的节点。

若对XML文档进行操作:如果元素不能序列化为XML,则抛出一个INVALID_STATE_ERR异常;如果给出的字符串不符合语法规则,则抛出一个SYNTAX_ERR异常。


当获得该属性的值时,如果节点所在的文档是一个HTML文档,则该属性必须返回在该节点上执行HTML片段序列化算法的结果;否则,节点所在的文档是一个XML文档,则该属性必须返回在该节点上执行XML片段序列化算法的结果(这有可能抛出一个异常,而不是返回一个字符串)。

当设置该属性的值时,必须执行下列步骤:

  1. 如果节点所在的文档是一个HTML文档:调用HTML片段序列化算法
    如果节点所在的文档是一个XML文档:调用XML片段序列化算法
    在其他情况下,本算法必须被一个字符串调用,该字符串被分配给innerHTML属性作为input。如果该节点是一个Element节点,则除此之外,该元素也必须被分配给innerHTML属性作为context(上下文元素。
    如果抛出一个异常,则停止算法。
    否则,设new children为返回的节点。
  2. 如果在一个Document节点上设置该属性,且文档拥有一个激活的分析器,则终止算法。
  3. 将设置了innerHTML属性的节点的所有子节点删除,触发恰当的变化事件。
  4. 如果在一个Document节点上设置该属性,设target document为该Document节点。否则,如果在一个Element节点上设置该属性,设target document为该ElementownerDocument(所属的文档)。
  5. 设置new children中所有节点的ownerDocumenttarget document
  6. 向设置了innerHTML属性的节点中追加所有的new children节点,保持它们的顺序,并且触发变化事件,就像插入了一个包含new childrenDocumentFragment(文档片段)。

outerHTML

此区块中不是标准描述,实现要求在下面给出。element . outerHTML [ = value ]

返回一个表现元素及其内容的HTML或XML片段。

可以被设置,以便将元素替换为给出的字符串经过解析后的节点。

若对XML文档进行操作:如果元素不能序列化为XML,则抛出一个INVALID_STATE_ERR异常;如果给出的字符串不符合语法规则,则抛出一个SYNTAX_ERR异常。

如果元素的父节点为Document节点,则抛出一个NO_MODIFICATION_ALLOWED_ERR异常。

当获得该属性的值时,如果节点所在的文档是一个HTML文档,则该属性必须返回在以该节点为子节点的虚拟节点上执行HTML片段序列化算法的结果;否则,节点所在的文档是一个XML文档,则该属性必须返回在虚拟节点上执行XML片段序列化算法的结果(这有可能抛出一个异常,而不是返回一个字符串)。

当设置该属性的值时,必须执行下列步骤:

  1. target为设置了outerHTML属性的元素。
  2. 如果target没有父节点,则终止算法。因为即使执行了后续步骤,也不可能获得所创建的节点的引用。
  3. 如果target的父节点是一个Document对象,则抛出一个NO_MODIFICATION_ALLOWED_ERR异常并终止算法。
  4. 如果target的父节点不是一个DocumentFragment节点,则设parent为该节点,否则设parent为一个任意的body元素。
  5. 如果target所在的稳定是一个HTML文档:调用HTML片段序列化算法
    如果target所在的稳定是一个XML文档:调用XML片段序列化算法
    在其他情况下,本算法必须被一个字符串调用,该字符串被分配给outerHTML属性作为input,且parentcontext元素。
    如果抛出一个异常,则停止算法。
    否则,设new children为返回的节点。
  6. 设置new children中所有节点的ownerDocumenttarget的文档。
  7. target从它的父节点删除,触发适当的变更事件,之后,在该处插入所有的new children节点,保持它们的顺序,并且再次触发变更事件,就像插入了一个包含new childrenDocumentFragment

insertAdjacentHTML()

HTML元素

根元素

html元素

分类:
使用场景:
做为文档的根元素
在复合文档中允许子文档的位置
内容模型:
一个head元素后跟一个body元素
允许的属性:
全局属性
manifest
DOM接口:
interface HTMLHtmlElement : HTMLElement {};

html元素表示一个HTML文档的根节点。

如果存在的话,manifest属性给出文档的应用程序缓存清单的地址。如果这个属性存在,这个属性的值必需是一个合法的非空URL,URL的首尾允许添加额外的空格。 manifest属性只有在文档先期加载时会产生效果。动态改变这个属性不会生效(所以也没有DOM API为这个属性提供出来)。

注:按程序缓存选择的提案, 后出现的base元素不会影响相对路径URL在清单属性中的解析,因为属性在这些元素被识别之前就已经被处理过了。
注:window.applicationCache这个IDL属性提供了脚本访问离线应用程序的缓存机制的能力。
下面例子中的HTML元素,声明了文档的语言是英语。
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>Swapping Songs</title>
    </head>
    <body>
    <h1>Swapping Songs</h1>
    <p>Tonight I swapped some of the songs I wrote with some friends, who
    gave me some of the songs they wrote. I love sharing my music.</p>
    </body>
    </html>
    

文档元数据

head元素

分类:
使用场景:
做为html元素中的第一个元素
内容模型:
如果文档是一个iframe的源文档或者标题信息已经由更高层的协议提供,则为0个或者多个元数据式内容
否则是为一个或者多个元数据式内容,其中恰好有一个为title元素
允许的属性:
全局属性
DOM接口:
interface HTMLHeadElement : HTMLElement {};

head元素表示一个文档元数据的集合。

在head元素中的元数据集合可大可小,下面是一个非常短的示例:

<!doctype html>
<html>
 <head>
  <title>A document with a short head</title>
 </head>
 <body>
 ...

这里有个长一点的例子:

<!DOCTYPE HTML>
<HTML>
 <HEAD>
  <META CHARSET="UTF-8">
  <BASE HREF="http://www.example.com/">
  <TITLE>An application with a long head</TITLE>
  <LINK REL="STYLESHEET" HREF="default.css">
  <LINK REL="STYLESHEET ALTERNATE" HREF="big.css" TITLE="Big Text">
  <SCRIPT SRC="support.js"></SCRIPT>
  <META NAME="APPLICATION-NAME" CONTENT="Long headed application">
 </HEAD>
 <BODY>
 ...
注:title元素在绝大多数情况下是必要的子节点,但是当更高层的协议提供了标题信息,如当HTML用作email的书写格式时在e-mail的标题行中,title元素可以被省略。

title元素

分类:
元数据式内容
使用场景:
在一个不包含其它title的head元素
内容模型:
文本
允许的属性:
全局属性
DOM接口:
interface HTMLTitleElement : HTMLElement {
    attribute DOMString text;
}

title元素表示文档的标题或者名称。编写者应该使用即使不在上下文中也能标识他们文档的标题,例如在用户的历史或者标签,抑或是在搜索结果当中。文档的title经常会与它的第一个heading不同,因第一个heading没有被拿出上下文之后的独立性要求。

每个文档中至多有一个title元素。

此区块中不是标准描述,实现要求在下面给出。title . text [ = value ]

返回元素的内容, 忽略非文本节点的子节点。

可以被赋值, 以指定的值替换元素的子元素。

IDL属性 text 必须返回一个由所有title元素的直接子文本节点按DOM树顺序连接而成的字符串(忽略所有其它节点如注释或者元素)。在被赋值时,它应该采取与IDL属性textContent相同的行为。

这里有一些恰当使用标题的例子,和一些可能被用在同一个页面上的顶层heading用来对比。
<title>Introduction to The Mating Rituals of Bees</title>
    ...
    <h1>Introduction</h1>
    <p>This companion guide to the highly successful
    <cite>Introduction to Medieval Bee-Keeping</cite> book is...

下一页可能是同一个网站的另一部分,注意标题如何把主要事项清楚地描述出来,而第一个heading默认读者已经知道上下文,所以并不会困惑舞是Salsa还是Waltz。

<title>Dances used during bee mating rituals</title>
    ...
    <h1>The Dances</h1>

用来当作文档的标题的字符串由IDL属性document.title提供。

用户代理在将文档展现到它们的UI时,应该使用文档的标题。当一个title元素以这种方式被使用时,title元素的方向性应该用于设置用户界面上文档标题的方向性。

base元素

分类:
元数据式内容
使用场景:
在一个不包含其它base的head元素
内容模型:
允许的属性:
全局属性
href
target
DOM接口:
interface HTMLBaseElement : HTMLElement {
    attribute DOMString href;
    attribute DOMString target;
};

base元素允许编写者指定文档基址URL用于计算相对地址URL, 以及默认的浏览上下文的名字用于接下来的超链接。这个元素不表示此信息之外的任何内容。

每个文档中最多只能出现一个base元素

一个base元素要至少要有href属性和target属性两者其一,或者全都有也可。

如果href属性被设定了的话,则它必须包含一个合法的URL,前后允许有多余的空格。

一个base元素,如果有href属性的话,则必需出现在DOM树中其它任何有URL型属性的元素之前,html元素除外(它的manifest属性不受base元素影响)。

注:如果有多个具有href属性的base元素,除第一个外的会被忽略。

如果target属性被设定了的话,则它必须包含一个合法的浏览上下文名称或者关键字,这个名称或者关键字指明了当文档中的超链接和表单造成页面跳转时,哪一浏览上下文应该被用作默认。

一个base元素,如果有target属性的话,则必须出现在DOM树中任何表示超链接的元素之前。

注:如果有多个具有target属性的base元素,除第一个外的会被忽略。

IDL属性href,在get时应该返回文档基址URL,在set时则将href属性写入新的值。

target属性则完全反射同名属性。

在这个示例中,base元素被用来设置文档基址URL
<!DOCTYPE html>
<html>
    <head>
        <title>This is an example for the <base> element</title>
        <base href="http://www.example.com/news/index.html">
    </head>
    <body>
        <p>Visit the <a href="archives.html">archives</a>.</p>
    </body>
</html>
上面例子中的超链接将会链接到"http://www.example.com/news/archives.html"。

link元素

分类:
元数据式内容
使用场景:
期望出现元数据式内容处。
在做为head元素孩子的noscript元素内。
内容模型:
允许的属性:
全局属性
href
rel
media
hreflang
type
sizes
此外,title属性在此元素上具有特别语义。
DOM接口:
interface HTMLLinkElement : HTMLElement {
    attribute boolean disabled;
    attribute DOMString href;
    attribute DOMString rel;
    readonly attribute DOMTokenList relList;
    attribute DOMString media;
    attribute DOMString hreflang;
    attribute DOMString type;
    [PutForwards=value] readonly attribute DOMSettableTokenList sizes;
};
HTMLLinkElement implements LinkStyle;

link元素允许使用者将他们的文档链接到其它资源。

link的目标由href属性指定,它的值必须表示并且包含一个有效非空的URL(允许前后有空格)。如果没有href属性,那么这个元素则没有定义一个链接。

link元素必须有rel属性。

link表示的类型由rel属性的值给出,这个值如果存在的话,则应该由一组空格分开的token组成。后文将会描述允许的关键字以及它们的意义。如果rel属性不存在、没有关键字或者没有任何一个关键字根据此文档是被允许的,那么元素不会创建任何链接。

使用link元素,可以创建两个类型的链接:到外部资源的链接超链接链接类型一节定义了一个指定的链接究竟是一个外部资源还是超链接。一个链接元素可以创建多个链接(其中可能某些是外部资源,某些是超链接)。具体创建多少个、哪一种链接取决于rek属性给出的关键字。用户代理必须逐个链接来处理,不能逐个元素处理。

注:每个为链接link元素创建的链接应该被互不相关地处理。例如,如果有两个link元素有rel="stylesheet",他们每个都被计算成一个独立地外部资源,他们每一个都互不依赖地影响自己的属性。类似地,假如一个单独地link元素有一个rel属性,它的值为next stylesheet,它将会同时创建一个超链接和一个到外部资源的链接(因有stylesheet关键字),并且他们受其他属性影响(如media或者title)而不同。

具体的到外部资源的链接的行为取决于具体的关系,由相关链接类型来定义。一些属性控制外部资源发生作用与否(如下文定义)。

对于那些能够在DOM中表示的外部资源(比如,样式表),即使资源没有发生作用,DOM表示也应该生效。

用户代理应该采用以下步骤获取一个资源:

  1. 如果href属性的值是空字符串,取消这些步骤
  2. 解析href属性给出的URL相对路径
  3. 如果前面步骤失败,中断这些步骤
  4. 获取结果的绝对URL地址

用户代理可以选择当需要时尝试去获取这些资源,而不是在它们发生作用前主动获取所有的外部资源。

获取资源是应当遵循所使用的协议(如 HTTP)的语义。(例如重定向应该生效,404响应结果应该导致外部资源无法生效)

在尝试获取资源及其关键子资源完成时,如果加载成功,用户代理应该将以下任务排入隊列:在link元素上触发一个名为load的简单事件,如果资源或者它的一个关键子资源因为任何原因没能完全加载(如DNS错误,HTTP 404响应,链接过早断开,不支持的Content-Type),将以下任务排入隊列:在link元素上触发一个名为error的简单事件,处理资源及子资源时的非网络的错误(如CSS解析错误、PNG解码错误)不在本段描述的错误之列。

这些任务的task source是DOM manipulation task source

元素必须延迟元素的document的load事件至所有获取资源及其关键子资源的尝试完成。(用户代理没有尝试获取的资源,如等待需要时加载的资源,不会延迟load事件。)

交互式的用户代理可能在他们的界面上提供给用户一些触发由link元素创建的超链接的方法。本标准没有确切地规定用户界面,但是可以以某种形式(可能是比较简单的),对于每个由link元素创建的超链接给出以下信息(由元素属性获得):

  • 文档和资源之间的关系(由rel属性给出)
  • 资源的标题(由title属性给出)
  • 资源的地址(由href属性给出)
  • 资源的语言(由hreflang属性给出)
  • 资源的适合媒体(由media属性给出)

用户代理也可以包含其它信息,比如资源的类型(由type属性给出)。

注:link元素创建的超链接以及它的rel属性作用于整个页面。这与a元素和area元素的rel属性不同,a元素和area元素的rel属性表示的链接类型的上下文由链接在文档中的位置给出。

media属性说明了资源作用于何种媒体,它的值必须是合法的媒体查询

如果链接是超链接,那么media属性纯是建议,描述了问题中的文档为何种媒体设计。

然而,如果链接是外部资源链接的话,media属性就是规定,用户代理仅当media属性匹配环境并且其它相关条件满足时才会使资源生效,其它情况下不会生效。

注:外部资源可能有更多适用性限制,例如,CSS样式表可能有些@media块。本规范不应该覆盖这样的限制或者需求。

如果media属性被省略,则默认为"all",意即链接默认作用于所有媒体类型。

link元素的hreflang属性跟a与area元素的link元素有语义完全相同。

对于外部资源链接,type属性用于提示用户代理,以使它们避免获取不支持的资源。如果这个属性被设置,那么用户代理必须确认资源就是给出的类型(即使它不是一个合法的MIME类型,如空字符串)。如果属性被省略,但是外部资源链接类型有定义默认类型,用户代理也必须确认资源就是这个的类型。如果用户代理不支持指定链接关系的指定MIME类型,则用户代理不应该获取这个资源。如果用户代理支持指定链接关系的指定MIME类型,则用户代理应该按照外部资源链接的特定类型所指定,在适当的时候获取资源。如果属性被忽略并且外部资源链接类型没有默认类型,但如果资源的类型是已知的并且支持的,用户代理还是应该当作它能够被支持并获取资源。

如果外部资源链接类型定义了处理资源的内容类型元数据的规则,这些规则应生效。否则,假如资源预计是图片,用户代理可以使用图片探测规则,with the official type being the type determined from the resource's Content-Type metadata,并且把探测资源得出的结果当作它时实际类型。否则,如果所有条件都不生效或者如果用户代理选择不去使用图片探测规则,那么用户代理必须使用内容类型元数据去检查资源的类型,如果没有类型元信息,但是外部资源链接类型有定义默认类型,那么用户代理需要确认资源就是这个类型。

注:stylesheet链接类型定义了处理资源的内容类型元数据的规则。

用户代理一经确认资源的类型,如果它是支持的类型并且其它有关条件满足,用户代理必须使资源生效,其它情况则应忽略资源。

如果一个文档包含如下样式表链接:
<link rel="stylesheet" href="A" type="text/plain">
<link rel="stylesheet" href="B" type="text/css">
<link rel="stylesheet" href="C">

...那么一个符合规范的用户代理假如只支持CSS样式表将会获取B和C文件,并且屏蔽A文件(因为text/plain不是CSS样式表的MIME类型。)

对文件B和C而言,它之后将会检查服务端返回的实际类型。对于那些发送text/css的,将会使style生效,但对于标记为text/plain或者其它类型的,则不会。

如果两个文件之一返回时没有带内容类型元数据,或者带有一个语法错误的类型如Content-Type: "null",那么stylesheet链接的的默认类型将会被替换进来。因默认类型是text/css,样式表将会仍旧生效。

title属性给出了链接的标题。只有一个例外,它纯是建议。它的值为text。例外就是对于样式表链接,这里的title属性定义了可选得样式表集合。

注:link元素上的title属性与大部分元素的全局属性title不同,在前者中一个没有title的链接不会继承父元素的链接:它是没有title的。

sizes属性与icon这一link类型一起使用。这个属性不能被rel中没有指定icon关键字的link元素使用。

HTTP link:如果支持的话,header必须被认为出现在任何链接之前,这样的话他们就由HTTP实体header给出。(在这些header中的URL将会被根据相关文档的规则被处理和解析,本文档不包含这些规则。[HTTP] [WEBLINK]

IDL属性href, rel, media, hreflang, 以及type, 以及sizes,每一个都将反射各自同名的内容属性。

IDL属性relList应反射rel内容属性。

IDL属性disabled只做用于样式表链接。当link元素定义了一个样式表链接时,disabled属性跟为可选择样式表DOM定义的表现相同。对所有其它的link元素它总是返回false,并且设置时不做任何事情。

LinkStyle接口也被这个元素实现了,样式处理模型定义了方式。[CSSOM]

这里有一组提供一些样式表的link元素
<!-- a persistent style sheet -->
<link rel="stylesheet" href="default.css">

<!-- the preferred alternate style sheet -->
<link rel="stylesheet" href="green.css" title="Green styles">

<!-- some alternate style sheets -->
<link rel="alternate stylesheet" href="contrast.css" title="High contrast">
<link rel="alternate stylesheet" href="big.css" title="Big fonts">
<link rel="alternate stylesheet" href="wide.css" title="Wide screen">
下面例子展示了你可以如何指定用可选格式为其它目标语言设计及为其它媒体设计的页面版本:
<link rel=alternate href="/en/html" hreflang=en type=text/html title="English HTML">
<link rel=alternate href="/fr/html" hreflang=fr type=text/html title="French HTML">
<link rel=alternate href="/en/html/print" hreflang=en type=text/html media=print title="English HTML (for printing)">
<link rel=alternate href="/fr/html/print" hreflang=fr type=text/html media=print title="French HTML (for printing)">
<link rel=alternate href="/en/pdf" hreflang=en type=application/pdf title="English PDF">
<link rel=alternate href="/fr/pdf" hreflang=fr type=application/pdf title="French PDF">

meta元素

分类:
元数据式内容
使用场景:
如果有charset属性出现,或者如果元素的http-equiv属性在编码声明状态:在一个head元素里。
如果元素具有http-equiv属性并且不在在编码声明状态:在一个head元素里。
如果元素具有http-equiv属性并且不在在编码声明状态:在一个做为head元素子节点的noscript元素里。
如果name属性出现:任何期望出现元数据式内容的位置
内容模型:
允许的属性:
全局属性
name
http-equiv
content
charset
DOM接口:
interface HTMLMetaElement : HTMLElement {
    attribute DOMString name;
    attribute DOMString httpEquiv;
    attribute DOMString content;
};

style元素

分类:
元数据式内容
如果具有scoped属性: 流式内容
使用场景:
如果元素不具有scoped属性:在一个head元素里。
如果元素不具有scoped属性:在一个做为head元素子节点的noscript元素里。
如果元素具有scoped属性:在期望流式内容处,但必须出现在所有除style元素或者元素内空格以外的流式内容之前。
内容模型:
允许的属性:
全局属性
media
scoped
type
此外,title属性在此元素上有特殊语意
DOM接口:
interface HTMLStyleElement : HTMLElement {
    attribute boolean disabled;
    attribute DOMString media;
    attribute DOMString type;
    attribute boolean scoped;
};
HTMLStyleElement implements LinkStyle;

样式

脚本

script元素

分类:
元数据式内容
流式内容
段落式内容
使用场景:
在期望元数据式内容处。
在期望段落式内容处。
内容模型:
如果没有src属性,取决于type属性,但必须符合脚本内容限制
如果有src属性,元素必须为空或者只包含脚本文档,同样必须符合脚本内容限制
允许的属性:
全局属性
src
async
defer
type
charset
DOM接口:
interface HTMLScriptElement : HTMLElement {
    attribute DOMString src;
    attribute boolean async;
    attribute boolean defer;
    attribute DOMString type;
    attribute DOMString charset;
    attribute DOMString text;
};


脚本语言
script元素内容的限制
外部脚本的内联文档
script元素和XSLT的交互

noscript元素

分类:
元数据式内容
流式内容
段落式内容
使用场景:
在一个HTML文档的head元素中,祖先不能有noscript元素。
在一个HTML文档中期望出现段落式内容处,祖先不能有noscript元素。
内容模型:
在脚本被禁用状态下,在head元素中:以任意顺序出现零个或多个的link元素,零个或多个的style元素,零个或多个的meta元素。
在脚本被禁用状态下,不在head元素中:noscript元素对子元素是透明的,但不准有noscript元素。
其它情况:如下文描述的文本。
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

区块

body元素

分类:
区块根
使用场景:
做为html元素内的第二个元素。
内容模型:
流式内容
允许的属性:
全局属性
onafterprint
onbeforeprint
onbeforeunload
onblur
onerror
onfocus
onhashchange
onload
onmessage
onoffline
ononline
onpagehide
onpageshow
onpopstate
onredo
onresize
onscroll
onstorage
onundo
onunload
DOM接口:
interface HTMLBodyElement : HTMLElement {
    attribute Function onafterprint;
    attribute Function onbeforeprint;
    attribute Function onbeforeunload;
    attribute Function onblur;
    attribute Function onerror;
    attribute Function onfocus;
    attribute Function onhashchange;
    attribute Function onload;
    attribute Function onmessage;
    attribute Function onoffline;
    attribute Function ononline;
    attribute Function onpopstate;
    attribute Function onpagehide;
    attribute Function onpageshow;
    attribute Function onredo;
    attribute Function onresize;
    attribute Function onscroll;
    attribute Function onstorage;
    attribute Function onundo;
    attribute Function onunload;
};

section元素

分类:
流式内容
章节式内容
formatBlock候选
使用场景:
在期望流式内容处。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement

nav元素

分类:
流式内容
章节式内容
formatBlock候选。
使用场景:
需要流式内容处。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

article元素

分类:
流式内容
章节式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

aside元素

分类:
流式内容
章节式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

h1,h2,h3,h4,h5和h6元素

分类:
流式内容
标题式内容
formatBlock候选
使用场景:
做为hgroup元素的子元素。
需要流式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
interface HTMLHeadingElement : HTMLElement {};

hgroup元素

分类:
流式内容
标题式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
一个或多个h1,h2,h3,h4,h5和/或h6元素
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

header元素

分类:
流式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容, 但不能有header元素footer元素出现。
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

footer元素

分类:
流式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容, 但不能有header元素footer元素出现。
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

address元素

分类:
流式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容, 不能有标题式内容出现, 不能有章节式内容出现, 不能有header元素, footer元素或者address元素出现。
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

头和区块

内容分组

p元素

分类:
流式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
interface HTMLParagraphElement : HTMLElement {};

hr元素

分类:
流式内容
使用场景:
需要流式内容处。
内容模型:
空。
允许的属性:
全局属性
DOM接口:
interface HTMLHRElement : HTMLElement {};

pre元素

分类:
流式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
interface HTMLPreElement : HTMLElement {};

blockquote元素

分类:
流式内容
Sectioning root。
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容
允许的属性:
全局属性
cite
DOM接口:
interface HTMLQuoteElement : HTMLElement {
    attribute DOMString cite;
};
注:HTMLQuoteElement接口同时也被q元素使用

ol元素

分类:
流式内容
使用场景:
需要流式内容处。
内容模型:
零个或多个li元素
允许的属性:
全局属性
reversed
start
type
DOM接口:
interface HTMLOListElement : HTMLElement {
    attribute boolean reversed;
    attribute long start;
    attribute DOMString type;
};

ul元素

分类:
流式内容
使用场景:
需要流式内容处。
内容模型:
零个或多个li元素
允许的属性:
全局属性
DOM接口:
interface HTMLUListElement : HTMLElement {};

li元素

分类:
无。
使用场景:
ol元素中。
ul元素中。
menu元素中。
内容模型:
流式内容
允许的属性:
全局属性
如果元素是ol元素的子节点: value
DOM接口:
interface HTMLLIElement : HTMLElement {
    attribute long value;
};

dl元素

分类:
流式内容
使用场景:
需要流式内容处。
内容模型:
零或者多组由一个或多个dt元素后跟零个或多个dd元素组成的元素组。
允许的属性:
全局属性
DOM接口:
interface HTMLDListElement : HTMLElement {};

dt元素

分类:
无。
使用场景:
dl元素中,dd元素dt元素之前。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

dd元素

分类:
无。
使用场景:
dl元素中,dt元素dd元素之后。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

figure元素

分类:
流式内容
Sectioning root。
使用场景:
需要流式内容处。
内容模型:
可能是: 一个figcaption元素后跟流式内容
或者: 流式内容后跟一个figcaption元素
或者: 流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

figcaption元素

分类:
无。
使用场景:
做为figure元素的第一个或者最后一个子节点。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

div元素

分类:
流式内容
formatBlock候选
使用场景:
需要流式内容处。
内容模型:
流式内容
允许的属性:
全局属性
DOM接口:
interface HTMLDivElement : HTMLElement {};

文本级语意

a元素

分类:
流式内容
当元素只包含段落式内容: 段落式内容
交互式内容
使用场景:
当元素只包含段落式内容: 期望出现段落式内容处。
其它情况: 期望出现流式内容处。
内容模型:
透明内容模型,但不能有交互式内容出现。
允许的属性:
全局属性
href
target
rel
media
hreflang
type
DOM接口:
interface HTMLAnchorElement : HTMLElement {
    stringifier attribute DOMString href;
    attribute DOMString target;
    attribute DOMString rel;
    readonly attribute DOMTokenList relList;
    attribute DOMString media;
    attribute DOMString hreflang;
    attribute DOMString type;

    attribute DOMString text;

    // URL decomposition IDL attributes
    attribute DOMString protocol;
    attribute DOMString host;
    attribute DOMString hostname;
    attribute DOMString port;
    attribute DOMString pathname;
    attribute DOMString search;
    attribute DOMString hash;
};

em元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

strong元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

small元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

s元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

cite元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

q元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
cite
DOM接口:
使用HTMLQuoteElement。

dfn元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容, 但不能有dfn元素出现。
允许的属性:
全局属性
此外, 此元素的title属性有特别语义。
DOM接口:
使用HTMLElement。

abbr元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
此外,此元素的title属性有特别语义。
DOM接口:
使用HTMLElement。

time元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容, 但不能有time元素出现。
允许的属性:
全局属性
datetime
pubdate
DOM接口:
interface HTMLTimeElement : HTMLElement {
    attribute DOMString dateTime;
    attribute boolean pubDate;
    readonly attribute Date valueAsDate;
};

code元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

var元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

samp元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

kbd元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

sub和sup元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

i元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

b元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

u元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

mark元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

ruby元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
一或者多组以下元素: 段落式内容后跟一个rt元素或者一个rp元素, 一个rt元素, 以及另一个rp元素
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

rt元素

分类:
无。
使用场景:
做为ruby元素的子元素。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

rp元素

分类:
无。
使用场景:
做为ruby元素的子元素,或者在一个rt元素之前。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

bdi元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
此外,dir全局属性在此元素上有特殊语义。
DOM接口:
使用HTMLElement。

bdo元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
此外,dir全局属性在此元素上有特殊语义。
DOM接口:
使用HTMLElement。

span元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
段落式内容
允许的属性:
全局属性
DOM接口:
interface HTMLSpanElement : HTMLElement {};

br元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
空。
允许的属性:
全局属性
DOM接口:
interface HTMLBRElement : HTMLElement {};

wbr元素

分类:
流式内容
段落式内容
使用场景:
需要段落式内容处。
内容模型:
空。
允许的属性:
全局属性
DOM接口:
使用HTMLElement。

使用方式小结

本章节不具有规范性。


元素 意图 示例
a 超链接 访问我的<a href="drinks.html">饮料</a>页面。
em 强调 我不得不说,我<em>超爱</em>柠檬水。
strong 重要的事务 这茶<strong>很烫</strong>。
small 侧记 这些葡萄会用来酿酒。<small>含酒精的饮料会使人上瘾</small>
s 不准确的,错误的文本 报价:<s>¥4.50</s> ¥2.00!
cite 作品的标题 <cite>Hugo v. Danielle</cite>这个案例在这儿很切题。
q 引用,引述 法官说过,<q>你可以从鱼缸里喝水</q>,不过建议你不要这么做。
dfn 定义实例 术语<dfn>有机食品</dfn>适用于那些不是使用化学制品而生成的食物。
abbr 缩写体 在爱尔兰,有机食物是符合<abbr title="Irish Organic Farmers and Growers Association">IOFGA</abbr>公制标准的。
time 日期或时间 它发表于<time>2009-10-21</time>。
code 计算机代码 <code>fruitdb</code>程式能用于跟踪水果的出产。
var 变量 如果碗里有<var>n</var>种水果,那么至少<var>n</var>-2种会是熟的。
samp 计算机输出 计算机输出:<samp>Unknown error -3</samp>。
kbd 用户输入 按<kbd>F1</kbd>继续…
sub 下标 水的分子式是H<sub>2</sub>O。
sup 上标 氢在重水中通常是<sup>2</sup>H。
i 另类意见 柠檬水的主要成份是<i>柑橘属柠檬</i>
b 关键词 拿个<b>柠檬</b>,然后用<b>果汁机</b>榨汁。
u 注解 苹果汁和<u class="spelling">接骨木花</u>汁混在一起感觉很赞。
mark 高亮 接骨木花茶,由一<mark>份</mark>汁,十<mark>份</mark>水勾兑而成。
ruby, rt, rp 印刷标注 <ruby> 橙汁 <rp>(<rt>鲜橙果汁</rt>)</rp></ruby>
bdi 文本定向隔离 推荐这家餐厅<bdi lang="">My Juice Café (At The Beach)</bdi>。
bdo 文本定向格式化 建议写英文,不过要按相反的顺序。比如,"Juice"要变成"<bdo dir=rtl>Juice</bdo>"。
span 其他 在法国,我们称它为<span lang="fr">sirop de sureau</span>。
br 换行 简单的橙汁公司<br>Apopka, FL 32703<br>U.S.A
wbr 换行良机 www.simply<wbr>orange<wbr>juice.com

更改记录

ins元素

分类:
流式内容
当元素只包含段落式内容:段落式内容
使用场景:
当元素只包含段落式内容: 期望出现段落式内容处。
其它情况: 期望出现流式内容处。
内容模型:
透明内容模型
允许的属性:
全局属性
cite
datetime
DOM接口:
使用HTMLModElement。

del元素

分类:
流式内容
当元素仅包含段落式内容: 段落式内容
使用场景:
当元素仅包含段落式内容: 期望出现段落式内容处。
其它情况: 期望出现流式内容处。
内容模型:
透明内容模型
允许的属性:
全局属性
cite
datetime
DOM接口:
使用HTMLModElement。

ins和del元素的通用属性

更改记录与段落

更改记录与列表

嵌入内容

img元素

分类:
流式内容
段落式内容
嵌入式内容
如果元素有一个usemap属性: 交互式内容
使用场景:
需要嵌入式内容处。
内容模型:
空。
允许的属性:
全局属性
alt
src
usemap
ismap
width
height
DOM接口:
[NamedConstructor=Image(),
NamedConstructor=Image(in unsigned long width),
NamedConstructor=Image(in unsigned long width, in unsigned long height)]
interface HTMLImageElement : HTMLElement {
    attribute DOMString alt;
    attribute DOMString src;
    attribute DOMString useMap;
    attribute boolean isMap;
    attribute unsigned long width;
    attribute unsigned long height;
    readonly attribute unsigned long naturalWidth;
    readonly attribute unsigned long naturalHeight;
    readonly attribute boolean complete;
};

iframe元素

分类:
流式内容
段落式内容
嵌入式内容
交互式内容
使用场景:
需要嵌入式内容处。
内容模型:
符合要求的文本。
允许的属性:
全局属性
src
srcdoc
name
sandbox
seamless
width
height
DOM接口:
interface HTMLIFrameElement : HTMLElement {
    attribute DOMString src;
    attribute DOMString srcdoc;
    attribute DOMString name;
    [PutForwards=value] readonly attribute DOMSettableTokenList sandbox;
    attribute boolean seamless;
    attribute DOMString width;
    attribute DOMString height;
    readonly attribute Document contentDocument;
    readonly attribute WindowProxy contentWindow;
};

embed元素

分类:
流式内容
段落式内容
嵌入式内容
交互式内容
使用场景:
需要嵌入式内容处。
内容模型:
空。
允许的属性:
全局属性
src
type
width
height
任何其它没有命名空间的属性(见下文)。
DOM接口:
interface HTMLEmbedElement : HTMLElement {
    attribute DOMString src;
    attribute DOMString type;
    attribute DOMString width;
    attribute DOMString height;
};
根据embed元素嵌入的内容不同,此节点可能支持其它接口。

object元素

分类:
流式内容
段落式内容
嵌入式内容
如果元素有usemap属性:交互式内容
列表元素, 可提交元素, 表单支持元素
使用场景:
需要嵌入式内容处。
内容模型:
零个或多个param元素, 之后为透明内容模型
允许的属性:
全局属性
data
type
name
usemap
form
width
height
DOM接口:
interface HTMLObjectElement : HTMLElement {
    attribute DOMString data;
    attribute DOMString type;
    attribute DOMString name;
    attribute DOMString useMap;
    readonly attribute HTMLFormElement form;
    attribute DOMString width;
    attribute DOMString height;
    readonly attribute Document contentDocument;
    readonly attribute WindowProxy contentWindow;

    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    void setCustomValidity(in DOMString error);
};

param元素

分类:

使用场景:
流式内容前作为object元素的孩子。
内容模型:
空。
允许的属性:
全局属性
name
value
DOM接口:
interface HTMLParamElement : HTMLElement {
    attribute DOMString name;
    attribute DOMString value;
};

video元素

audio元素

source元素

track元素

多媒体元素

canvas元素

canvas元素提供了一些与分辨率相关的位图画布处理脚本,可用于即时渲染图形、游戏图形或其他可视化图像。

如果有更适合使用的元素,创作者不应该在文档中使用canvas元素。例如,不适合使用canvas 元素来渲染一个页面标题:如果想要给标题增加图形化表现效果,那么应该先使用一些适合的元素(一般是h1),然后再使用CSS及支撑技术(如XBL)添加样式。

当创作者使用canvas 元素时,他们还必须提供一些内容,在向用户展示时它们与位图画布表达具有功能或用途。这些内容可能作为canvas 元素的内容。canvas 元素的内容(如果有)是指元素的回退内容(fallback content)。

在交互式可视化媒体中,如果启用了canvas 元素的脚本支持,而且还启用了canvas 元素的支持,那么canvas 元素表示由动态生成的图像构成的嵌入式内容。

在非交互式的静态可视化媒体中,如果canvas 元素之前已经绘制好(例如,如果页面已经在一个交互式可视化媒体中查看,现在已经打印,或者在页面布局过程中运行的脚本在该元素上绘图),那么canvas 元素会以当前图像和尺寸来表示嵌入的内容。否则,这个元素会转而显示它的回退内容。

在非可视化媒体以及禁用了canvas 元素脚本或者禁用canvas 元素支持的可视化媒体中,canvas 元素会转而显示它的回退内容。

当一个canvas元素展示嵌入的内容时,用户仍然可以聚焦(focus)canvas元素的起源内容(即回退内容)。当聚集于一个元素时,它就成为键盘交互事件的执行目标(即使元素本身是不可见的)。这使创作者能够实现利用键盘访问的交互canvas:创作者可以将交互式区域一一映射到回退内容中可聚焦的元素中。(聚集对鼠标交互事件没有影响。) [DOMEVENTS]

canvas 元素有两个控制坐标空间尺寸的属性:width 和height。这些属性的值必须是有效的非负整数。必须使用解析非负整数的规则的来获得它们的数字值。如果缺少一个属性,或者解析值时返回错误,那么它会使用默认值替代。width 属性的默认值是300,而height 属性默认值是150。

canvas 元素的实际尺寸与坐标空间尺寸相同,其数值是按CSS像素解析的。然而,元素的尺寸可以通过样式表进行任意设置。在渲染过程中,图像会进行缩放,以适应布局尺寸。

坐标空间的尺寸并不一定表示用户代理在内部或渲染时使用的实际位图尺寸。例如,在一些高清显示器中,用户代理可能在内部使用两个设备像素表示一个坐标空间单位的位图,这样渲染结果就会保证具有较高的质量。

在创建canvas 元素时,无论后面width 和height 属性被设置为什么值(修改为新值或者之前的值),位图及所有相关上下文都必须清除为初始状态,然后使用最新指定的坐标空间尺寸重新初始化。

当canvas初始化时,它的位图必须清除为透明黑色。

width 和height IDL属性必须反映具有相同名称的相应内容属性(具有相同默认值)。

下面的例子只画出一个正方形:

代码...

context = canvas.getContext(contextId [, ... ])

返回一个对象,它包含在canvas上绘图的API。第一个参数指定希望得到的API。后面是由该API处理的参数。

所定义的上下文清单请参见WHATWG Wiki CanvasContexts页面。[WHATWGWIKI]

如果指定的上下文ID不支持,或者canvas已经初始化为其他(不兼容)类型(例如,在获得一个“webgl”上下文之后再尝试获得一个“2d”上下文),那么它会返回null。

canvas 元素有一个主上下文(primary context),它是该元素获得的第一个上下文。在canvas 元素创建时,它不能拥有主上下文。

最常用的主上下文是HTML Canvas 2D Context。

canvas 元素的getContext(contextId, args...)方法在调用必须执行以下步骤:

  1. 方法是第一个参数必须是contextId 。
  1. 如果contextId 不是用户代理提供的上下文名称,返回null,退出这些步骤。

说明:有一个例子是,用户代理在理论上是支持“webgl”3D上下文的,但是所在平台并没有OpenGL硬件支持,而且用户代理不包含OpenGL软件实现。尽管用户代理能够识别“webgl”名称,但是在这一步它会返回null,因为这个调用实际上不支持这种上下文。

  1. 如果该元素拥有一个主上下文,而WHATWG Wiki CanvasContexts页面的上下文条目中不包含兼容上下文的contextId ,那么返回null,退出这些步骤。[WHATWGWIKI]
  1. 如果这个元素没有主上下文,那么将该元素的主上下文指定为contextId。
  1. 如果这个元素已经调用 getContext()方法处理过同一个contextId,那么返回上次调用得到的同一个对象,退出这些步骤。其他参数忽略。
  1. 返回一个用contextId创建的新对象,具体类型按照 WHATWG Wiki CanvasContexts页面所列的contextId条目的规定。[WHATWGWIKI]

WHATWG Wiki CanvasContexts页面可能会注册新的上下文类型。[WHATWGWIKI]

任何人在任何时候都可以自由编辑WHATWG Wiki CanvasContexts页面,添加新的上下文类型。这些新的上下文类型必须指定以下信息:

关键词

返回新API定义的对象的contextID 值。

规范

指向上下文类型API正式规范的链接。它可能是Wiki上的另一个页面,或者一个外部页面的链接。如果这个类型没有正式的规范,那么可以先用一个非正式描述替代,直到正式的规范发布。

兼容性

兼容此上下文的上下文类型清单(例如,运行在相同的底层位图上)。这个清单必须是可传递且对称的;如果定义的一个上下文类型与其他类型兼容,那么它兼容的所有类型都必须与这个类型所兼容的全部类型相兼容。

供应商还可能使用“供应商名-上下文”的语法来定义实验性上下文,例如,moz-3d。这些上下文应该在WHATWG Wiki CanvasContexts页面注册。

url = canvas.toDataURL( [ type, ... ])

返回一个表示Canvas中图像的data: URL。

第一个参数(如果有),控制返回图像的类型(例如,PNG或JPEG)。默认值是image/png;如果指定类型不支持,那么也会使用这个默认类型。其他参数与这个具体类型相关,用来控制图像的生成方式,如下表所示。

如果要使用非“image/png”的类型,那么创作者可以通过检查返回的字符串是否由“data:image/png,”或“data:image/png;”开头,以此检查图像是否确定为所要求的格式。如果是,那么图像格式是PNG,因此请求的类型是不支持的。(唯一例外的情况是当canvas没有设置高度或宽度的时候,得到的应该只有“data:,”。)

canvas.toBlob(callback [, type, ... ])

创建一个Blob对象,表示一个包含Canvas图像的文件,并使用该对象的引用调用一个回调函数。

第二个参数(如果有),控制所返回图像的类型(例如,PNG或JPEG)。默认值是image/png;如果指定类型不支持,就使用默认值。其他参数与这个类型相关,用来控制图像的生成方式,如下表所示。

toDataURL()方法必须执行以下步骤:

  1. 如果Canvas没有像素(例如,水平尺寸或垂直尺寸为0),那么返回字符串“data:,”,然后退出这些步骤。(这是最短的data: URL;它表示text/plain资源中的空字符串。)
  1. 使file成为图像序列化的文件,使用方法的参数(如果有)作为参数。
  1. 返回一个表示file的data: URL。[RFC2397]

toBlob()方法必须执行以下步骤:

  1. 在第一个参数中传入回调函数(callback )。
  1. 在第二个参数中传入arguments ,如果它有参数,在后面添加它的参数。
  1. 使用arguments传入表示图像序列化文件file 。
  1. 返回,但是继续以异步方式执行这些步骤。
  1. 如果callback 为null,那么退出这些步骤。
  1. 将一个任务排队,使用一个表示文件的Blob对象作为参数,调用FileCallback回调函数。

当用户代理选择一些特定参数将图像序列化为文件,那么它会按第一个参数值指定的格式创建一个图像文件,或者在未指定参数的情况下使用PNG格式。[PNG]

如果 arguments 不为空,那么第一个值必须解释为一个MIME类型,以指定使用的格式。如果类型包含任何参数,那么它必须当作未提供进行处理。

例如,“image/png”表示要生成一个PNG图像,“image/jpeg”则表示要生成一个JPEG图像,而“image/svg+xml”表示要生成一个SVG图像(这很可能要求实现技术实际上保存足够的信息,才能够确保从canvas渲染一个SVG图像)。

用户代理必须支持PNG(“image/png”)。用户代理可能支持其他类型。如果用户代理不支持所请求的类型,那么它必须使用PNG格式创建这个文件。[PNG]

如果用户代理支持这种类型,那么它必须在创建之前将所提供的类型转换为ASCII小写字母。

对于不支持透明度通道的图像类型,序列化的图像必须使用source-over 操作将canvas图像组合到一个实黑色背景上。

如果arguments中的第一个参数指定的类型属于下表第一列所指定的类型之一,而且用户代理支持这种类型,那么后续参数(如果有)必须按照表中该行的第二列所述方式进行处理。

类型 其他参数 引用
image/jpeg 第二个参数,如果是从0.0至1.0的数字,那么它必须作为预期质量级别。如果它不是一个数字,或者数值超出这个范围,那么用户代码必须使用它的默认值,处理方式与未指定参数时一样。 [JPEG]

根据这些规则,如果一个参数可以按照在Web IDL规范中处理any类型参数的方式转换为一个IDL双精度浮点数,那么这个参数就是一个数字。[WEBIDL]

其他参数必须忽略,而且一定不能引起用户代理抛出异常。这个规范的后续版本将可能定义这些方法的其他参数,使创作者能够更小心地控制压缩设置、图像元数据等。

颜色空间和颜色校正
canvas元素安全性

如果一个原点的脚本可以访问另一个原点(不在同一个原点)的图像信息(例如,读取像素),那么就可能发生信息泄漏。

为了避免这个问题,canvas元素定义了一个标记,用来表示它们是否为干净原点(origin-clean)。所有canvas元素都必须先将它们的origin-clean 设置为true。如果发生以下情况,那么这个标记必须设置为false:

  • 调用元素的2D上下文的drawImage()方法处理一个原点与canvas元素所在Document对象不同的HTMLImageElement 或HTMLVideoElement。
  • 调用元素的2D上下文的drawImage()方法处理一个origin-clean 标记为false的HTMLCanvasElement。
  • 元素的2D上下文的 fillStyle属性设置为一个 CanvasPattern对象,而它由一个在模式创建时原点与canvas元素所在Document对象不同的HTMLImageElement 或HTMLVideoElement 创建。
  • 元素的2D上下文的fillStyle属性被设置为一个CanvasPattern对象,而它由一个在模式创建时origin-clean 标记为false的HTMLCanvasElement 创建。
  • 元素的2D上下文的strokeStyle 属性被设置为一个CanvasPattern对象,而它由一个在模式创建时与canvas元素所在Document对象不同HTMLImageElement的HTMLVideoElement或创建。
  • 元素的2D上下文的strokeStyle属性被设置为一个CanvasPattern对象,而它由一个在模式创建时origin-clean 标记为false的HTMLCanvasElement 创建。
  • 使用一个原点与canvas元素所在Document对象不同的字体来调用元素的2D上下文的fillText()或strokeText()方法。(这种字体甚至不一定已经使用;问题关键在于这种字体是否被认为是一种字形图。)

如果canvas元素的origin-clean 标记为false,那么任何时候调用它的toDataURL()方法都会抛出一个SECURITY_ERR 异常。

如果canvas元素的origin-clean 标记为false,那么任何时候调用2D上下文getImageData()方法都会抛出一个SECURITY_ERR 异常。

如果canvas元素最终使用一种原点与canvas元素所在Document对象不同的字体,那么任何时候调用2D上下文的measureText()方法都会抛出一个SECURITY_ERR 异常。

注意:即使通过修改width 或height 属性来重置canvas,它的标记也不会重置。

map元素

area元素

图像映射

MathML

SVG

尺寸属性

表格数据

table元素

描述表格的技术
表格布局的技术

caption元素

colgroup元素

col元素

tbody元素

thead元素

tfoot元素

tr元素

td元素

th元素

td和th元素的通用属性

处理模型

示例

表单

介紹

分類

本章節的各個元素在分類上除了屬於通常的流式內容章節式內容互動內容以外,還屬於不同但有交集(卻有細微差異)的多個分類。

有不少元素是表單連結元素,也就是有主表單、存取主表單用的內容屬性 form 與對應的 IDL 屬性 form

buttonfieldsetinputkeygenlabelmeterobjectoutputprogressselecttextarea

表單連結元素又分為以下幾個子分類:

被列元素

是指 form.elementsfieldset.elements API 會列出的元素。

buttonfieldset

inputkeygenobjectoutputselect

textarea
Error creating thumbnail: Unable to save thumbnail to destination

可標元素

是指可與 label 元素連結的元素。

buttoninput(若 type 屬性「不」處於隱藏狀態),keygenmeteroutputprogressselecttextarea

可提交元素

是指當使用者提交 form 元素的時候,建構表單資料集用到的元素。

buttoninputkeygenobjectselecttextarea

可重設元素

是指 form 元素重置時會影響到的元素。

inputkeygenoutputselecttextarea

另外,可提交元素根據擁有的屬性可能是按鈕。後面說明元素是按鈕的條件。有些按鈕還是提交按鈕

注:object 元素也是表單連結元素,在有對應的插件的情況下會參與表單提交的過程。

form元素

fieldset元素

legend元素

label元素

input元素

type 屬性的狀態
input 元素的共通屬性

每個 input 元素的 type 屬性的狀態的定義決定了以下哪些屬性適用於這個元素。當某個一個屬性不適用於某個 input 元素時,使用者代理必須忽視該屬性,此時以下對於的該屬性的要求與定義皆不適用。

autocomplete 屬性

部分使用者代理有幫助使用者填寫表單的功能,舉例來說,預先幫使用者填上之前輸入過的地址。

autocompelte 屬性是一個列舉屬性,他有三個狀態:對應到關鍵字 on開啟狀態、對應到關鍵字 off關閉狀態、不指定屬性時的失蹤預設值預設狀態。

關閉狀態代表控制項的輸入特別重要(例如核武的啓動代碼),或者輸入絕不可重復使用(例如銀行登入的一次性鑰匙)因此使用者必須每次輸入,而不可讓使用者代理預先填寫,又或網頁提供自己的自動完成機制而不需要使用者代理提供的自動完成值。

相反的,開啟狀態代表這個值不是特別重要,使用者可以讓他的使用者代理記憶他在那個控制項輸入的值。

預設狀態代表使用者會用該元素的主表單上的 autocomplete 屬性。(form 元素的 autocomplete 屬性預設處於開啟狀態。)

每一個 input 元素都有一個自動完成狀態結果,是開啟關閉兩者其一。

input 元素處於以下任一種情況時,input 元素的自動完成狀態結果開啟,否則 input 元素的自動完成狀態結果關閉

當一個 input 元素的自動完成狀態結果開啟,使用者代理可以庫存使用者輸入的值以作為表單預先填寫之用,以期未來使用者返回同樣頁面。否則,使用者不應該記憶控制項的取值,也不應該提供使用者過去輸入的值。

另外,若自動完成狀態結果關閉 ,當瀏覽器穿越歷史會重設取值

使用者代理必須將自動完成當成使用者對元素取值的更改,且自動完成必須發生在元素處於可變狀態的時候(例如,元素剛進入文件的時候,或者使用者代理停止解析的時候)。

銀行往往不讓使用者代理預先填寫登入資訊:
<p><label>帳戶:<input type="text" name="ac" autocomplete="off"></label></p>
<p><label>PIN:<input type="password" name="pin" autocomplete="off"></label></p>
使用者代理可以讓使用者覆蓋自動完成狀態結果,成為一直記憶使用者輸入並預先填寫表格的開啟,或是永遠不記憶的關閉。然而,由於使用者代理不論哪種網站記住所有使用者輸入的作法有安全上的隱憂,覆蓋自動完成狀態結果成為開啟的功能不應該輕易可以使用。
dirname 屬性

dirname 屬性適用於某元素上 時,它是表單控制項 dirname 屬性

在下面的例子裡,表單有一個文字欄位與一個提交按鈕。
<form action="addcomment.cgi" method=post>
 <p><label>評論:<input type=text name="comment" dirname="comment.dir" required></label></p>
 <p><button name="mode" type=submit value="add">發表評論</button></p>
</form>

當使用者提交表單時,使用者代理會準備三個欄位:"comment", "comment.dir", "mode",若使用者輸入 "Hello",提交內文可能變成:

comment=Hello&'''comment.dir=ltr'''&mode=add

若使用者手動切換成右到左的書寫方向並輸入 "مرحبًا",提交內文可能變成:

comment=%D9%85%D8%B1%D8%AD%D8%A8%D9%8B%D8%A7&comment.dir=rtl&mode=add
list 屬性

list 屬性可以用來指定代表預定義的建議選項列表的一個元素。

若網頁作者欲設定此屬性,則它的取值必須是同樣文件裡一個 datalist 元素的 ID

若文件中以樹排序算的第一個 ID 等同於 list 屬性值的元素是一個 datalist 元素,則該元素為 input 元素的建議來源元素。若未指定 list 屬性,或者沒有擁有該 ID 的元素,又或第一個有該 ID 的元素不是一個 datalist 元素,則 input 元素沒有建議來源元素

input 元素具有建議來源元素,則當使用者代理讓使用者編輯 input 元素的取值時,使用者代理應該視控制項的形態,以適合的方式提供建議來源元素代表的建議選項給使用者。使用者代理可以在適當的時機用建議選項的標籤代表該選項。

使用者選取建議選項後的處理方法視元素是否為僅接受單一取值的控制項,又或元素可以接受數個取值而定。

若元素不具有 multiple 屬性,或是 multiple 屬性不適用

當使用者選取了一個建議選項,input 元素的取值必須設為選到選項的取值,如同使用者自己輸入的。

若元素確時multiple 屬性,且 multiple 屬性適用

當使用者選取了一個建議選項,使用者代理必須加一份有選到選項的取值的資料到 input 元素的取值組,或者更改 input 元素取值組裡既有的一份資料成為選到選項的取值,如同使用者自己加了一份有該數值的資料,或編輯了一份既有資料成為該值。使用上述兩種行為的那種取決於使用者介面,由使用者代理決定。

list 屬性不適用,則 input 元素沒有建議來源元素

以下的網址條會提供幾種建議選項。
<label>首頁:<input name=hp type=url list=hpurls></label>
<datalist id=hpurls>
 <option value="http://www.google.com/" label="Google">
 <option value="http://www.reddit.com/" label="Reddit">
</datalist>
使用者歷史中的其他網址也可能出現,這因用戶代理不同而有所不同。
以下範例講解如何設計使用自動完成列表功能,但是在老舊使用者代理下仍有用的表單。

若自動完成列表僅是補助工具且對於內容不重要,則直接把各 option 元素放在 datalist 元素下就夠了。為了避免老舊使用者代理渲染這些值,值應該寫在 value 屬性裡而不是行內。

<p>
 <label>
  輸入一個品種:
  <input type="text" name="breed" list="breeds">
  <datalist id="breeds">
   <option value="阿比西尼亞貓">
   <option value="挪邦貓">
   <!-- ... -->
  </datalist>
 </label>
</p>

然而,若這些值必須在老舊使用者代理上顯示,則需要將後退內容放在 datalist 元素裡,如下:

<p>
 <label>
  輸入一個品種:
  <input type="text" name="breed" list="breeds">
 </label>
 <datalist id="breeds">
  <label>
   或從列表中選取:
   <select name="breed">
    <option value="">(未選取)
    <option>阿比西尼亞貓
    <option>挪邦貓
    <!-- ... -->
   </select>
  </label>
 </datalist>
</p>

後退內容只會在不支援 datalist 的使用者代理上顯示。另一方面,儘管這些選項不是 datalist 元素直接的子節點,所有使用者代理都會偵測到這些選項。

請注意若 datalist 裡的 option 元素具有 selected 屬性,則老舊使用者代理會預設選取該選項(因為 select 的關係),但是這種情況不會發生在支援 datalist 元素的使用者代理上。
readonly 屬性

readonly 屬性是一個布林屬性,控制使用者能否編輯某個表單控制項。具有此屬性的元素是不可變的

約束驗證:若一個 input 元素具有 readonly 屬性,不進行這個元素的約束驗證

在下面例子中,使用者不能更動既有產品的標識符,但是這些標識符還是呈現為表單的一部分,以與新產品(尚未輸入標識符)所使用的新的欄位在外觀上一致。
<form action="products.cgi" method=post enctype="multipart/form-data">
 <table>
  <tr> <th> 產品 ID <th> 產品名稱 <th> 價格 <th> 操作
  <tr>
   <td> <input readonly name="1.pid" value="H412">
   <td> <input required name="1.pname" value="奧客牌落地燈">
   <td> $<input required type=number min=0 step=0.01 name="1.pprice" value="49.99">
   <td> <button formnovalidate name="action" value="delete:1">刪除</button>
  <tr>
   <td> <input readonly name="2.pid" value="FG28">
   <td> <input required name="2.pname" value="奧客牌桌燈">
   <td> $<input required type=number min=0 step=0.01 name="2.pprice" value="24.99">
   <td> <button formnovalidate name="action" value="delete:2">刪除</button>
  <tr>
   <td> <input required name="3.pid" value="" pattern="[A-Z0-9]+">
   <td> <input required name="3.pname" value="">
   <td> $<input required type=number min=0 step=0.01 name="3.pprice" value="">
   <td> <button formnovalidate name="action" value="delete:3">刪除</button>
 </table>
 <p> <button formnovalidate name="action" value="add">加入</button> </p>
 <p> <button name="action" value="update">除存</button> </p>
</form>
size 屬性

size 屬性可以用來指定在視覺渲染下,用戶代理允許正在編輯此元素取值的使用者看到的字元數。

若網頁作者欲指定 size 屬性,則它的取值必須是大於零的合法非負整數

若某個元素具有此屬性,使用者代理必須使用非負整數解析規則解析它的取值,且若結果是大於零的數,則使用者代理應該確保使用者可以至少看到那麼多個字元。

IDL 屬性 size 受限於大於零的非負數值,且預設值為 20。

required 屬性

required 屬性 屬性是一個布林屬性。當某個元素具有此屬性,他是必要的

約束驗證:若一個元素是必要的且它的 IDL 屬性 value 適用且處於數值模式,又它是可變的取值為空字串,則此元素苦於失蹤

以下的表單有兩個必要欄位,一個是郵件信箱欄,一個是密碼欄。表單的第三個欄位只有當使用者在密碼欄跟第三個欄位輸入相同密碼時才合法。
<h1>創建新帳號</h1>
<form action="/newaccount" method=post
      oninput="up2.setCustomValidity(up2.value != up.value ? '密碼不相符。' : '')">
 <p>
  <label for="username">郵件信箱:</label>
  <input id="username" type=email required name=un>
 <p>
  <label for="password1">密碼:</label>
  <input id="password1" type=password required name=up>
 <p>
  <label for="password2">確認密碼:</label>
  <input id="password2" type=password name=up2>
 <p>
  <input type=submit value="Create account">
</form>
multiple 屬性

multiple 屬性是一個表示使用者代理允不允許使用者輸入超過一個取值的布林屬性

以下片段是讓電子郵件客戶端的「Cc」欄位處理多個郵件地址的方法。
<label>Cc: <input type=email multiple name=cc></label>

若使用者在他的線下聯絡人資料庫裡有「Arthur Dent」(地址「art@example.net」)與「Adam Josh」(地址「adamjosh@example.net」)兩個朋友,則在使用者輸入了「a」以後,使用者代理可以給使用者建議這兩個郵件。

sample-email-1.png

頁面也可以直接連到網站上的使用者的聯絡人資料庫:

<label>Cc: <input type=email multiple name=cc list=contacts></label>
...
<datalist id="contacts">
 <option value="hedral@damowmow.com">
 <option value="pillar@example.com">
 <option value="astrophy@cute.example">
 <option value="astronomy@science.example.org">
</datalist>

假設使用者已在這個文字欄位輸入了「bob@example.net」並開始輸入第二個郵件以「a」為開頭的郵件地址,使用者代理可以顯示前面提到的兩個朋友跟 datalist 元素裡的「antrophy」與「astronomy」這兩個值。

sample-email-2.png
以下片段是讓電子郵件客戶端的「附件」欄位處理多個上傳檔案的方法。
<label>附件:<input type=file multiple name=att></label>
maxlength 屬性

maxlength 屬性適用於某 input 元素上時,它是此元素髒值標記控制的表單控制項 maxlength 屬性

若一個 input 元素具有最大容許取值長度,則此元素的 value 屬性取值的代碼點長度必須等於或小於它的最大容許取值長度

以下片段是讓通訊客戶端的文字欄位限制在固定的字符數之內,也迫使在這個媒介下進行的溝通是簡潔的,並阻止長篇大論。
有什么新鲜事想告诉大家?<input name=status maxlength=140>
pattern 屬性

pattern 屬性可以用來指定用來檢驗控制項取值或是取值組(元素具有multiple 屬性且它適用)的正規表示。

若網頁作者欲設定此屬性,則屬性質必須與 JavaScript 的 Pattern 產生式匹配。[ECMA262]

若一個 input 元素具有 pattern 屬性,且屬性值可以成功的作為一個停用 gobalignoreCasemultiline 標記的 JavaScript 正規表示編譯,則其結果稱之為此元素的編譯後正規表示模式。若元素不具有此屬性,又或屬性取值不能成功編譯,此元素不具有編譯後正規模式[ECMA262]

約束驗證:若一個元素的取值不為空字串,且元素不具有 multiple 屬性或屬性不適用於 input 元素 type 屬性的當時狀態,且元素具有編譯後正規表示模式但該正則表示不與元素的取值整體匹配,則此元素苦於不匹配模式

約束驗證:若一個元素的取值不為空字串,且元素具有適用的 multiple 屬性,且元素素具有編譯後正規表示模式但該正則表示不與元素取值的每一個取值的整體匹配,則此元素苦於不匹配模式

注:這代表此屬性用的正規表示語言,除了 pattern 屬性必須匹配整個取值而不是其中的子集(相當於在開頭有個隱藏的 ^(?,結尾有個 )$)以外,與 JavaScript 用的相同。

網頁作者在設定 input 元素的 pattern 屬性時應該在 title 屬性寫上模式的說明。使用者代理可以在需要知會告知使用者模式不匹配的情形,或是顯示工具提示,又或補助科技在控制項獲得焦距的時候,使用此屬性的值。

舉例來說,下面片段:
<label> 產品編號:
 <input pattern="[0-9][A-Z]{3}" name="part"
        title="產品編號有一位數字與三個大寫字母。"/>
</label>

可能讓使用者代理這樣提醒使用者:

產品編號有一位數字與三個大寫字母。
欄位輸入不正確時不能提交表單。

當控制項具有 pattern 屬性時, title 屬性必須是格式的描述,也可以加上幫助使用者填寫欄位的額外資訊。不然,補助科技會受到干擾。

舉例來說,若 title 屬性的內容是控制項的標題,補助科技可能會說出不太有用的話,如:「您輸入文字不符合要求的格式。生日」。

使用者代理能可以在錯誤未發生的時候(例如,鼠標在控制項上懸掛時顯示工具提示)顯示 title 屬性,因此網頁作者寫 title 的用詞不該假設錯誤已發生。

min 屬性與 max 屬性

min 屬性與max 屬性表示元素取值的容許範圍。

定義 type 屬性當時狀態的小節也定義了這兩個屬性的語法。

若一個元素具有 min 屬性,且對 min 屬性的值 使用字串至數值的轉換演算法可以得到一個數值,則該數值是元素的極小值。否則,若 type 屬性的當時狀態有定義預設極小值,則它就是極小值。否則,此元素沒有極小值

約束驗證:當一個元素有極小值,且對此元素取值的字串使用字串至數值的轉換演算法可以得到一個數值,而且從該演算法得到的數值小於極小值,則此元素苦於過小

min 屬性也定義了間隔基準

若一個元素具有 max 屬性,且對 max 屬性的值 使用字串至數值的轉換演算法可以得到一個數值,則該數值是元素的極大值。否則,若 type 屬性的當時狀態有定義預設極大值,則它就是極大值。否則,此元素沒有極大值

約束驗證:當一個元素有極大值,且對此元素取值的字串使用字串至數值的轉換演算法可以得到一個數值,而且從該演算法得到的數值大於極大值,則此元素苦於溢位

max 屬性的值(極大值)必不可小於 min 屬性的值(極小值)。

注:若一個元素的極大值小於它的極小值,則當元素有取值的時候它會苦於過小苦於溢位

若一個元素有既定義的極小值極大值則它具有範圍限制

以下的日期控制項限制輸入為八零年代以前的日期:
<input name=bday type=date max="1979-12-31">
以下的數值控制項限制輸入為大於零的整數:
<input name=quantity required type=number min=1 value=1>
step 屬性

step 屬性表示取值透過限制輸入的值預期(並要求)的精準度。

定義 type 屬性當時狀態的小節也定義了預設間隔間隔比例因子與部份狀況的預設間隔基準,作為下述的處理屬性的過程之用。

若網頁作者欲設定 step 屬性,其屬性值必須是能解析成大於零的數值的合法浮點數,或是一個 ASCII 不區分大小寫匹配 "any" 字串的值。

此屬性提供了元素的允許取值間隔,如下:

  1. 若元素沒有此屬性,則允許取值間隔預設間隔間隔比例因子的乘積。
  2. 否則,若屬性的值ASCII 不區分大小寫匹配 "any",則沒有允許取值間隔
  3. 否則,若對屬性值使用浮點數值解析規則回傳錯誤、零、或是小於零的數值,則允許取值間隔預設間隔間隔比例因子的乘積。
  4. 否則,允許取值間隔是對屬性質使用浮點數值解析規則回傳的結果與間隔比例因子的乘積。

間隔基準是對 min 屬性的取值使用字串至數值的轉換演算法的結果。但是若元素沒有 min 屬性或使用上述演算法產生錯誤結果,則間隔基準預設間隔基準(若有定義)或零。

約束驗證:當一個元素有允許取值間隔,且對此元素取值的字串使用字串至數值的轉換演算法可以得到一個數值,而且該數值減掉間隔基準不是允許取值間隔的乘數,則此元素苦於不匹配間隔

以下範圍控制項僅接受在 0...1 的 256 個值:
<input name=opacity type=range min=0 max=1 step=0.00392156863>
以下控制項允許使用者以任何精度(例如,一千分之一秒或更細的精度)選擇當天的任何時間:
<input name=favtime type=time step=any>
一般來說,時間控制項的精度限於一分鐘。
placeholder 屬性

placeholder 屬性代表幫助使用者輸入資料的提示(一個詞或是短句子)。提示可以是取值的範例或是預期格式的簡短描述。若網頁作者欲使用此屬性,屬性值必不可含有字符 U+000A LINE FEED (LF) 或 U+000D CARRIAGE RETURN (CR)。

注:如果想使用較長的提示或是其他內容,title 屬性比較合適。

placeholder 屬性不應該用來當作 label 的替代方案。

當元素的取值是空字串且控制項尚未獲得焦距時,使用者代理應該從此提示剝離換行符然後呈現給使用者(例如在空白且沒有焦距的控制項裡顯示)。

這是一個使用 placeholder 屬性的信箱設定的使用者界面例。
<fieldset>
 <legend>信箱帳號</legend>
 <p><label>姓名:<input type="text" name="fullname" placeholder="John Ratzenberger"></label></p>
 <p><label>信箱:<input type="email" name="address" placeholder="john@example.net"></label></p>
 <p><label>密碼:<input type="password" name="password"></label></p>
 <p><label>描述:<input type="text" name="desc" placeholder="我的信箱帳號"></label></p>
</fieldset>
input 元素的共通 API
共通事件行為

button元素

select元素

datalist元素

optgroup元素

option元素

textarea元素

keygen元素

output元素

progress元素

meter元素

控制項與表單的連結

一個表單連結元素可以與一個 form 元素有連結,為它的主表單。若一個表單連結元素並沒有一個相連的 form 元素,則稱其主表單為空值。

一個表單連結元素預設為與最近的祖先 form 元素(下面描述),但是 form 屬性可以覆蓋這個設定。

注:由於瀏覽器不支援巢狀 form 元素,這個功能提供了一個繞道方法。

若網頁作者在一個表單連結元素上指定一個 form 屬性的值,則該值必須為該元素主 Document 裡的一個 form 元素的 ID

注:儘管符合規範的文件絕不會有巢狀 form 元素 ,生成這種文件(比如說使用操作 DOM 的腳本)卻是可能的,這讓本小節的規則變得複雜。由於歷史因素,HTML 解析器會產生與不是其祖先的 form 元素相連的表單連結元素,更增加複雜度。

當一個表單連結元素誕生時,使用者代理必須將其主表單初始化為空值(沒有主表單)。

當一個表單連結元素與一個表單相連時,使用者代理必須將其主表單設為該表單。

當一個表單連結元素的祖先鏈變動(比如說使用者將它或是它的祖先進入到該 Document 或是從該 Document 離去)時,使用者代理必須重設該元素的主表單
注:HTML 解析器在插入表單控制項的時候無視這項規則

當一個表單連結元素form 屬性被設置、變更、移去時,使用者代理必須重設該元素的主表單

當一個表單連結元素form 屬性且該 Document 的任一個元素的 ID 更動時,使用者代理必須重設該表單連結元素的主表單

當一個表單連結元素form 屬性且一個有 ID 的元素進入到該 Document 或是從該 Document 離去時,使用者代理必須重設該表單連結元素的主表單

當使用者代理要重設一個表單連結元素的主表單時,它必須執行下列步驟:

  1. 若該元素的主表單不為空值,且該元素沒有 form 內容屬性,且祖先鏈變動後該元素的主表單是最近的祖先 form 元素,則不做任何事並退出這些步驟。
  2. 設該元素的主表單為空值。
  3. 若該元素有內容屬性 form ,執行以下步驟:
    1. 若第一個「滿足Document且其 ID 不分大小寫等同於表單連結元素的內容屬性 form 的值」的元素是一個 form 元素,則將該表單連結元素form 元素相連
    2. 退出「重設一個表單連結元素的主表單」的步驟。
  4. 否則,若該表單連結元素有一個祖先 form 元素,則將該表單連結元素與最近的祖先 form 相連
  5. 否則,該元素沒有相連表單。
在下面的不合法片段裡:
...
 <form id="a">
  <div id="b"></div>
 </form>
 <script>
  document.getElementById('b').innerHTML =
     '<table><tr><td><form id="c"><input id="d"></table>' +
     '<input id="e">';
 </script>
...

"d" 的主表單是巢狀表單內測的 "c",但 "e" 的主表單是外側的 "a"。

事情發生順序如下:首先,"e" 節點在 HTML 解析器內與 "c" 相連。後來,innerHTML 演算法將這些節點從暫時文件移到 "b" 元素上。在這個時候,這些節點看到祖先鏈的變動,也因此解析器的「魔法」相連被重設成一般的祖先相連。

此範例為為不合法的文件,因為它違背了內容模型不允許巢狀 form 元素的規定。
此区块中不是标准描述,实现要求在下面给出。

元素 . form

回傳元素的主表單

若沒有則回傳空值。

表單連結元素 有 IDL 屬性 form。該屬性在獲取時必須回傳元素的主表單,或是在沒有主表單時回傳空值。

表單控制項的共通屬性

為表單控制項命名

內容屬性 name 可以用來命名表單控制項,表單的命名直接影響表單提交的過程與 form 元素的 elements 物件。若網頁作者欲設定此屬性,則它的取值必不可為空字串。

本規範允許任何非空的 name 值,但是 "_charset_" 與 "isindex" 這兩個值有特殊作用:

isindex

若一個用 application/x-www-form-urlencoded 作為提交機制的表單的第一個控制項為文字控制項且其名字為這個值,則表單僅提交這個控制項取值,不送出名字。

_charset_

若沒有 value 屬性的隱藏控制項的名字為這個值,則表單提交時的控制項取值自動變成提交的編碼。

IDL 屬性 name 必須反映內容屬性 name

啟用和停用控制項

內容屬性 disabled 是一個布林屬性

若一個表單控制項設有 disabled 屬性,或者它是一個設有 disabled 屬性的 fieldset 元素的子嗣但「不是」該 fieldset 元素的第一個 legend 子元素(若存在)的子嗣,則這個表單控制項處於停用狀態

處於停用狀態的表單控制項必須防止任何使用者互動任務源隊列click 事件被分發到元素上。

約束驗證:若一個元素處於停用狀態,則不進行這個元素的約束驗證

IDL 屬性 disabled 必須反映內容屬性 disabled

控制項的取值

每個表單控制項都具有取值確認標記。(僅有 input 元素有後者)。這些是描述使用者與控制項互動狀態的變數。

為了定義有 multiple 屬性的 input 元素的約束驗證行為,input 元素也可能會有另外的取值組變數。

控制項的自動聚焦

內容屬性 autofocus 讓網頁作者可以選定頁面讀取完成同時該獲得焦距的控制項,這讓使用者可以立即輸入內容而不需要手動給主要控制項焦距。

autofocus 屬性是一個布林屬性

網頁作者必不可指定 autofocus 屬性在超過一個文件裡的元素上。

當設置了 autofocus 屬性的元素進入到文件裡時,使用者代理應該執行下列步驟:

  1. 目標為元素的 Document
  2. 目標沒有瀏覽上下文,退出這些步驟。
  3. 目標瀏覽上下文沒有頂級瀏覽上下文(例如,目標是沒有父瀏覽上下文嵌套的瀏覽上下文),退出這些步驟。
  4. 目標瀏覽上下文在創建的時候不設有沙盒中的自動機能瀏覽上下文標記,退出這些步驟。
  5. 目標來源目標父瀏覽上下文中此時有焦距的元素的 Document來源相同,退出這些步驟。
  6. 目標來源目標頂級瀏覽上下文現行文件來源相同,退出這些步驟。
  7. 若使用者代理曾經為了回應一個頂級瀏覽上下文現行文件目標頂級瀏覽上下文現行文件相同的元素進入一個 Document 的事件,退出這些步驟。
  8. 若可以由使用者的行為(例如開始在表單控制項輸入內容)推論使用者不希望聚焦改變,可以退出這些步驟。
  9. 將以下任務排入隊列:確認該元素可得到焦距,若可,執行該元素的聚焦步驟。使用者代理也可以改變文件的捲軸位置,或是用其他方法讓使用者注意到該元素。此任務的任務源DOM 操作任務源
注:給控制項焦距不代表使用者代理必須給予已失焦的瀏覽器視窗焦距。

IDL 屬性 autofocus 必須反映同樣名稱的內容屬性。

在下面的片段裡,當文件讀取完成的時文字控制項會得到焦距:
<input maxlength="256" name="q" value="" autofocus>
<input type="submit" value="Search">
限制使用者的輸入長度

髒值標記控制的表單控制項 maxlength 屬性可以用來宣告使用者能輸入的字符數限制。

若網頁作者欲指定一個元素的表單控制項 maxlength 屬性,該屬性值必須是合法非負整數。若使用者指定此屬性且使用者代理對這個值使用非負整數解析規則進行解析可以得到一個數字,則該數字是此元素的最大容許取值長度 。若使用者未指定此屬性或解析屬性值發生錯誤,則沒有最大容許取值長度

約束驗證:若一個元素具有最大容許取值長度髒值標記為真,取值最後一次的更改是透過使用者(而不是腳本造成的改變),且元素取值代碼點長度大於元素的最大容許取值長度,則該元素苦於過長

使用者代理可以阻止使用者進行讓元素的取值代碼點長度大於元素的最大容許取值長度的行為。

表單提交

網頁作者可以在 form 元素或是提交按鈕(提交表單按鈕的代表原素,例如 type 屬性處於提交按鈕狀態的 input 元素)上指定表單提交用屬性

網頁作者可以指定在 form 元素上的表單提交用屬性actionenctypemethodnovalidatetarget

網頁作者可以指定在提交按鈕上的表單提交用屬性有相對的 formactionformenctypeformmethodformnovalidateformtarget。若未指定,這些屬性的預設值是 form 元素上對應屬性的值。

若網頁作者指定內容屬性 actionformaction,則取值必須是可能有兩邊空白的合法非空網址

若一個元素為提交按鈕且它具有 formaction 屬性,則它的行動是該屬性的值,否則此元素的行動是其主表單 action 屬性(若有)的值,否則此元素的行動是空字串。

內容屬性 methodformmethod 是有以下關鍵字與狀態的列舉屬性

  • 對應到 GET 狀態的關鍵字 get,表示 HTTP GET 方法。
  • 對應到 POST 狀態的關鍵字 post,表示 HTTP POST 方法。

這兩個屬性的失蹤預設值GET 狀態。

一個元素的方法是這兩個狀態其一。若此元素為提交按鈕且它具有 formmethod 屬性,則此元素的方法是該屬性的狀態,否則此元素的方法是其主表單 method 屬性的狀態。

內容屬性 enctypeenctype 是有以下關鍵字與狀態的列舉屬性

  • 關鍵字 "application/x-www-form-urlencoded" 與對應的狀態。
  • 關鍵字 "multipart/ford-data" 與對應的狀態。
  • 關鍵字 "text/plain" 與對應的狀態。

這兩個屬性的失蹤預設值application/x-www-form-urlencoded 狀態。

一個元素的編碼型別是這兩個狀態其一。若此元素為提交按鈕且它具有 formenctype 屬性,則此元素的編碼型別是該屬性的狀態,否則此元素的編碼型別是其主表單 enctype 屬性的狀態。

若網頁作者指定內容屬性 targetformtarget,則取值必須是合法瀏覽上下文名稱或關鍵字

內容屬性 novalidateformnovalidate布林屬性。若存在,代表提交時不驗證該表單。

若一個元素為提交按鈕且它具有 formnovalidate 屬性,或此元素的主表單具有 novalidate 屬性,則此元素的不驗證狀態為真,否則為假。

在表單具有驗證約束的時候,這個屬性可以用來做「儲存」按鈕,讓使用者儲存書寫到一半的表單資料。下面的例子是個簡單的表單,有兩個必填欄位與三個按鈕:一個用來提交表單,但是非填完不能提交,一個用來儲存表單,讓使用者可以繼續未完的作業,一個用來清空表單。
<form action="editor.cgi" method="post">
 <p><label>姓名:<input required name=fn></label></p>
 <p><label>短文:<textarea required name=essay></textarea></label></p>
 <p><input type=submit name=submit value="提交短文"></p>
 <p><input type=submit formnovalidate name=save value="儲存短文"></p>
 <p><input type=submit formnovalidate name=cancel value="取消"></p>
</form>

IDL 屬性 action 必須反映同樣名稱的內容屬性,除非在獲取的時候內容屬性不存在或是屬性的取值為空字串,在這種情形下必須回傳文件的位置。IDL 屬性 target 必須反映同樣名稱的內容屬性。IDL 屬性 methodenctype 必須反映同樣名稱的內容屬性,受限於已知取值。IDL 屬性 encoding 必須反映內容屬性 enctype限制於已知取值。IDL 屬性 noValidate 必須反映內容屬性 novalidate。IDL 屬性 formAction 必須反映內容屬性 formaction,除非在獲取的時候內容屬性不存在或是屬性的取值為空字串,在這種情形下必須回傳文件的位置。IDL 屬性 formEnctype 必須反映內容屬性 formenctype限制於已知取值。IDL 屬性 formMethod 必須反映內容屬性 formmethod限制於已知取值。IDL 屬性 formNoValidate 必須反映內容屬性 formnovalidate。IDL 屬性 formTarget 必須反映內容屬性 formtarget

提交元素方向性

表單控制項元素上的表單控制項 dirname 屬性可以用來提交此元素的方向性,並可以用來命名表單提交時含有這個值的欄位。若網頁作者欲設定此屬性,值必不可為空字串。

文字欄位的選取 API

約束

表單提交

介绍

此章節不具有規範性

當使用者提交表單時,使用者代理會根據編碼型別將表單的資料專換成相應的結構,並使用給定的方法將該結構送至行動指定的目的地。

拿以下的表單來當例子:

<form action="/find.cgi" method=get>
 <input type=text name=t>
 <input type=search name=q>
 <input type=submit>
</form>

若使用者在第一個欄位輸入 "cats",在第二個輸入 "fur",並按下提交按鈕,則使用者代理會載入 /find.cgi?t=cats&q=fur

另一外面,若以下表單:

<form action="/find.cgi" method=post enctype="multipart/form-data">
 <input type=text name=t>
 <input type=search name=q>
 <input type=submit>
</form>

有了同樣的使用者輸入,提交的結果不太一樣:使用者代理會對給定的網址 HTTP POST 以下的實體內容:

------kYFrd4jNJEgCervE
Content-Disposition: form-data; name="t"
cats
------kYFrd4jNJEgCervE
Content-Disposition: form-data; name="q"

fur
------kYFrd4jNJEgCervE--
隱式提交
使用者代理可指定表單的一個按鈕為表單的預設按鈕預設按鈕應該是以樹排序算的第一個主表單是該表單的提交按鈕
Error creating thumbnail: Unable to save thumbnail to destination
不過使用者代理可選另一個適合特定平台按鈕。若平台支援使用者啟動隱式表單提交(舉例來說,在一些平台上,在一個文字欄位有焦距的時候按「輸入鍵」會啟動隱式表單提交)
Error creating thumbnail: Unable to save thumbnail to destination
,則隱式提交必須觸發預設按鈕啟動行為
Error creating thumbnail: Unable to save thumbnail to destination
注:因此,若預設按鈕處於停用狀態,則當使用者使用隱式提交機制時,使用者代理不會提交表單。(處於停用狀態的按鈕沒有啟動行為。)
若表單沒有提交按鈕,則使用者代理必須在隱式提交發生時由 form 元素提交 form 元素自己。
Error creating thumbnail: Unable to save thumbnail to destination

表單重置

交互元素

链接

介绍

链接是一种概念结构,由a, area, 以及link元素创建,表示两个资源之间的联系,其中一个是当前文档,有HTML中有两种链接:

到外部资源的链接

这些是到那些可以用于增强当前文档的资源的链接,通常由用户代理自动地处理。

超链接

这些是到那些用户代理可以暴露给用户,这样用户可以指使用户代理导航到这些资源,比如在浏览器中访问它们或者下载它们。

由a和area元素创建的链接

跳转至超链接

链接类型

没有特指元素的惯用语

用选择器匹配HTML元素

网页加载过程

此部分介绍的功能最直接的应用到 Web 浏览器。话虽如此,除了另行规定之外,此部分需求定义应用于所有用户代理,无论这些用户代理是否为 Web 浏览器。


浏览上下文

一个浏览上下文是一个将 Document 对象呈现给用户的环境。

注:在一个 Web 浏览器内,一个标签页或窗口常包含一个浏览上下文,如一个 iframe 或一个 frameset 内的若干 frame

每个浏览上下文都有一个对应的WindowProxy 对象。

一个浏览上下文都有一个会话历史,它列出了这个浏览上下文Document 对象以呈现过的,正在呈现的,或将要呈现的内容。无论何时,Document 这个概念在每个浏览上下文中,都特指为激活的文档对象

每一个 Document 都关联一个 Window 对象。一个浏览上下文中的 WindowProxy 对象转发所有内容到浏览上下文中的激活文档Window 对象。

注:通常情况下,Window 对象一对一映射到 Document 对象。在特定情况下,在同一个浏览上下文Window 可以被重用来展示第二个 Document,这样的映射就是二对一。这种情况发生在由于替代激活,一个浏览上下文从最初的 about:blank Document 导航到另一个文档。
注:一个Document并不一定就有一个浏览上下文与之关联。尤其是,数据挖掘工具或许从不实例化浏览上下文。

一个浏览上下文可以拥有一个浏览上下文创建者,并对它的创建者负责。如果以一个浏览上下文拥有父级浏览上下文, 那就是说父级内容是浏览上下文创建者。否则如果浏览上下文拥有开启的新浏览器内容,那就是说本身是浏览上下文创建者。否则,说明这个浏览上下文不拥有浏览上下文创建者

如果某个浏览上下文 A 拥有浏览上下文创建者,那么它的 Document 就是浏览上下文创建者在创建 A 之时由创建文档建立的激活文档

当首次创建浏览上下文,它必须在会话历史中创建仅有的一个 Document,其地址是 about:blank,即标记为一个 HTML文档,其字符编码为 UTF-8。这个 Document 必须有唯一一个 HTML 节点,此节点必须有唯一一个 BODY 子节点。

注:如果浏览上下文创建了具体的立即导航,那么最初的导航将会被替代激活

Document 被创建后设置 about:blank Document来源,如果这个新的 浏览上下文拥有它的浏览上下文创建者,那么这个 about:blank Document 源自它的 文档创建者来源。否则,about:blank Document 来源于新浏览上下文被创建时分配的全局唯一标识符。

嵌套的浏览上下文

某些元素(例如:iframe 元素)可以生成更多的浏览上下文实例。这被称作嵌套的浏览上下文。 如果一浏览上下文 P 存在一个 Document D 和一个元素 E,这个元素内又嵌套另一个浏览上下文 C , 那么就可以说 C 通过 D 嵌套,并且 E 可以说是 C 的 浏览上下文容器。 如果这个浏览上下文容器 元素 E 在 Document D 之内,则 P 可以被称为 C 的父浏览上下文,同时 C 可以被称作 P 的一个子浏览上下文。否则,这个嵌套的浏览上下文 C 就没有父浏览上下文

一个浏览上下文 A 被认为是另一个浏览上下文 B 的祖先,如果 A 存在一个子浏览上下文 A', 这个子浏览上下文自身又是 B 的祖先。如果存在 A 的子浏览上下文 P, 它就是 B 的父浏览上下文

一个浏览上下文没有嵌套的浏览上下文也自身也没有父浏览上下文,那么它就是所有浏览上下文的顶级浏览上下文与祖先浏览上下文

父浏览上下文传递祖先浏览上下文列表闭包给嵌套的浏览上下文

一个 Document d 的 后代浏览上下文(有序)列表由以下算法返回:

  1. 建立一个空列表;
  2. Document d 中,根据元素的嵌套树顺序,遍历 d 中每一个通过元素嵌套的 子浏览上下文,执行以下子步骤:
    1. 追加子浏览上下文到列表清单。
    2. 追加子浏览上下文激活文档后代浏览上下文列表到列表清单。
  3. 返回构造完成的列表。

当一个 Document 在它的浏览上下文内是激活文档时,它被称为完全激活。它的浏览上下文要么是一个顶级浏览上下文,要么它有一个父浏览上下文,并且这个 Document 通过嵌套使它自身完全激活

因为它们是通过元素嵌套,在他们的父浏览上下文子浏览上下文总是针对特定的 Document。用户代理必须不允许用户在 Document 没有完全激活时与元素的子浏览上下文交互。

嵌套的浏览上下文可以有一个无缝浏览上下文标识设置,如果它是通过 iframe 元素和一个 seamless 属性嵌入。

注:嵌套的浏览上下文可能会被从它的父浏览上下文中取出(例如:从 Document 中移除一个 iframe 元素)。在这种情况下,嵌套的浏览上下文父浏览上下文,但它仍具有相同的浏览上下文容器,目前仍在通过该元素的 Document 嵌套。这种嵌套的浏览上下文不是一个顶级浏览的上下文,并且不能保证 Document完全激活的。此外,如果浏览上下文容器(如一个 iframe )移动到另一个 Document,那么它嵌套的浏览上下文父浏览上下文将会改变。
导航在 DOM 中嵌套的浏览上下文
 此框内容是非标准的,执行要求在此框下面给出。
window . top
返回作为 顶级浏览上下文WindowProxy 对象。
window . parent
返回作为 父浏览上下文WindowProxy 对象。
window . frameElement
返回作为 浏览上下文容器Element 对象。
如果没有返回 null。
在跨域情况下抛出 SECURITY_ERR 异常。

浏览上下文 b 内 DocumentWindow 对象的 top IDL 属性,必须返回它的 顶级浏览上下文WindowProxy 对象(如果它本身就是一个顶级浏览上下文,这将返回它自身的 WindowProxy 对象),如果它有的话,或除非它拥有自己的 WindowProxy 对象(例如,如果它是一个分离的 #nested-browsing-context嵌套浏览上下文)。

浏览上下文 b 内 DocumentWindow 对象的 parent IDL 属性,必须返回它的 父浏览上下文 ,如果它有的话有(即 b 是一个 子浏览上下文),或除非 浏览上下文 b 拥有自身的 WindowProxy 对象(即,如果它是顶级浏览上下文或分离的嵌套浏览上下文)。

获取一个 Dcoument d 的 Window 对象中的 frameElement IDL 属性,必须执行以下算法:

  1. 如果 d 不是在一个嵌套的浏览上下文中,返回 null 并中止执行此后步骤。
  2. 如果 浏览上下文容器Dcoument 不具有 相同的 有效脚本源入口脚本,就抛出一个 SECURITY_ERR 异常。
  3. 否则,返回的 d 的浏览上下文容器

辅助浏览上下文

它有可能创建被关联到一个顶级浏览上下文的新浏览上下文,而不用不通过嵌套元素访问。这样的浏览上下文被称为辅助浏览上下文。辅助浏览上下文永远是顶级浏览上下文

一个 辅助浏览上下文 有一个 浏览上下文开启工具 。它是从 辅助浏览上下文 中建立的浏览上下文。

在DOM中导航辅助浏览上下文

Window 对象的 opener IDL 属性,在取值时,必须返回从当前浏览上下文中创建的浏览上下文(它是浏览上下文开启工具)的 WindowProxy 对象,如果它有的话,如果它依然有效,而且如果当前浏览上下文并没有断绝与它的开启工具的关系。在设置时,如果新的值是null,则当前浏览上下文必须断绝与其开启工具的关系,如果新值是其他任何值,则用户代理必须忽略这个新值。

次级浏览上下文

用户代理可以支持次级浏览上下文,它是一个浏览上下文,除了主要的内容区域外,是用户代理接口的构成部分。

安全性

如果符合下列条件之一,浏览上下文 A 允许访问 浏览上下文 B :

  1. A 的 当前文档 与 B 的 当前文档同源 的,或
  2. 浏览上下文 A 是具有 顶级浏览上下文嵌套浏览上下文,并且它的 顶级浏览上下文 是 B,或
  3. 浏览上下文 B 是一个 辅助浏览上下文,并且 A 被 允许访问 B 的 浏览上下文开启工具,或
  4. 浏览上下文 B 不是一个 顶级浏览上下文,但存在一个 B 的 祖先浏览上下文,其 当前文档 与 A 的 当前文档同源 的(可能就是 A 自身)。

如果元素的 Dcoument 的浏览上下文是一个 顶级浏览上下文,或如果元素的所有 祖先浏览上下文当前文档 来源 与元素 Dcoument来源均是 同源 的,元素就拥有浏览上下文来源范围。如果元素拥有 浏览上下文来源范围 则它的值是这个元素的 Dcoument 来源

浏览上下文分组

每一个浏览上下文定义了一个或多个直接可访问浏览上下文的列表。它们是:

  1. 浏览上下文本身。
  2. 所有浏览上下文子浏览上下文
  3. 浏览上下文父浏览上下文
  4. 所有的浏览上下文已经为他们的浏览上下文开启工具中的浏览上下文
  5. 浏览上下文浏览上下文开启工具启工具。

所有浏览上下文所传递的闭包可以直接可访问浏览上下文相关浏览上下文的一个单元

每个相关浏览上下文单元再进一步划分为最少数量的组群,这样每个组的每个成员的当前文档都具有一个有效的脚本源,通过操作相应的 document.domain 属性,使它可以等同于组的其他成员,但不能被用作等同于其他组的成员。每一个组是涉及同类源的浏览上下文单元

每个相关的同类源浏览上下文单元可以有一个入口脚本用于被获取,除其他事项外,脚本的基础URL用以确定在他们的相关的同类源浏览上下文单元中的脚本运行中的相对URL定位。起初,没有入口脚本。它被修改算法为跳到一个代码入口点

浏览上下文名称

浏览上下问可以有一个浏览上下文名称。默认情况下,一个浏览上下文没有名称(它的名称没有被设置)。

一个有效的浏览上下文名称是任意以不为U+005F下划线字符开始的至少有一个字符的字符串(名称以下划线开始是用于保留特殊的关键字)。

一个有效的浏览上下文名称或关键字可以是任意字符,无论他是一个有效的浏览上下文名称或是匹配如下中一个 大小写不敏感的 ASCII 字符串: _blank, _self, _parent, 或 _top。


选择浏览内容浏览上下文名称的规则如下。该规则假定他们正应用于一个浏览上下文中。

  1. 如果给定的浏览上下文的名称是空字符串或 _self,则选择浏览内容必须是当前的。

如果给定的浏览上下文名称是 _self,那么这就是一个明确的自导航覆盖,该无缝浏览上下文标志的覆盖行为设置于无缝属性的 iframe 元素之上。

  1. 如果给定的浏览上下文名称是 _parent,然后选择的浏览上下文必须是当前的父浏览上下文。除非在一个父浏览上下文也没有的情况下,选择的浏览上下文必须是当前的浏览上下文。
  2. 如果给定的浏览上下文名称是 _top,然后选择的浏览上下文必须是当前的一个顶级浏览上下文,如果不存在顶级浏览赏析文,那么应当使用当前的浏览上下文。
  3. 如果给定的浏览上下文名称不是 _blank ,并且已存在的浏览上下文名称与给定的浏览上下文名称相同,并且当前浏览上下文允许被导航到那个浏览上下文,并且用户代理确定了这两个浏览上下文足够相关,如果它们相互到达,则浏览上下文必须选择其一。如果有多个匹配的浏览上下文,用户代理应以一些任意连贯的方式选取其中一个,如最近打开的,最近专注的,或关系更为密切的。

如果浏览上下文选择了此步到当前的浏览上下文,那么这也是一个明确的自导航覆盖

  1. 否则,一个新的浏览上下文被请求,并且会发生什么情况将取决于用户代理的配置和/或能力:

如果当前浏览上下文内,当它的活动文档被创建时,沙箱导航浏览上下文标志被设置。

用户代理可提供创建一个新的顶级浏览上下文或重用现有的顶级浏览上下文。如果用户采用其中之一,则指定的浏览上下文必须选择一个(浏览上下文的名字为没有设置成给定的浏览上下文名称)。

如果用户代理处于这种情况下有这样的配置,它会创建一个新的浏览上下文,并且浏览上下文被要求遵循一个超链接的组成部分,其链接类型包括 noreferrer 关键字

一个新的顶级浏览上下文必须被创建。如果给定的浏览上下文名称不为 _blank,则新的顶级浏览上下文必须给定浏览上下文名称(否则它没有名字)。所选择浏览内容必须是新的浏览上下文。

注:如果是立即被导航,则导航将完成替代激活

如果用户代理存在此类配置,在这种情况下它会创建一个新的浏览上下文并且不应用 noreferrer 关键字。

必须创建一个新的具有#opener-browsing-context浏览上下文开启器辅助浏览上下文。如果给定的浏览上下文的名称不为_blank,那么新的辅助浏览上下文的名称必须是给定的浏览上下文的名称(否则它没有名字)。所选择浏览上下文必须是这个新的浏览上下文。

注:如果是立即被导航,则导航将完成替代激活

如果用户代理存在此类配置,在这种情况下将重用当前的浏览上下文。

所选择浏览上下文为当前浏览上下文。

如果用户代理存在此类配置,在这种情况它不会找到浏览上下文。

所选择浏览上下文必须一个都没有。

用户代理实现被鼓励使用一种方式,即使用者设定用户代理始终重用当前浏览内容。

Window对象

[可更替命名的属性]
interface Window
Error creating thumbnail: Unable to save thumbnail to destination
{
  // 当前浏览上下文
  只读属性 WindowProxy window;
  只读属性 WindowProxy self;
  只读属性 Document document;
      属性 DOMString name; 
  [PutForwards=href] 只读属性 Location location;
  只读属性 History history;
  [可更替] 只读属性 Barprop locationbar;
  [可更替] 只读属性 Barprop menubar;
  [可更替] 只读属性 Barprop personalbar;
  [可更替] 只读属性 Barprop scrollbars;
  [可更替] 只读属性 Barprop statusbar;
  [可更替] 只读属性 Barprop toolbar;
  void close();
  void stop();
  void focus();
  void blur();

  // 其它浏览上下文
  [可更替] 只读属性 WindowProxy frames;
  [可更替] 只读属性 unsigned long length;
  只读属性 WindowProxy top;
      属性 WindowProxy opener;
  只读属性 WindowProxy parent;
  只读属性 Element frameElement;
  WindowProxy open(in optional DOMString url, in optional DOMString target, in optional DOMString features, in optional 
DOMString replace);
  getter WindowProxy (in unsigned long index);
  getter any (in DOMString name);

  // 用户代理
  只读属性 Navigator navigator; 
  只读属性 ApplicationCache applicationCache;

  // 用户提示
  void alert(in DOMString message);
  boolean confirm(in DOMString message);
  DOMString prompt(in DOMString message, in optional DOMString default);
  void print();
  any showModalDialog(in DOMString url, in optional any argument);

  // 事件句柄 IDL 属性
      属性 函数 onabort;
      属性 函数 onafterprint;
      属性 函数 onbeforeprint;
      属性 函数 onbeforeunload;
      属性 函数 onblur;
      属性 函数 oncanplay;
      属性 函数 oncanplaythrough;
      属性 函数 onchange;
      属性 函数 onclick;
      属性 函数 oncontextmenu;
      属性 函数 oncuechange;
      属性 函数 ondblclick;
      属性 函数 ondrag;
      属性 函数 ondragend;
      属性 函数 ondragenter;
      属性 函数 ondragleave;
      属性 函数 ondragover;
      属性 函数 ondragstart;
      属性 函数 ondrop;
      属性 函数 ondurationchange;
      属性 函数 onemptied;
      属性 函数 onended;
      属性 函数 onerror;
      属性 函数 onfocus;
      属性 函数 onhashchange;
      属性 函数 oninput;
      属性 函数 oninvalid;
      属性 函数 onkeydown;
      属性 函数 onkeypress;
      属性 函数 onkeyup;
      属性 函数 onload;
      属性 函数 onloadeddata;
      属性 函数 onloadedmetadata;
      属性 函数 onloadstart;
      属性 函数 onmessage;
      属性 函数 onmousedown;
      属性 函数 onmousemove;
      属性 函数 onmouseout;
      属性 函数 onmouseover;
      属性 函数 onmouseup;
      属性 函数 onmousewheel;
      属性 函数 onoffline;
      属性 函数 ononline;
      属性 函数 onpause;
      属性 函数 onplay;
      属性 函数 onplaying;
      属性 函数 onpagehide;
      属性 函数 onpageshow;
      属性 函数 onpopstate;
      属性 函数 onprogress;
      属性 函数 onratechange;
      属性 函数 onreadystatechange;
      属性 函数 onredo;
      属性 函数 onreset;
      属性 函数 onresize;
      属性 函数 onscroll;
      属性 函数 onseeked;
      属性 函数 onseeking;
      属性 函数 onselect;
      属性 函数 onshow;
      属性 函数 onstalled;
      属性 函数 onstorage;
      属性 函数 onsubmit;
      属性 函数 onsuspend;
      属性 函数 ontimeupdate;
      属性 函数 onundo;
      属性 函数 onunload;
      属性 函数 onvolumechange;
      属性 函数 onwaiting;
};
Window implements EventTarget;

安全性

创建和按浏览上下文名称导航的API

访问其他浏览上下文

访问命名窗口对象

垃圾收集和浏览上下文

浏览器界面元素

WindowProxy对象

放宽同源限制

会话历史和导航

浏览上下文的会话历史

History 接口

Location 接口

安全性

会话历史实现说明

浏览网页

在文档之间导航

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

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

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

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

页面加载图像的处理模型

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

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

导航到一个片段标识符

穿越历史

事件定义

卸载文档

事件定义

中止文档加载

离线Web应用程序

简介

此章节不具有规范性

事件摘要

本章节不具有规范性

当用户访问一个声明了manifest的页面,浏览器会尝试更新缓存。它会遍历这份清单,如果发现该清单自上一次访问后发生了改变,它将重新下载此manifest上列出的资源并重新缓存它们。

-->
注:浏览器在请求manifest清单中的资源时,会为请求的http头带上该资源保存在本地Last-Modified和Etag,服务器收到请求后检查服务器上的资源是否已经被修改过了,如果没有被修改过则返回http 304,浏览器就会认为缓存在本地的该资源与服务器上最新的资源是完全相同的。需要注意的是:如果服务器上的资源都更新了,但是manifest文件本身没有更新的话,本地的资源是不会被更新的。对web开发者来说,建议在manifest文件中维护一个版本号,当你修改了manifest清单中的资源时,必须修改manifest文件使得浏览器更新资源。

在这个过程中,在ApplicationCache对象上会触发一系列的事件,来使脚本保持缓存更新的状态,以便用户可以得到适当地通知。这些事件如下:

事件名称 接口 何时触发 下一个事件
checking Event 当user agent检查更新时,或第一次下载manifest清单时,它往往会第一个被触发 -->
注:无特殊说明,这里user agent指浏览器。
noupdate,downloading,obsolete,error
noupdate Event Manifest清单没有变化 这将是最后一个被触发的事件
downloading Event User agent发现manifest清单有更新,或第一次下载清单上列出的资源 progress,error,cached,updateready
progress ProgressEvent User agent正在下载manifest清单上列出的资源 progress,error,cached,updateready
cached Event Manifest清单上列出的资源都已被下载,且已被应用程序所缓存 这将是最后一个被触发的事件
updateready Event Manifest清单上列出的资源都已被重新下载,script脚本可以通过swapCache()来切换到新的缓存 这将是最后一个被触发的事件
obsolete Event Manifest清单文件返回404或410页面时,应用程序将删除缓存 这将是最后一个被触发的事件
error Event Manifest返回404或401时,应用程序放弃尝试缓存 这将是最后一个被触发的事件
Manifest没有变化,但页面所引用的manifest可能下载失败了
遍历manifest清单上列出的资源时发生了致命错误
Manifest在应用程序进行更新时发生了改变 User agent将在瞬间再次尝试遍历该清单文件

应用程序缓存

应用程序缓存(application cache)是一组由一些缓存资源组成的集合:

  • 一个或多个资源(包括它们在不同通道的元数据,如HTTP头,如果有的话),它们通过URL进行识别,分属于以下一个(或多个)类别:
    主体项目(Master entries)
    注:这些文档被添加到缓存中是因为浏览环境上下文(browsing context)导航(navigated)到那些文档中,并且,这些文档被表明,这是它们的缓存,因为它正在使用。通俗来说,a.html中html标签含有manifest属性,那么a.html就是这个manifest中的Master entry,当然,如果是a.html中有iframe标签,并且iframe标签的src属性是b.html,而b.html含有manifest属性,那么该manifest的Master Entry是b.html而不是a.html。manifest属性。
    缓存清单(Manifest)
    注:这是与在主体项目html元素的manifest属性中给出的URL相对应的资源。它会在application cache对象的download process过程中被取出并进行处理。所有的主体项目(master entries)都与manifest同源(same origin)(这里同源意思是master entry和manifest的url具有相同的scheme、host和port。)
    明确的项目(Explicit entries)
    注:这些都是在缓存清单明示区域(explicit section)中列出的资源
    备用的项目(Fallback entries)
    注:这些都是在缓存清单备用区域(fallback section)中列出的资源

    明确的项目(explicit entries)备用的项目(fallback entries)可以被标记为外来的(foreign),这意味着,它们有一个manifest属性,但它却并不在当前缓存清单中。

    注:一个URL可以标记为不同的类型,因此一个条目可以最终被归为多个项目。如,一个条目可以同时做为manifest项和explicit项,如果该清单被列在一个manifest文件中的时候(这里意思是如果a.manifest中的explicit项列出了a.menifest本身,此时a.manifest即是manifest又是explicit)
  • 零个或多个备用命名空间(fallback namespaces),每个都映射到一个备用的项目(fallback entries)
    注:这些资源的URL都采用前缀匹配模式(prefix match patterns),如果可能的话,它们会从网络中取到,如果网络不可用的话,则会被备用项目(fallback entries)中列出的URL所取代。每个命名空间的URL都与当前的缓存清单同源(same origin)
  • 零个或多个来自在线白名单命名空间(online whitelist namespaces)的URL。
    注:它们都会采用前缀匹配模式,且,被申明的URL,user agent从来不从缓存中去加载它们,而是尝试从网络上获取。
  • 在线白名单通配符标记(online whitelist wildcard flag),无论是open的还是blocking的。
    注:open的状态表示,所有没被列出在明示区域(explicit section)的URL,都当作在线白名单命名空间(online whitelist namespaces)来对待;blocking的状态表示,所有没被列出在明示区域的URL,都当作无效处理。

每个应用程序缓存(application cache)都有一个完整性标记(completeness flag),其状态为complete或incomplete。


应用程序缓存组(application cache group)就是一组应用程序缓存(application cache),它们由manifest资源的绝对URL(absolute URL)进行识别,用来填充该组中的缓存。

注:应用程序缓存组可以看做是一个manifest中所有resources构成的cache在不同时间维度的集合,为什么需要这个group呢?原因是一个manifest可以被多个页面引用,比如a.html和b.html的html标签的manifest属性都是test.manifest,我们需要为每个页面维护对应的cache,某个时刻,manifest发生了变化,而用户刷新了b.html页面,这个时候浏览器会将最新的cache下载,但是a.html并没有被用户刷新,因此浏览器不能简单丢掉a.html页面对应的cache,所以cache group是很有必要的,这也就解释了applicationCache.swapCache()的作用了,其实就是将a.html对应的cache置换为group中当前最新的cache,因此我们要记住的是:group是不同时期的cache集合。

Application cache总是以后来创建的做为新的(newer),换句话说,application caches在一个application cache group中是按时间先后排序的。

application cache group中,只有最新的application cache完整性标记(completeness flag)值为“不完整”的(incomplete);其他的都为“完整的”(complete)。

每个应用程序缓存组(application cache group)都有一个更新状态(update status),其值为以下其中一种:idle, checking, downloading

符合的应用程序缓存(relevant application cache)是在该缓存组(group)最新的(newest)且被标记为“已完成”(complete)的那个application cache

每个应用程序缓存组(application cache group)都有一个未定的主体项目清单(list of pending master entries)。在该清单中的每一项都由一个资源和一个对应的Document对象组成。它们用于在应用缓存下载过程(application cache download process)中确认新的主体项目是否被缓存,即使在它们已经被下载,且应用程序缓存组(application cache group)应用缓存下载过程(application cache download process)已经执行时。

-->
注:list of pending master entries译作“未定的主体项目清单”不太好理解,“待下载的主体项目列表”如何?我详细解释一下,前面说过如果a.html中html标签的manifest属性为a.manifest,那么a.html为a.manifest的master entry,考虑这种场景:a.html b.html c.html页面的html标签的manifest属性都为a.manifest,并且这3个页面在浏览器中同时加载,假定a.html开始了manifest文件下载和解析过程,接着b.html和c.html也开始解析manifest,此时a.html b.html c.html都会被添加到manifest的list of pending master entries,当manifest清单中的所有资源都成功下载到本地,浏览器会将list of pending master entries中的所有页面添加到本地缓存,将list of pending master entries添加到本地缓存的行为规范并没有定义,可以从内存中取页面数据,也可以对每个页面单独发起网络请求,不同的浏览器实现方式可能不同。

应用程序缓存组(application cache group)可以被标记为作废的(obsolete),即在检查已存在的application cache group时,必须忽略它们。


缓存宿主(cache host)是一个Document对象或是一个SharedWorkerGlobalScope对象,它可以与一个application cache关联。[WEBWORKERS]

-->
注:总所周知,DOM中的Document是DOM tree的根节点;当然,带有manifest属性的html如果是被内嵌在iframe中的话,该manifest对应的Document就是iframe中html的根节点Document

Document对象在初始时并未与application cache关联,而是在一个较早的页面加载过程中,当进到in the parser过程,在navigation这块,由cache selection引发,从而使得它们进行关联。

SharedWorkerGlobalScope对象在创建之后可以与一个application cache进行关联。[WEBWORKERS]

每个缓存宿主(cache host)都有一个与之关联的ApplicationCache对象。


在不同的应用程序缓存组(application cache group)中的诸多application cache,可以包含相同的资源,比如,如果该缓存清单指向到那些资源,如果user agent要从符合的应用程序缓存(relevant application caches)清单中选择一个应用程序缓存(select an application cache),它必须使用那些用户最期望的资源,考虑以下因素:

  • 哪些应用程序缓存经常被更新
  • 哪些应用程序缓存是用来列出那些用户决定需要检查的新资源,且
  • 哪些应用程序缓存是用户偏好的

匹配备用命名空间(matches a fallback namespace)的URL,如果存在一个符合的应用程序缓存(relevant application caches),它的manifest清单的URL与某个请求的URL同源(same origin),且,该请求的URL有一个前缀匹配(prefix match)备用命名空间(fallback namespace)。如果多个备用命名空间匹配到了同一个URL,那么,最长的那条会是最终匹配的。一个URL在寻找备用命名空间的时候,一次可以匹配到多个应用程序缓存,但在每个缓存中,它只能匹配一个命名空间。

如果一个manifest:http://example.com/app1/manifest

中申明了如下备用命名空间:http://example.com/resources/images ,用户在访问HTTP://EXAMPLE.COM:80/resources/images/cat.png 的时候,user agent将通过http://example.com/app1/manifest

决定它的应用程序缓存,因为它包含一个与请求URL匹配的命名空间。

缓存清单语法

Manifest清单示例

本章节不具有规范性

写缓存清单

Manifest文件必须是一个MIME typetext/cache-manifest类型的存在。所有MIME typetext/cache-manifest的文件,必须遵循应用程序缓存清单的语法,就像本章节所描述的那样。

应用程序缓存清单是一个文本文件,采用UTF-8编码方式。文件数据是基于“行”的。换行必须表现为一对U+000A的换行符(LF)与U+000D的回车符(CR)或是一对U+000D的回车符(CR)和U+000A的换行符(LR)。[RFC3629]

注:这是对RFC2046的有意违背(willful violation),因为它要求所有 text/* 类型的文本只得遵循CRLF换行符。无论如何,这种需求已经是过时的;通常情况下,使用CR,LF和CRLF的换行符是被支持的,不过的确在有时候,有些文本编辑器不支持CRLF的换行符。[RFC2046]

应用程序缓存清单文件的第一行必须由此构成:"CACHE"字符串,然后是一个U+0020的空格,接着是字符串"MANIFEST",后面跟着一个U+0020的空格,或是一个U+0009的tab制表符,然后是一个U+000A的换行符(LF)或是一个U+000D的回车符。第一行之前,也可以是一个U+FEFF的字节顺序标记符(BOM)。如果在第一行发现了其他任何文本,它都会被忽略。

接下去如果有其他的行的话,它们必须是以下其中的一种:

空行
空行必须只能由零个或多个U+0020的空格和U+0009的tab制表符组成。
注释
注释行必须由此构成:零个或多个U+0020的空格和U+0009的tab制表符,接着是一个U+0023的数字记号符(#),然后是零个或多个非U+000A的换行符(LF)和U+000D的回车(CR)的字符。
注:注释必须有它们自己的行,如果它们出现在一个有URL的行内,"#"会被误认为是该地址片段标识符的一部分。
段落主题
段落主题会改变当前区域(的作用范围),下面是3种段落主题:
CACHE:
切换到明示区域
FALLBACK:
切换到备用区域
NETWORK:
切换到在线白名单区域

段落主题行,必须由零个或多个U+0020的空格和U+0009的TAB制表符,加上一个出现在上面的3个段落主题名字之一(包括U+003A的冒号字符),后面跟着零个或多个U+0020的空格和U+0009的TAB制表符组成。

有意思的是,在默认情况下,当前区域(的作用范围)是明示区域(explicit section)

当前区域的数据
数据行的格式必须依赖于当前区域(的作用范围)。

如果当前区域为明示区域(explicit section)时,数据行必须由零个或多个U+0020的空格和U+0009的TAB制表符,加上一个有效的URL(valid URL)用于标识除当前缓存清单以外的资源,后面跟着零个或多个U+0020的空格和U+0009的TAB制表符组成。

如果当前区域为备用区域(fallback section)时,数据行必须由零个或多个U+0020的空格和U+0009的TAB制表符,加上一个有效的URL(valid URL)用于标识除当前缓存清单以外的资源,后面跟着零个或多个U+0020的空格和U+0009的TAB制表符,接着又是一个有效的URL(valid URL)用于标识除当前缓存清单以外的资源,最后跟着零个或多个U+0020的空格和U+0009的TAB制表符组成。

如果当前区域为在线白名单区域(online whitelist section)时,数据行必须由零个或多个U+0020的空格和U+0009的TAB制表符,加上一个有效的URL(valid URL)用于标识除当前缓存清单以外的资源或是一个单独的U+002A的星号字符(*),后面跟着零个或多个U+0020的空格和U+0009的TAB制表符组成。

在缓存清单文件中,可能包含多个区块,有些区块的内容也可能为空。

如果缓存清单的访问协议(<scheme>)https:或是另外一种数据加密传输的协议,那么在明示区域(explicit section)中的URLs必须与该缓存清单同源(same origin)

备用区域中,备用命名空间(fallback namespaces)要与一个备用页面的URLs进行关联,并且,命名空间本身需要在备用区域中给出,作为数据行中第一个URL,相应的备用页面的URL跟在后面作为第二个URL。所有其他需要被缓存的页面都应该列到明示区域中。

备用命名空间备用项目必须与当前缓存清单同源

同一个备用命名空间绝对不能重复出现。

User agent送入到在线白名单的命名空间,必须全部在在线白名单区域(online whitelist sections)中列出(那些可能需要与服务端进行交互的页面)。如果要指定所有的URLs都自动进入白名单,可以通过指定一个U+002A的星号符(*)来匹配所有的URLs。

编写缓存清单的时候,不应该让白名单中的一个命名空间包括其中的另一个命名空间,因为它们都采用前缀匹配(prefix match)

相对URLs必须是相对当前缓存清单的URL而言的。所有的这些URLs必须与当前缓存清单使用相同的协议(<scheme>)(不论是明示的还是暗示的)。

缓存清单中的URLs绝对不可以出现片段标识符(也就是说,不能出现U+0023的数字符号"#")

备用命名空间在线白名单中的命名空间都采用前缀匹配模式。

解析缓存清单
User agent在解析缓存清单的时候,必须按照以下步骤进行:
Error creating thumbnail: Unable to save thumbnail to destination
  1. User agent必须对缓存清单文件的字节流进行解码,以解析成UTF-8的格式并进行出错处理(as UTF-8,with error handling)
  2. base URL绝对路径(absolute URL)来表现此缓存清单。
  3. 明示项目(explicit entries)明示URLs(explicit URLs)初始化为一个使用绝对路径(absolute URL)的空列表。
  4. 备用项目(fallback entries)备用URLs(fallback URLs)初始化为一个备用命名空间(fallback namespaces)对应一个绝对路径(absolute URL)的空映射表。
  5. 在线白名单(online whitelist)在线白名单命名空间(online whitelist namespaces)初始化为一个使用绝对路径(absolute URL)的空列表。
  6. 在线白名单通配标识符(online whitelist wildcard flag)为blocking。
  7. "input"为缓存清单文件字节流解码后的文本。
  8. "position""input"的指针,初始化定位到第一个字符。
  9. 如果"position"定位到一个U+FEFF字节顺序标识符(BOM),那么将"position"定位到下一个字符
  10. 如果"position"所在处的字符为"CACHE",接下来是一个U+0020的空格,然后紧跟着"MANIFEST"字样,那么将"postion"定位到它们之后的下一个字符,否则,这就不是一个缓存清单;取消当前的运算规则,在检查魔法签名(magic signature)时返回失败。
  11. 如果"position"所在处的字符即不是U+0020的空格,U+0009的TAB制表符,也不是U+000A的换行符,U+000D的回车符,那么,这不是一个缓存清单;取消当前的运算规则,在检查魔法签名(magic signature)时返回失败。
  12. 这是一个缓存清单文件。当前的运算规则不能在此时返回失败(虽然虚行(bogus lines)可以被忽略)
  13. 收集字符序列(Collect a sequence of characters),U+000A的换行符或U+000D的回车符除外,忽略这些字符(第一行中,签名后的所有其他字符,通通忽略)。
  14. "mode"为"explicit"。
  15. start of line:如果"position"已经到了"input"尾,那么跳转到最后一步。否则,收集以下字符序列(collect a sequence of characters):U+000A换行符,U+000D回车符,U+0020空格,U+0009TAB制表符。
  16. 接下来,收集不包括以下字符的字符序列:U+000A换行符,U+000D回车符,令结果为该行(line)
  17. 丢弃所有出现在此行(line)最后的U+0020空格,U+0009TAB制表符。
  18. 如果此行(line)为一个空字符串,跳转到标签:"start of line"。
  19. 如果此行第一个字符是U+0023的数字标记符(#),则跳转到标签:"start of line"。
  20. 如果此行等于"CACHE:"(单词"CACHE"后面跟着一个U+003A的冒号(:)),则令"mode"为"explicit",然后跳转到标签:"start of line"。
  21. 如果此行等于"FALLBACK:"(单词"FALLBACK"后面跟着一个U+003A的冒号(:)),则令"mode"为"fallback",然后跳转到标签:"start of line"。
  22. 如果此行等于"NETWORK:"(单词"NETWORK"后面跟着一个U+003A的冒号(:)),则令"mode"为"whitelist",然后跳转到标签:"start of line"。
  23. 如果此行以U+003A的冒号(:)作为结束,则令"mode"为"unknown",然后跳转到标签:"start of line"。
  24. 这不是一个数据行也或者语法错误。
  25. position指针进入到此行,初始位置为行首。
  26. "tokens"为字符串列表,初始时为空。
  27. "position"还没有移到行尾时:
    1. "current token"为空字符串。
    2. "position"还没有移到行尾,并且,"position"所在处字符即不是U+0020的空格,也不是U+0009的TAB制表符,将指针处字符添加到"current token""position"指针移到"input"中的下一个字符
    3. "current token"添加到"tokens"列表。
    4. "position"还没有移到行尾,并且,"position"所在处字符是一个U+0020的空格,或者是一个U+0009的TAB制表符,"position"指针移到"input"中的下一个字符。
  28. "tokens"处理流程:
    ↪ 如果"mode"为"explicit"

    解析(resolve)tokens中的第一个元素,以base URL为参照;忽略剩下的。

    如果这里失败,跳转到标签:"start of line"。

    如果结果中的绝对URL(absolute URL)中包含一个与当前缓存清单不同的访问协议(<scheme>)(以忽略大小写的ASCII字符进行比较),则跳转到标签:"start of line"。如果当前缓存清单使用https:协议,或其他某种数据加密传输协议,而结果中的绝对URL与它不是同源(same origin),那么,跳转到标签:"start of line"。

    如果结果中的绝对URL包含标识片段(<fragment>),丢弃它。

    将结果中的绝对URL添加到"explicit URLs"中。

    ↪ 如果"mode"为"fallback"

    "part one""tokens"中的第一个表征,令"part tow""tokens"中的第二个表征。

    解析(resolve)"part one""part two",以base URL为参照。

    如果这里失败,跳转到标签:"start of line"。

    如果关联到"part one""part two"绝对URL(absolute URL)与当前缓存清单不同源(same origin),则跳转到标签:"start of line"。

    如果结果中的绝对URL包含标识片段(<fragment>),丢弃它。

    如果关联到"part one""part two"绝对URL(absolute URL)已经作为一个备用命名空间(fallback namespaces)出现在"fallback URLs"映射表中,则跳转到标签:"start of line"。

    否则,将关联到"part one"绝对URL(absolute URL)作为备用命名空间添加到"fallback URLs"映射表中,映射到关联到"part two"绝对URL(absolute URL),它将作为备用项目实体(fallback entry)

    ↪ 如果"mode"为"online whitelist"

    如果"tokens"中的第一项是U+002A的星号符(*),则设定"online whitelist wildcard flag"为"open",然后跳转到标签:"start of line"。

    否则,解析(resolve)"tokens"中的第一项,以base URL为参照;忽略剩下的。

    如果这里失败,跳转到标签:"start of line"。

    如果结果中的绝对URL(absolute URL)中包含一个与当前缓存清单不同的访问协议(<scheme>)(以忽略大小写的ASCII字符进行比较),则跳转到标签:"start of line"。

    如果结果中的绝对URL包含标识片段(<fragment>),丢弃它。

    将结果中的绝对URL添加到"online whitelist namespaces"中。

    ↪ 如果"mode"为"unknown"
    什么都不做,忽略这一行。
  29. 跳转到标签:"start of line"(步进到下一步,直到抵达文件尾)。
  30. 返回"explicit URLs"列表,"fallback URLs"映射表,"online whitelist namespaces""online whitelist wildcard flag"
注:通过manifest属性申明缓存清单的资源(文件),通常可以从缓存中取到,无论该资源是否出现在缓存清单中,甚至,就算它被列在了在线白名单命名空间(online whitelist namespaces)中。

如果某个资源文件被列在了明示区域(explicit section)或是备用区域(fallback section)中的一个备用项目实体(fallback entry),那么,该资源也可以从缓存中读取,不论它是否匹配到了其他的备用命名空间(fallback namespaces)在线白名单命名空间(online whitelist namespaces)的项目实体。

备用命名空间在线白名单命名空间发生覆盖时,在线白名单命名空间具有更高的优先级。

在线白名单通配标识符(online whitelist wildcard flag)会在最后去应用,仅针对那些既不匹配在线白名单命名空间也不匹配备用命名空间且没有列出在明示区域的URLs。

下载或更新应用程序缓存

当user agent被请求开始应用程序缓存下载进程(application cache download process)为一个声称要去标识一个manifest或一个应用程序缓存组application cache group绝对路径(absolute URL),它可能给定一个特别的缓存主机cache host,也可能给定一个主体项目master资源,这时,user agent必须执行以下步骤。它们通常是异步运行的,与事件循环(event loop)任务(tasks)平行。

在这其中的有些步骤中,有些仅在user agent显示缓存进程(shows caching progress)时才会被应用。对此项的支持是可选的。缓存进程UI可以由一个在user agent用户接口中的进度条或信息栏组成,或是一个遮罩弹出提示层,又或是其他的形式。确定的事件会在应用程序缓存下载过程(application cache download process)中被触发而允许脚本无视那些如接口的显示。如此的目的在于,允许web应用程序提供更多的无缝更新机制,隐藏应用缓存机制的用户的技巧。user agent可以为此显示一个独立的用户接口,不过,不推荐在应用程序取消相关事件时显示主要的更新过程通知。

注:这些事件被延时到load事件触发后才被执行

应用程序缓存下载过程(application cache download process)步骤如下:

  1. 可选,等待,直到通过用户授权开始应用程序缓存下载过程(application cache download process),且user agent确认网络可用。这可能包括在用户明确该站点选用缓存前,或者需要向用户询问授权前,什么都不做。在这时,算法规则永远不会被通过。(当前步骤特意为那些运行在有空间限制或隐私高度敏感的user agent环境而设计)
  2. 自动地,为了避免竞态条件(race conditions),需要执行以下子步骤:
    1. 选择合适的子步骤:

      ↪ 如果这些步骤是通过一个绝对路径调用的用来识别一个应用程序缓存清单

      "manifest URL"为该绝对地址(absolute URL)

      如果通过该缓存清单地址(manifest URL)有找到应用程序缓存组(application cache group),则为此缓存清单地址(manifest URL)创建一个新的应用程序缓存组(application cache group),初始化时,里边没有应用程序缓存。在接下来的算法规则中会创建一个。

      ↪ 如果这些步骤是通过一个应用程序缓存组(application cache group)调用的

      "manifest URL"为该绝对地址(absolute URL),用于识别应用程序缓存组(application cache group)中要更新的缓存清单

      如果应用程序缓存组(application cache group)是被废弃的(obsolete),则取消当前应用程序缓存下载进程(application cache download process)实例。这会发生在有些算法实例在当前的运算等待上面的第一步时发现缓存清单返回404或410的情况下。

    2. "cache group"为通过"manifest URL"识别到的那个应用程序缓存组(application cache group)
    3. 如果这些步骤是被一个主体(master)资源调用的,则添加该资源,顺着该资源的Document,缓存该组的未定的主体项目列表(list of pending master entries)
    4. 如果这些步骤是被一个缓存主机(cache host)调用的,且缓存组(cache group)状态(status)为"checking"或者"downloading",则发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)checking。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent正在检查,看是否能够下载该应用程序。
    5. 如果这些步骤是被一个缓存主机(cache host)调用的,且缓存组(cache group)状态(status)为"downloading",则同样发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)downloading。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,应用程序正在被下载。
    6. 如果缓存组(cache group)状态(status)为"checking"或者"downloading",则取消当前的应用缓存下载过程(application cache download process)实例,作为正在进行的更新。
    7. 缓存组(cache group)状态(status)设置为"checking"。
    8. 为每个缓存主机(cache host)关联的一个缓存组(cache group)中的应用程序缓存(application cache)发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)checking。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent正在检测更新的有效性。
    注:剩下的步骤全部异步执行

    如果缓存组(cache group)内已经有一个应用程序缓存(application cache),则,进入升级尝试(upgrade attempt),否则,进入缓存尝试(cache attempt)

  3. 如果这是一个缓存尝试(cache attempt),则此运算是被一个缓存主机(cache host)调用的;发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)checking。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent正在检测更新的有效性。
  4. 读取缓存清单(fetching the manifest):以同步标识(synchronous flag)的设定来读取来自"manifest URL"的资源,令"manifest"为该资源。

    如果该资源是一个被标记为MIME type text/cache-manifest的文件

    Error creating thumbnail: Unable to save thumbnail to destination
    ,则按缓存清单解析规则(rules for parsing manifests)来解析"manifest",得到一个清单:明示项目(explicit entries)备用项目(fallback entries)和映射到它们的备用命名空间(fallback namespaces)在线白名单项目(online whitelist)和一个在线白名单通配标识符(online whitelist wildcard flag)的值。

  5. 如果读取缓存清单(fetching the manifest)返回404或410的响应或类似的(or equivalent)失败,则运行以下子步骤:
    1. 缓存组"cache group"标记为作废的(obsolete)。这个缓存组不在以任何为关联到该缓存组中某个应用程序缓存(application cache)Document对象处理以外的目的而存在。
    2. "task list"为一个空的任务(tasks)列表。
    3. 为关联到缓存组(cache group)应用程序缓存(application cache)的每个缓存主机(cache host),创建一个任务(task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)obsolete,它会被加入到任务列表(task list)。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,此应用程序不再能够离线使用。
    4. 为每个在缓存组未定的主体项目列表(list of pending master entries)中的实体,创建一个任务(task),在Document缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)error(不是obsolete),如果这里还有一个的话,将它加入到任务列表(task list)。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent为此应用程序离线使用的存储失败了。
    5. 如果缓存组存在一个完整标识(completeness flag)为不完整的(incomplete)应用程序缓存,则丢弃该应用程序缓存
    6. 如果合适的话,移除用户接口表明此缓存正在更新。
    7. 缓存组status为"idle"。
    8. 为任务列表中的每个任务(task)发起一个post-load的任务队列(queue a post-load task)
    9. 取消应用程序缓存下载进程(application cache download process)
  6. 否则,如果在某些情况下(如:服务器返回其他的4xx或5xx或其他等同(or equivalent)的响应,或遇到了DNS错误,或连接超时,或用户取消了下载,或解析缓存清单失败当检测魔法签名(magic signature)时,或服务端返回一个重定向,或目标资源文件的MIME type不是text/cache-manifest类型)提取(fetching)缓存清单失败,则运行缓存失败步骤(cache failure steps)
  7. 如果这是一个升级尝试(upgrade attempt),且,新下载的缓存清单缓存组最新(newest)应用程序缓存(application cache)每字节(byte-for-byte)都一致,或服务端报出一个"304 Not Modified"或等同的(or equivalent)响应时,执行以下子步骤:
    1. "cache"缓存组最新的(newest)应用程序缓存(application cache)
    2. "task list"为一个不包含任务(tasks)的空列表
    3. 为每个缓存组未定的主体项目中的项目,等待对应的资源下载完成或失败。

      如果下载失败(如:连接超时,或用户取消了下载),则创建一个任务(tasks),在Document缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中触发一个可被取消的简单事件(fire a simple event)error,如果仍然有一个的话,将它加到任务列表(task list)。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent为此应用程序离线使用的存储失败了。

      否则,为此实体关联cacheDocument;如果它不存在,且它的实体归类为主体项目(master entry),则为此实体将资源存储到缓存。如果资源文件的URL中存在片段标识符(<fragment>),它必须从缓存中对应的实体中移除(应用程序缓存绝对不能包含一个片段标识符)。

      注:HTTP缓存规则中,为了应用程序缓存下载处理的目的,诸如:Cache-Control: no-store,这种,都会被忽略。
    4. 缓存组(cache group)中关联到应用程序缓存(application cache)的每个缓存主机(cache host),创建一个任务(task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)noupdate,将它加入到任务列表(task list)。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,此应用程序已经是最新的了。
    5. 缓存组的(cache group's)未定的主体项目清单(list of pending master entries)置空。
    6. 如果合适的话,移除用户接口表明此缓存正在更新。
    7. 缓存组状态(status)为idle。
    8. 任务列表中的每个任务(task)发起一个post-load的任务队列(queue a post-load task)
    9. 取消应用程序缓存下载进程(application cache download process)
  8. 最新缓存(new cache)缓存组中最新创建的应用程序缓存(application cache)。将它的完整标识(completeness flag)设置为不完整(incomplete)。
  9. 缓存组未定的主体项目清单(list of pending master entries)中的每个项目,关联Document新缓存(new cache)
  10. 缓存组状态(status)设置为downloading。
  11. 缓存组中关联到应用程序缓存(application cache)的每个缓存主机(cache host)发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个可被取消的简单事件(fire a simple event)downloading。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,正在下载一个新的版本。
  12. 文件列表(file list)为一个带标识的空URLs列表。
  13. 将所有通过解析manifest时从明示区域(explicit entries)中得到的URLs添加到文件列表(file list)中,并为它们每个都加上"explicit entry"标识。
  14. 将所有通过解析manifest时从备用区域(fallback entries)]]中得到的URLs添加到文件列表(file list)中,并为它们每个都加上"fallback entry"标识。
  15. 如果,这是在进行升级尝试(upgrade attempt),则将缓存组完整标识(completeness flag)为完整(complete)的那些最新的(newest)应用程序缓存(application cache)中的主体项目(master entries)的URLs,添加到文件列表(file list),并为它们每个都加上"master entry"标识。
  16. 如果文件列表(file list)中的任何一个URL出现过1次以上,则将那个URL对应的项目合并到一个,该合并后的项目具有它们之前每个所带的标识。
  17. 文件列表(file list)中的每个URL,执行以下步骤。可能会出现两个或以上的URLs并行执行的情况。
    1. 如果被处理的资源URL标识既不是"explicit entry",也不是"fallback entry",则user agent可以跳过这些URL。
      注:这是打算允许user agents去将缓存中没有列出在manifest缓存清单中的资源设置过期。通常,实现者会被敦促去使用一些方法先为那些较少使用的资源设置过期。
    2. 缓存组中关联到应用程序缓存(application cache)的每个缓存主机(cache host)发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个不可冒泡的、可被取消的、使用ProgressEvent接口的事件:progresslengthComputable属性必须设置为true,total属性必须设置为文件列表(file list)中文件的数量,loaded属性必须设置为到现在为止,文件列表(file list)中已下载和已跳过的文件数量。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,有个为更新应用程序而准备的文件正在被下载。[PROGRESS]
    3. 在同步标识(synchronous flag)和手动重定向标识(manual redirect flag)都有设置的情况下,从manifest URLURL提取(fetch)资源。如果,这是一个升级尝试(upgrade attempt),则将缓存组最新的(newest)应用程序缓存(application cache)作为HTTP缓存,且,如遵循HTTP缓存语义(如expiration, Etags等等)一般去对待该缓存。user agents也可以有其他一些同样应该被遵循的缓存。
      注:如果存在问题的资源已经因为某些其他的原因而被下载,则,已存在的下载进度有时可以用于此处,按提取(fetching)算法的定义那样
      这里有个例子,可能出现某个大的图片在WEB页面第一次呈现时被下载。它的下载符合页面上的img元素以及列在Manifest清单中的要义。根据提取(fetching)规则,该图片只需下载一次,且它可以同时用作缓存和Web页面渲染。
    4. 如果上一步失败(如:服务器返回4xx或5xx或其他同等(or equivalent)响应,或出现DNS错误,或连接超时,或用户取消下载等等),或服务器返回重定向,则先执行下面的第一步:
      ↪ 如果正在处理的URL带有"explicit entry"或"fallback entry"标识

      执行缓存失败步骤(cache failure steps)

      注:重定向在此是致命的,因为它们既可以表示为网络错误(如:一个强制的网络门户(a captive portal));也可以允许将资源添加到与之真实URLs不同的在网络模式下允许访问的URLs下,而留下孤立的项目;或者允许将资源存储到与真实URLs不同的URLs下。所有这些情况都是很严重的。
      ↪ 如果错误是404或410或其他等同(or equivalent)的HTTP响应
      跳过此资源。它将从缓存中丢弃。
      ↪ 否则
      如果该资源已被提取,则忽略从网络获得的资源,从缓存组完整性标识(completeness flag)为完整(complete)的最新的(newest)应用程序缓存(application cache)中复制资源和其元数据。

      User agents可以向遇到这些错误的用户发出一个警告以协助开发人员了解。

      注:这些规则对列出在Manifest清单中的资源发出致命错误,在有可能发生当有些资源从服务器上删除后,没有发生错误,且幸存的非清单中的资源发生了服务端错误,再将它们从缓存中移除时。
    5. 否则,提取成功。将该资源存储到新缓存(new cache)

      如果user agent不能有效存储该资源(如:引用限制),user agent可以向用户询问或尝试某些手动方式去解决问题(如:自动修剪内容到其他的缓存)。如果问题依旧,user agent必须执行缓存失败步骤(cache failure steps)

    6. 如果正在被处理的URL在文件列表中(file list)带有"explicit entry"标志,则将它归为明示项目(explicit entry)
    7. 如果正在被处理的URL在文件列表中(file list)带有"fallback entry"标志,则将它归为备用项目(fallback entry)
    8. 如果正在被处理的URL在文件列表中(file list)带有"master entry"标志,则将它归为主体项目(master entry)
    9. 作为一种优化,如果此资源是一个HTML或XML文件,且它的根元素是一个设置了manifest属性的html元素,但该属性的值是一个与正在处理的应用程序缓存的manifest URL不一致的值,则user agent应该将此项目标记为外部的(foreign)
  18. 缓存组中关联到应用程序缓存(application cache)的每个缓存主机(cache host)发起一个post-load的任务队列(queue a post-load task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中去触发一个不可冒泡的、可被取消的、使用ProgressEvent接口的事件:progresslengthComputable属性必须设置为true,totalloaded属性必须设置为文件列表(file list)中文件的数量。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,所有的文件都已下载。[PROGRESS]
  19. 备用命名空间(fallback namespaces)列表,及其映射到的备用项目(fallback entries)URLs,存储到新缓存(new cache)
  20. 在线白名单(online whitelist)中的URLs存储到新缓存
  21. 在线白名单通配标识符(online whitelist wildcard flag)的值存储到新缓存
  22. 缓存组未定主体项目列表(list of pending master entries)中的每一项,等待它们对应的资源完全下载或失败。

    如果下载失败(如:连接超时,或用户取消了下载),则执行以下步骤:

    1. 将此项目从新缓存中断开与Document的关联。
    2. 发起一个post-load的任务队列(queue a post-load task),在Document缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中触发一个可被取消的简单事件(fire a simple event)error,如果这里还有一个的话。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent为此应用程序离线使用的存储失败了。
    3. 如果这是一个缓存尝试(cache attempt),且,这是缓存组未定主体项目列表(list of pending master entries)中的最后一项,则进一步执行以下子步骤:
      1. 丢弃缓存组(cache group)和它仅有的应用程序缓存(application cache)新缓存(new cache)
      2. 如果合适的话,移除用户接口表明此缓存正在更新。
      3. 终止应用程序缓存下载进度(application cache download process)
    4. 否则,从缓存组未定主体项目列表(list of pending master entries)中移除此项。

    否则,将此项对应的资源存储到新缓存,如果它还没准备好,将它的项目归为主体项目(master entry)

  23. 再次提取缓存清单URL(manifest URL)对应的资源,设置同步标志(synchronous flag),令第二清单(second manifest)为该资源。
  24. 如果上一步因任何原因而失败,或者尝试提取一个目录,或者第二清单(second manifest)缓存清单(manifest)没有每字节(byte-for-byte)都一致,则预约一个具有相同参数的项目算法在一个短暂的延时后返回(return),且执行缓存失败步骤(cache failure steps)
  25. 否则,将缓存清单(manifest)存储到新缓存(new cache),如果它还没准备好,将它的项目归为缓存清单(the manifest)
  26. 新缓存完整性标志(completeness flag)设置为complete。
  27. 任务列表(task list)为空的任务(tasks)列表。
  28. 如果这是一个缓存尝试(cache attempt),则为缓存组中关联到应用程序缓存(application cache)的每个缓存主机(cache host),创建一个任务(task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中触发一个可被取消的简单事件(fire a simple event)cached。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,此应用程序已被缓存且可以离线使用。

    否则,如果它是升级尝试(upgrade attempt),则为缓存组中关联到应用程序缓存(application cache)的每个缓存主机(cache host),创建一个任务(task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中触发一个可被取消的简单事件(fire a simple event)updateready。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,新版本已经准备好,在页面重新载入时它将被激活。

  29. 如果合适的话,移除用户接口表明此缓存正在更新。
  30. 缓存组更新状态(update status)设置为idle。
  31. 任务列表中的每个任务(task)发起一个post-load的任务队列(queue a post-load task)

缓存失败步骤(cache failure steps)如下:

  1. 任务列表(task list)为空的任务(tasks)列表。
  2. 缓存组未定的主体项目列表(list of pending master entries)中的每一项,进一步执行以下子步骤。它们可以出现多个项目并行执行的情况。
    1. 等待此项目对应的资源下载完成或失败。
    2. 如果有一个,则解除此项应用程序缓存(application cache)Document的关联。
    3. 创建一个任务(task),在Document缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中触发一个可被取消的简单事件(fire a simple event)error。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent为此应用程序离线使用的存储失败了。
  3. 缓存组中关联到应用程序缓存(application cache)的每一个缓存主机(cache host),创建一个任务(task),在缓存主机(cache host)中的应用程序缓存(ApplicationCache)单例中触发一个可被取消的简单事件(fire a simple event)error。该事件的默认行为必须是,如果user agent显示缓存进度(shows caching progress),某些类型的用户接口的显示向用户表明,user agent为此应用程序离线使用的存储失败了。
  4. 置空缓存组未定主体项目列表(list of pending master entries)
  5. 如果缓存组有一个完整性(completeness flag)为incomplete的应用程序缓存(application cache),则丢弃此应用程序缓存
  6. 如果合适的话,移除用户接口表明此缓存正在更新。
  7. 缓存组状态(status)为idle。
  8. 如果这是一个缓存尝试(cache attempt),丢弃缓存组算法。
  9. 任务列表中的每个任务(task)发起一个post-load的任务队列(queue a post-load task)
  10. 终止应用程序缓存下载进程(application cache download process)

尝试去提取(fetch)作为应用程序缓存下载进程(application cache download process)中的一部分的资源时,可能会完成缓存击败(cache-defeating)语义,从而去避免一些陈旧的、不一致的中间缓存等问题。


User agents可以在任何时候(不带缓存主机(cache host)),为任何应用程序缓存(application cache),在后台去调用应用程序缓存下载进程(application cache download process)。这将允许user agents甚至可以在没有访问站点的时候去为了更新缓存而去保持缓存预处理。


每个Document都有一个挂起的应用程序缓存处理任务(pending application cache download process tasks)列表,用于延迟由上述算法中触发的事件,直到document的load事件被触发时才去执行。当Document被创建时,此列表必须为空。

当上面的步骤告知一个发起一个post-load的任务队列(queue a post-load task)task,且它是一个在ApplicationCache对象作为目标(target)上触发事件的任务(task),user agent必须适当执行以下步骤:

如果目标Document准备好post-load任务(if target's Document is ready for post-load rasks)
发起(queue)一个task的任务队列。
否则
task添加到目标的(target's)Document挂起的应用程序缓存处理任务(pending application cache download process tasks)

这些任务(tasks)任务源(task source)网络任务源(networking task source)

应用程序缓存的选择算法

当Document通过document和可选的manifest url调用应用程序缓存选择算法(application cache selection algorithm)时,浏览器必须执行以下列出的合适的操作:
  • 如果调用操作带有manifesturl,document是从应用程序缓存(application cache)中加载并且该url跟document所在缓存的应用程序缓存组application cache group的manifest url不相同:
    • 在document所在应用程序缓存(application cache)中将该资源标记为外部(foreign)。
    • 从顶层的navigation algorithm重启当前的navigation,撤销做为初始化加载一部分的修改操作(尽管规范不强制要求,建议确保更新新页面到session历史操作(update the session history with the new page)在应用程序缓存的选择算法结束后再进行)。
    注:该navigation操作不会重复加载相同的资源,因为标记为外部(foreign)的项是不会被选中做为cache资源返回给浏览器的。
    • 浏览器可以告诉用户:缓存manifest和document元数据不一致,以此帮助应用程序开发。
  • 如果document从应用程序缓存(application cache)中加载并且应用程序缓存(application cache)仍然存在(应用程序缓存未被标记为废弃(obsolete)):
  • 如果document是通过http get或与之类似(or equivalent)的方法从网络加载的,document带有manifest url并且url与document同源(same origin):
  • 否则:

    更改的网络模式

    过期的应用程序缓存

    磁盘空间

    应用程序缓存API

    浏览器状态

    Web应用程序API

    脚本功能

    介绍

    启用和禁用脚本功能

    处理模型

    定义
    调用脚本
    创建脚本
    结束脚本
    运行时脚本错误

    事件循环

    定义
    处理模型
    通用任务来源

    “javascript: ”URL协议

    事件

    事件处理

    许多对象可以指定事件处理行为。这些行为将成为指定它们的对象的冒泡事件侦听器。

    一个事件处理行为可以被设为null值或一个Function对象。在初始化时,事件处理行为必须被设为null。

    事件处理行为通过一到两种途径暴露。

    第一种途径是一个事件处理行为IDL属性,它是所有事件处理行为所共有的。

    第二种途径是一个事件处理行为内容属性。HTML元素的事件处理行为和某些Window对象的事件处理行为通过该途径暴露。

    事件处理行为IDL属性,在设置其值时,必须以相应的事件处理行为作为其新值;在获取其值时,必须返回任何相应的事件处理行为的当前值(可能为null)。

    如果一个事件处理行为IDL属性公开一个不存在的对象的事件处理行为,则必须总是在获取其值是返回null,且在设置其值时不做操作。

    注:这种情况可能发生在特定的没有相应的window对象的body元素的事件处理行为IDL属性上。
    注:某些事件处理行为IDL属性拥有额外的需求,例如MessagePort对象的onmessage属性。

    事件处理行为内容属性,当其被指定时,则必须包含有效地JavaScript代码;当其被解析时,将会匹配在自动插入分号后生成的FunctionBody。

    当一个事件处理行为内容属性被设置时,如果该元素被浏览器上下文中的Document所拥有,并且脚本程序在浏览器上下文中被启用,则用户代理必须执行下列步骤以便在设置内容属性为新值后生成一个脚本程序:

    1. 设置一个相应的事件处理行为为null。
    2. 创建一个JavaScript脚本执行环境。
    3. 将事件处理行为内容属性的新值设为body
    4. 如果body不能作为FunctionBody解析,或者解析检测到一个早期错误,则步骤终止。
      注:FunctionBody定义在ECMAScript第5版第13节“方法定义”。早期错误定义在ECMAScript第5版第16节“错误”。
    5. 如果body以一个包含了使用严格指令的指令开端作为开始,则strict为真,否则strict为假。
      注:“使用严格指令”和“指令开端”条款定义在ECMAScript第5版第14.1节“指令开端及使用严格指令”。
    6. 使用之前创建的脚本制定环境创建一个function对象(定义在ECMAScript第5版第13.2节“创建Function对象”):
      参数列表FormalParameterList ;如果属性是window对象的onerror属性 : 方法拥有三个参数,分别名为event、source和fileno。;否则 : 方法用户一个单一参数,名为event。
    7. 创建脚本的全局对象。
    元素、Document和Window对象的事件处理
    事件触发
    事件和Window对象

    Base64实用方法

    定时器

    用户提示

    简单对话框

    打印

    使用独立文档实现的对话框

    系统状态和能力:Navigator对象

    Window接口的navigator属性必须回传一个Navigator接口的实例,用来标识该用户代理(客户端)的型号与状态,并允许网页将自身注册为协议/内容处理器。

    interface Navigator {
      // 實作此接口的对象或同時實作以下的數個對象
    };
    Navigator implements NavigatorID;
    Navigator implements NavigatorOnLine;
    Navigator implements NavigatorContentUtils;
    Navigator implements NavigatorStorageUtils;
    

    因为这个接口被分为数个接口分开定义,其他规范可以只使用Navigator接口的一部份。

    客户端标识

    [Supplemental, NoInterfaceObject]
    interface NavigatorID {
      readonly attribute DOMString appName;
      readonly attribute DOMString appVersion;
      readonly attribute DOMString platform;
      readonly attribute DOMString userAgent;
    };
    

    尽管有整个产业的努力,在某些情况下,浏览器具有某些程序错误或限制,使得作者必须绕道解决。

    本小节定义了几个可以从脚本来判断用户代理属性,以用来解决这些问题。

    客户端侦测应该被限制于侦测现存的浏览器版本,作者应该假设未来或是未知的浏览器版本完全符合此小节的描述。

    window . navigator . appName
    回传浏览器的名称
    window . navigator . appVersion
    回传浏览器的版本
    window . navigator . platform
    回传平台的名称
    window . navigator . userAgent
    回传完整的「User-Agent」标头

    appName

    回传值必须是字符串"Netscape"或是浏览器的全名,例如:"Mellblom Browsernator"。

    appVersion

    回传值必须是字符串"4.0"或者是表达浏览器版本的详细说明的字符串,例如:"1.0 (VMS; en-US) Mellblomenator/9000"。

    platform

    回传值必须是空白字符串或者是表现浏览器运行平台的字符串,例如:"MacIntel"、"Win32"、"FreeBSD i386"、"WebTV OS"。

    userAgent

    还传值必须是HTTP请求的「User-Agent」标头的字符串或者是空白字符串(从未送出该表头的情形)

    警告!这个 API 里的拥有的讯息若是随著用户改变,此讯息可被用来制作用户的侧写。如果具有足够的讯息,用户甚至可以被完全的识别出来。因此,这里强烈建议用户代理在这个 API 里放置尽量少的讯息。

    自定义协议和内容处理

    安全和隐私
    用户界面示例

    手动释放存储互斥量

    用户交互

    hidden属性

    所有的HTML 元素都可以设置hidden属性。hidden属性是一个布尔属性。当一个元素指定了该属性时,则表示该元素无效或不再适用。User agents不应该渲染指定了hidden属性的元素。

    在下面这个例子中,hidden属性被用来隐藏网页游戏的主界面直到用户登录:
      <h1>The Example Game</h1>
      <section id="login">
       <h2>Login</h2>
       <form>
        ...
        <!-- calls login() once the user's credentials have been checked -->
       </form>
       <script>
        function login() {
          // switch screens
          document.getElementById('login').hidden = true;
          document.getElementById('game').hidden = false;
        }
       </script>
      </section>
      <section id="game" hidden>
       ...
      </section>
    

    hidden属性不能被用来隐藏内容,这会在另外一个例子中合理的演示。例如,使用hidden属性隐藏一个标签面板是不正确的,因为标签界面也只是一种溢出演示——人们同样可以在一个带有滚动条的大页面中很好的显示所有表单控件。使用该属性隐藏一个演示里的内容也是不正确的——如果指定hidden属性,它会隐藏该演示内所有的内容,包括,例如,屏幕阅读器。


    未指定hidden属性的元素不能链接或指向指定了hidden属性的元素。


    例如,使用href属性链接到某个指定了hidden属性的部分是不正确的。因为,如果该内容是不适用或者不相关的,那么没有理由去链接。


    用ARIA aria-describedby属性指向hidden属性本身的描述也是不正确的。隐藏一个部分的意思是指在当前时间该部分对于它任何人都没有意义也不相关,因此它显然不能有效的描述用户交互的内容。


    IDL属性hidden,必须能够反映与之同名的属性的内容。

    HTML 语法

    编写 HTML 文档

    DOCTYPE 声明

    HTML文档必须以一个DOCTYPE开始。

    DOCTYPE因为历史原因而作为必须选项存在。如果省略了DOCTYPE,浏览器会采用不符合某些标准的渲染模式。因此在文档中加入DOCTYPE,可以保证浏览器尽最大可能地遵循相关标准。

    一个DOCTYPE必须包含以下部分,并严格按照顺序出现:

    1. 一个ASCII字符串"<!DOCTYPE",大小写不敏感。
    2. 一个或多个空白字符。
    3. 一个ASCII字符串"html",大小写不敏感。
    4. 一个可选的历史遗留的DOCTYPE字符串,或者一个可选的已过时但被允许的DOCTYPE字符串(下文有具体声明)。
    5. 一个或多个空白字符。
    6. 一个编码为U+003E的大于符号(>)。
    注:也就是说,DOCTYPE应该是<!DOCTYPE html>,大小写不敏感。

    由于有些HTML生成器无法输出简短形式的DOCTYPE,即"<!DOCTYPE html>",标准允许在DOCTYPE中(上文所述的位置)插入一个历史遗留的DOCTYPE字符串。该字符中必须有以下内容组成:

    1. 一个或多个空白字符。
    2. 一个ASCII字符串"SYSTEM",大小写不敏感。
    3. 一个或多个空白字符。
    4. 一个编码为U+0022的双引号,或者编码为U+0027的单引号。
    5. 字符串"about:legacy-compat"。
    6. 一个对应的编码为U+0022的双引号,或者编码为U+0027的单引号(与第4步中使用的相匹配)。
    注:也就是说,可以使用<!DOCTYPE html SYSTEM "about:legacy-compat">或者<!DOCTYPE html SYSTEM 'about:legacy-compat'>,其中除了在双引号/单引号之间的部分外,均是大小写不敏感的。

    不应该使用历史遗留的DOCTYPE字符串,除非文档由不能生成简短形式的DOCTYPE的系统生成。

    为了帮助用户从HTML4和XHTML1完成升级,标准允许在DOCTYPE中(上文所述的位置)插入一个已过时但被允许的DOCTYPE字符串。该字符中必须有以下内容组成:

    1. 一个或多个空白字符。
    2. 一个ASCII字符串"PUBLIC",大小写不敏感。
    3. 一个或多个空白字符。
    4. 一个编码为U+0022的双引号,或者编码为U+0027的单引号。
    5. 从下面表格的第1列中任取一个字符串,下文中“被选行”指被选择的字符串所在的行。
    6. 一个对应的编码为U+0022的双引号,或者编码为U+0027的单引号(与第4步中使用的相匹配)。
    7. 如果被选行的第2列非空,一个或多个空白字符。
    8. 如果被选行的第2列非空,一个编码为U+0022的双引号,或者编码为U+0027的单引号。
    9. 如果被选行的第2列非空,被选行的第2列中的字符串。
    10. 如果被选行的第2列非空,一个对应的编码为U+0022的双引号,或者编码为U+0027的单引号(与第8步中使用的相匹配)。

    过时但被允许的DOCTYPE字符串中可以使用的公共及系统标识符

    公共标识符 系统标识符
    -//W3C//DTD HTML 4.0//EN
    -//W3C//DTD HTML 4.0//EN http://www.w3.org/TR/REC-html40/strict.dtd
    -//W3C//DTD HTML 4.01//EN
    -//W3C//DTD HTML 4.01//EN http://www.w3.org/TR/html4/strict.dtd
    -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
    -//W3C//DTD XHTML 1.1//EN http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd

    当一个DOCTYPE中含有过时但被允许的DOCTYPE字符串时,这个DOCTYPE被称为已过时但被允许的DOCTYPE。由于已过时但被允许的DOCTYPE含有非必要的冗长信息,作者不应该使用之。

    元素

    共有5种元素:空元素、原始文本元素、RCDATA元素、外来元素以及常规元素。

    空元素 
    area、base、br、col、command、embed、hr、img、input、keygen、link、meta、param、source、track、wbr
    原始文本元素 
    script、style
    RCDATA元素 
    textarea、title
    外来元素 
    来自MathML命名空间和SVG命名空间的元素。
    常规元素 
    其他HTML允许的元素都称为常规元素。

    标签在标记中起到标记元素的开始和结束的作用。原始文本、RCDATA以及常规元素都有一个开始标签来表示开始,一个结束标签来表示结束。某些元素的开始和结束标签是可以省略的,将在后文详述。如果规定标签不能被省略,那么就绝对不能省略它。空元素只有一个开始标签,且不能为空元素设置结束标签。外来元素可以有一个开始标签和配对的结束标签,或者只有一个自闭合的开始标签,且后者情况下该元素不能有结束标签。

    元素的内容必须紧随开始标签(特定情况下可省略)之后,且在结束标签(同样在特定情况下可省略)之前。一个元素中可以出现的内容由它的内容模型决定,在本标准的前面部分章节中已经有详细说明。一个元素不能包含它的内容模型不允许的内容。除了内容模型的限制之外,此5类元素还有额外的语法限制。

    空元素不能有任何内容(因为空元素没有结束标签,自然没办法在开始标签和结束标签之间放内容)。

    原始文本元素可以包含文本,但有下文所述的限制。

    RCDATA元素可以包含文本和字符引用,但是文本中不能包含意义不明的符号。另外此类元素还有下文所述的额外限制。

    对于外来元素,当开始标签自闭合时,不能包含任何内容(因为没有结束标签,所以不能在开始标签和结束标签之间放内容)。当开始标签不自闭合时,其内容可以包含文本、字符引用、CDATA块、其他元素和注释,但是文本不能包含编码为U+003C的小于符号(<)或者意义不明的符号。

    HTML语法不支持命名空间声明,外来元素也无法使用命名空间。

    例如以下HTML片段:

    <p>
     <svg>
      <metadata>
       <!-- 下面这元素是非法的 -->
       <cdr:license xmlns:cdr="http://www.example.com/cdr/metadata" name="MIT"/>
      </metadata>
     </svg>
    </p>
    

    最里面的cdr:license最终会在元素在SVG命名空间下,因为"xmlns:cdr"属性不会起作用(这和XML不同)。事实上,就如该元素上面的注释所说,这个元素其实是非标准的,因为SVG标准在SVG命名空间下没有定义叫"cdr:license"的元素。

    常规元素可以包含文本、字符引用、其他元素以及注释,但是文本不能包含编码为U+003C的小于符号(<)或者意义不明的符号。在内容模型和本章节的给出的限制之外,有些常规元素在可以包含的内容方面有额外的限制,如下所述。

    标签包含一个标签名,用于指定元素的名称。HTML元素的名称只使用编码在U+0030数字0(0)到U+0039数字9(9)、U+0061小写字母A到U+007A小写字母Z、U+0041大写字母A到U+005A大写字母Z这些区间内的字符。在HTML语法中,标签名(包括外来元素)可以用任何形式的大小写字母组合形式,只要所有字符转化为小写以后和元素的标签名称相等即可,即标签名是大小写不敏感的。

    开始标签

    开始标签必须符合以下格式:

    1. 开始标签的第一个字符必须是编码为U+003C的小于符号(<)。
    2. 之后的若干个字符必须是元素的标签名称。
    3. 如果之后有若干个属性,则必须先有一个或多个空白字符。
    4. 随后开始标签可以包含一定数量的属性,属性的具体语法在下文进行阐述。各个属性之间必须通过一个或多个空白字符分隔。
    5. 在属性之后(没有属性时,在标签名之后),可以有一个或多个空白字符。(有些属性要求其后紧随空格,具体见下文的属性章节)。
    6. 随后,如果该元素是空元素或者外来元素,则可以有一个编码为U+002F的斜杠符号(/)。该字符对于空元素没有作用,但对于外来元素,该符号表示开始标签自闭合。
    7. 最后,开始标签必须以一个编码为U+003E的大于符号(>)关闭。
    结束标签

    结束标签必须符合以下格式:

    1. 结束标签的第一个字符必须是编码为U+003C的小于符号(<)。
    2. 第二个字符必须是编码为U+002F的斜杠符号(/)。
    3. 之后的若干个字符必须是元素的标签名称。
    4. 在标签名之后,可以有一个或多个空白字符。
    5. 最后,结束标签必须以一个编码为U+003E的大于符号(>)关闭。
    属性

    一个元素的属性出现在它的开始标签内。

    属性由名称和值组成。属性的名称必须由一个或多个字符组成,且不能包含以下字符:空白字符、编码为U+0000的NULL字符,U+0022的双引号(")、U+0027的单引号(')、U+003E的大于符号(>)、U+002F的斜杠(/)、U+003D的等号(=)、控制字符以及其他非Unicode定义的字符。在HTML语法中,属性的名称(包括外来元素)可以由任何形式的大小写字符组成,只要所有字符转化为大写以后和属性名称相同即可。

    属性的值由文本和字符引用混合而成,文本中不得包含意义不明的符号。

    属性可以通过以下4种形式定义:

    空属性语法
    只有属性名称,此时属性值隐式地指定为空字符串。 下例中的disabled属性通过空属性语法定义:
    <input disabled>
    

    如果一个空属性语法定义的属性之后还有另一个属性,则2个属性间必须用一个空格字符分隔。

    不带引号的语法
    属性名称后跟随一个或多个空格字符,随后一个编码为U+003D的等号,随后一个或多个字符,其后跟随属性的值。此时除了上文给定的限制外,属性的值还不得包含空格、编码为U+0022的双引号(")、U+0027的单引号(')、U+003D的等号(=)、U+003C的小于符号(<)、U+003E的大于符号(>)以及U+0060的波浪号(`),同时属性值不能是一个空字符串。

    下例中的value属性通过不带引号的语法定义:

    <input value=yes>
    

    如果一个用不带引号的语法定义的属性之后还有另一个属性,或者其后是一个在开始标签一节第6步中定义的可选的编码为U+002F的斜杠(/),则两者之间必须通过一个空格字符分隔。

    单引号包含的语法
    属性名称后跟随一个或多个空格字符,随后一个编码为U+003D的等号,随后一个或多个字符,之后一个编码为U+0027的单引号('),之后是属性的值,此时属性的值除了上文给出的限制之外,还不能包含编码为U+0027的单引号('),最后是一个编码为U+0027的单引号(')。

    下例中的type属性通过单引号包含的语法定义:

    <input type='checkbox'>
    

    如果一个由单引号包含的语法定义的属性之后还有另一个属性,则2个属性间必须通过一个空格字符分隔。

    双引号包含的语法
    属性名称后跟随一个或多个空格字符,随后一个编码为U+003D的等号,随后一个或多个字符,之后一个编码为U+0022的单引号(),之后是属性的值,此时属性的值除了上文给出的限制之外,还不能包含编码为U+0022的单引号("),最后是一个编码为U+0022的单引号(")。

    下例中的name属性通过单引号包含的语法定义:

    <input name="be evil">
    

    如果一个由双引号包含的语法定义的属性之后还有另一个属性,则2个属性间必须通过一个空格字符分隔。

    一个开始标签上不得有2个或以上属性的名称在大小写不敏感的环境下相等。

    如果一个外来元素含有一个带命名空间的属性,且该属性的本地名称和命名空间由下表的第1个和第2个单元格表示,则该属性必须用同一行中第3个单元格中给出的字符串作为属性名称。

    本地名称 命名空间 属性名称
    actuate XLink namespace xlink:actuate
    arcrole XLink namespace xlink:arcrole
    href XLink namespace xlink:href
    role XLink namespace xlink:role
    show XLink namespace xlink:show
    title XLink namespace xlink:title
    type XLink namespace xlink:type
    base XML namespace xml:base
    lang XML namespace xml:lang
    space XML namespace xml:space
    xmlns XMLNS namespace xmlns
    xlink XMLNS namespace xmlns:xlink

    其他带命名空间的属性无法用HTML语法表示。

    可选标签

    某些标签可以被省略

    当一个元素的开始标签被省略时,不代码这个元素不存在,此时这个开始标签是隐式的,但依旧存在。一个HTML文档永远有一个作为根的html元素,即使字符串<html>没有出现在任何标记中。

    html元素的开始标签可以省略,前提为第一个子节点不是注释。

    html元素的结束标签可以省略,前提为元素之后没有紧随一个注释。

    head元素的开始标签可以省略,前提为第一个子节点是一个元素。

    head元素的结束标签可以省略,前提为元素之后没有紧随一个空格字符或者注释。

    body元素的开始标签可以省略,前提为元素内容为空,或者内容的第一项不是一个空白字符或注释,同时内容的第一项不能是script或者style元素。

    body元素的结束标签可以省略,前提为元素之后没有紧随一个注释。

    li元素的结束标签可以省略,前提为该li元素之后紧随着另一个li元素,或者其父元素已经没有其他内容。

    dt元素的结束标签可以省略,前提为该元素之后紧随着另一个dt元素或者一个dd元素。

    dd元素的结束标签可以省略,前提为该元素之后紧随着另一个dd元素或者一个dt元素,或者其父元素已经没有其他内容。

    p元素的结束标签可以省略,前提为该元素之后紧随着一个address、article、aside、blockquote、dir、div、dl、fieldset、footer、form、h1、 h2、 h3、 h4、 h5、 h6、 header、 hgroup、 hr、 menu、 nav、 ol、 p、 pre、 section、 table或ul元素,或者其父元素已经没有其他内容并且父元素不是一个a元素。


    rt元素的结束标签可以省略,前提为该元素之后紧随着另一个rt元素或者一个rp元素,或者其父元素已经没有其他内容。

    rp元素的结束标签可以省略,前提为该元素之后紧随着另一个rp元素或者一个rt元素,或者其父元素已经没有其他内容。

    optgroup元素的结束标签可以省略,前提为该元素之后紧随着另一个optgroup元素,或者其父元素已经没有其他内容。

    option元素的结束标签可以省略,前提为该元素之后紧随着另一个option元素或者一个optgroup元素,或者其父元素已经没有其他内容。

    colgroup元素的开始标签可以省略,前提为其内容的第一项是一个col元素,并且要求该元素没有紧随着一个结束标签被省略了的colgroup元素(元素内容为空的情况下不能省略开始标签)。

    colgroup元素的结束标签可以省略,前提为元素之后没有紧随一个空格字符或者注释。

    thead元素的结束标签可以省略,前提为该元素之后紧随着一个tbody或者tfoot元素。

    tbody元素的开始标签可以省略,前提为其内容的第一项是一个tr元素,并且要求该元素没有紧随着一个结束标签被省略了的tbody、thead或tfoot元素(元素内容为空的情况下不能省略开始标签)。

    tbody元素的结束标签可以省略,前提为该元素之后紧随着一个tbody或者tfoot元素,或者其父元素已经没有其他内容。

    tfoot元素的结束标签可以省略,前提为该元素之后紧随着一个tbody元素,或者其父元素已经没有其他内容。

    tr元素的结束标签可以省略,前提为该元素之后紧随着另一个tr元素,或者其父元素已经没有其他内容。

    td元素的结束标签可以省略,前提为该元素之后紧随着一个td或th元素,或者其父元素已经没有其他内容。

    th元素的结束标签可以省略,前提为该元素之后紧随着一个td或th元素,或者其父元素已经没有其他内容。

    但是如果开始标签内有属性,则开始标签不能省略。

    内容模型限制

    由于历史原因,某些特定元素在内容模型的限制之外,还有自身额外的限制。

    table元素不能包含tr元素,虽然本标准描述的内容模型允许这么做(如果标记中有一个tr元素出现在table的子节点中,,事实上会导致一个隐式的tbody开始标签被创建出现)。

    pre元素和textarea元素的开始标签之后可以紧随一个可选的换行符,这不会影响到对元素的处理。其他地方出现的换行都会指定元素的内容新起一行(否则换行都会被当作可选换行符处理,并且被忽略)。

    以下2个pre块是等价的:

    <pre>Hello</pre>
    <pre>
    Hello</pre>
    
    原始文本与 RCDATA 元素内容限制

    在原始文本和RCDATA元素中的文本中,不允许出现一个字符串"</"(编码为U+003C的小于号、U+002F的斜杠),该字符串后跟随着在大小写不敏感环境下与元素标签名相同的字符串,再之后跟随着一个编码为U+0009的TAB符号、U+000A的换行符、U+000C的换页符、U+000D的回车符、U+0020的空格、U+003E的大于符号(>)或U+002F的斜杠(/)。

    文本

    文本可以出现在元素、属性值和注释中。文本必须由Unicode字符组成。文本不得包含编码为U+0000的字符。文本不得包含Unicode永久未定义的字符(非字符)。文本不得包含除空格以外的控制字符。另外关于哪些内容可以或不可以出现在文本中,随着其所处的位置,会有额外的限制,在其他章节会详细阐述。

    换行

    在HTML中换行可以通过一个编码为U+000D的回车符,一个编码为U+000A的换行符,或者编码为U+000D的回车符和U+000A的配对表示。

    当允许出现字符引用时,表示编码为U+000A的换行符(不包含编码为U+000D的回车符)的字符引用同样表示换行。

    字符引用

    在其他章节中的某些案例中有说到,文本可以和字符引用混合出现。这种方法可以用来转义在文本中不能合法出现的字符。

    字符引用必须以一个编码为U+0026的于符号(&)作为起始,其后的字符引用有三种形式:

    命名字符引用 
    &符号之后必须跟随一个命名字符引用章节提供的名称,且大小写必须相符。命名必须以编码为U+003B的分号(;)结束。
    十进制数字型字符引用 
    &符号之后必须跟随一个编码为U+0023的井号(#),其后是一个或多个编码在U+0030数字0到U+0039数字9之间的数字,用于以十进制数字表示一个Unicode中,根据下文所述的定义所允许的编码。数字之后必须以编码为U+003B的分号(;)结束。
    十六进制数字型字符引用 
    &符号之后必须跟随一个编码为U+0023的井号(#),其后是一个编码为U+0078的小写字母X或者编码为U+0058的大写字母X,之后是一个或多个编码在U+0030数字0到U+0039数字9、U+0061小写字母A到U+0066小写字母F、U+0041大写字母A到U+0046大写字母F之间的字符,用于以十六进制数字表示一个Unicode中,根据下文所述的定义所允许的编码。数字之后必须以编码为U+003B的分号(;)结束。

    上文所述的数字型字符引用可用来指定的Unicode编码需除去U+0000、U+000D以及永久未定义的Unicode字符(非字符)和空格以外的控制字符。

    一个意义不明的&符号是指在一个编码为U+0026的&于符号(&)之后跟随了一个或多个编码范围在U+0030数字0到U+0039数字9、U+0061小写字母A到U+007A小写字母Z、U+0041大写字母A到U+005A大写字母Z之间的字符,后面又跟随了一个编码为U+003B的分号(;),且这些字符不和任何在命名字符引用章节中给出的名称匹配。

    CDATA 段落

    CDATA段落必须由以下部分有序组成:

    1. 字符串"<![CDATA["
    2. 可选的文本,且文本中不得出现字符串"]]>"
    3. 字符串"]]>"

    CDATA段落只能在外来内容(MathML或SVG)中使用。如下示例中,CDATA段落用来转义ms元素中的内容

    <p>You can add a string to a number, but this stringifies the number:</p>
    <math>
     <ms><![CDATA[x<y]]></ms>
     <mo>+</mo>
     <mn>3</mn>
     <mo>=</mo>
     <ms><![CDATA[x<y3]]></ms>
    </math>

    注释

    注释必须以4个有序字符开始:编码为U+003C的小于号、U+0021的感叹号、U+0020的横线、U+0020的横线(<!--)。在此之后,注释内容可以包含文件,但文本中不可以出现编码为U+003E的大于号(>)、编码为U+002D的减号(-)加上U+003E的大于号(>)、连续2个编码为U+002D的减号(--),且文本不能以编码为U+002D的减号(-)结束。最后,注释必须以3个有序字符结束:编码为U+002D的减号、U+002D的减号、U+003E的大于号(-->)。

    解析 HTML 文档

    本章節僅適用於使用者代理、資料挖掘工具與規範符合檢驗器。

    注:將 XML 文件解析成 DOM 樹的規則是下一個章節 「XHTML 語法」的範疇。

    使用者代理必須使用本章節描述的解析規則處理 HTML 文件。這些規則定義了所謂的 HTML 解析器

    注:雖然本規範描述的 HTML 語法與 SGML 與 XML 相似,HTML 卻是有自己

    解析規則的新語言。

    之前的 HTML 版本(特別是從 HTML2 到 HTML4)以 SGML 為中心並使用 SGML 的解析規則。然而,幾乎沒有瀏覽器實作真正的 SGML 解析 — 唯一以嚴格的 SGML 處理 HTML 的應用程式是 HTML 驗證器。驗證器與廣泛使用的瀏覽器給予的結果不同的這個問題,已讓開發者浪費了十年以上的時間。因此,這個版本的 HTML 不以 SGML 為中心。

    本規範鼓勵對在創作過程中使用 SGML 工具有興趣的網頁作者使用 XML 工具與

    HTML 的 XML 序列化寫法。

    本規範定義不論語法正確還是錯誤的 HTML 文件的解析規則,並將解析演算法中的某些點稱為解析錯誤。解析錯誤的錯誤處理是有完整定義的:當使用者代理碰到這些錯誤時必須以本規範描述的方式處理錯誤,或者必須在碰到第一個不想以本規範描述的方式處理的錯誤的同時退出整個處理過程。

    若文件有一個以上的解析錯誤,則規範符合檢驗器必須回報至少一個錯誤資訊給使用者。若文件裡沒有解析錯誤,則規範符合驗證器必不可回報解析錯誤。若文件有超過一個解析錯誤,則規範符合驗證器可回報超過一個錯誤資訊。本規範不要求規範符合驗證器從解析錯誤中回復。

    注:解析錯誤只是 HTML 語法上的錯誤。規範符合驗證器還會驗證本規範描述的其他規範符合要求。

    對於規範符合驗證器來說,若規範驗證器確認某個資源是用 HTML 語法,則它是個 HTML 文件

    解析模型概述
    Error creating thumbnail: Unable to save thumbnail to destination

    輸入串流
    Error creating thumbnail: Unable to save thumbnail to destination

    後來作為標記化階段輸入的 Unicode 字符串流一開始對於使用者代理來說,僅僅是透過網路或是從局部檔案系統來的位元組串流。這些位元組是用某種「字符編碼」轉換原來字符得到的,而使用者代理必須用這個「字符編碼」將字元組解碼成字符。

    注:在 XML 文件的情形下,使用者代理必須使用 XML 規範裡定義的決定字符編碼演算法。本小節不適用於 XML 文件。[XML]
    決定字符編碼
    Error creating thumbnail: Unable to save thumbnail to destination
    一些情況下,在解析之前決定文件的編碼可能是不實際的。因此,本規範提供了一個兩段機制與瀏覽器可選擇性實作的預掃描
    Error creating thumbnail: Unable to save thumbnail to destination
    。如同下面所述,本規範允許使用者代理在開始解析文件之前,對已取得的位元組使用一個簡單版的解析演算法。然後,使用者代理使用預解析得到的暫時編碼與其他帶外 後設資料啟動真正的解析器。若載入文件的過程中使用者代理發現編碼宣告與這份資料不符合,則使用者代理可能會用真正的編碼重啟動解析器以進行文件解析。 使用者代理必須使用以下演算法(編碼嗅探演算法
    Error creating thumbnail: Unable to save thumbnail to destination
    以決定在地一次解析一份文件的時候使用的字符編碼。本演算法的輸入是任何的帶外後設資料(例如,文件的 Content-Type 後設資料)與已取得的所有位元組,回傳是一個編碼與一個可信度。可信度可能是「暫時」、「確定」或「無關」
    Error creating thumbnail: Unable to save thumbnail to destination
    。不管可信度是「暫時」還是「確定」,使用者代理會在解析過程中使用得到的編碼以決定是否變更編碼。若編碼不是必要的(例如,解析器作用在 Unicode 字符串流上因此沒有編碼解碼的必要),則可信度是「無關」。
    1. 若使用者指示使用者代理以某個編碼覆蓋文件的字符編碼,則使用者代理可回傳該編碼,可信度為「確定」,並退出這些步驟
      Error creating thumbnail: Unable to save thumbnail to destination
    2. 若傳輸層有指定編碼,且使用者代理支援該編碼,則回傳該編碼,可信度為「確定」,並退出這些步驟
      Error creating thumbnail: Unable to save thumbnail to destination
    3. 使用者代理可在此或是本演算法接下來的步驟中,等候更多的位元組
      Error creating thumbnail: Unable to save thumbnail to destination
      。舉例來說,使用者代理可能花 500 微秒等待 1024 個位元組。一般來說實施尋找編碼的預解析可以提昇效率,因為會減少在解析的時候在找到編碼資訊的同時必須丟棄資料結構的可能性。然而若使用者代理為了獲得決定編碼用的資料延遲了太長的時間,浪費的時間可能比預處理得到的效能優勢來的多。
      注:字符編碼宣告的寫作的規範符合條件規定字符編碼宣告只能出現在前 1024 個位元組。本規範因此鼓勵使用者者代理僅對前 1024 的位元組使用以下的欲解析演算法(這些步驟),而不超過它。
    4. 對於以下表格裡面的每一行,由第一行往下看,若已經有跟第一欄裡的位元組數一樣多的位元組存在,且檔案裡前幾個位元組與第一欄的位元組一致,則回傳該行第二欄的編碼,可信度為「確定」,並退出這些步驟
      Error creating thumbnail: Unable to save thumbnail to destination
      位元組的十六進位表示編碼
      FE FF大端序 UTF-16
      FF FE小端序 UTF-16
      EF BB BFUTF-8
      注:本步驟在尋找 Unicode 位元組順序記號(BOM)
    5. 否則,使用者代理要找檔案本身裡的字符編碼資訊。過程如下:

      位置為指向輸入串流裡一個位元組的指針,一開始指向第一個位元組。若在這些子步驟中的任意個位置上,位元組不夠或是使用者代理決定繼續掃描是無效率的,則跳至整個字符編碼偵測演算法的下一個步驟。使用者代理可決定掃描「任何」的位元組都是無效率的,在這種情況下使用者代理會完全跳過這些子步驟。

      重複執行以下「兩個」步驟直到退出演算法(因為上述原因使用者代理退出演算法,或是因為找到字符編碼了):

      1. 位置指向:
        ↪ 開頭為:0x3C 0x21 0x2D 0x2D(ASCII '<!--')的位元組序列
        位置指標指向下一個前面有兩個 0x2D 位元組的 0x3E 位元組(也就是 ASCII '-->' 序列的結尾,這兩個 0x2D 位元組可以是 '<!--' 序列裡的那兩個)
        Error creating thumbnail: Unable to save thumbnail to destination
        ↪ 開頭為:0x3C, 0x4D 或 0x6D, 0x45 或 0x65, 0x54 或 0x74, 0x41 或 0x61, 最後是 0x09, 0x0A, 0x0C, 0x0D, 0x20, 0x2F(不分大小寫的 ASCII '<meta' 接一個空白或斜線)的位元組序列
        Error creating thumbnail: Unable to save thumbnail to destination
        1. 位置指標指向下一個是 0x09, 0x0A, 0x0C, 0x0D, 0x20, 或 0x2F 的位元組(上對配對到的序列裡的那一個)。
        2. 屬性列表為空的字串列表。
        3. 已得指令為假。
        4. 需要指令為空。
        5. 字集為空值(對於本演算法來說,與無法辨識的編碼或是空字串不同)。
        6. 「屬性」:抓一個屬性與它的取值。若沒有嗅出屬性,則跳到下面的「處理」步驟
          Error creating thumbnail: Unable to save thumbnail to destination
        7. 若屬性的名稱已經在屬性列表內,則回到「屬性」步驟。
        8. 將屬性的名稱加入至屬性列表
        9. 執行以下列表中適用的步驟(若存在):
          ↪ 若屬性的名稱是 "http-equiv"
          若屬性的取值是 "content-type",則設已得指令為真。
          ↪ 若屬性的名稱是 "content"
          對屬性的取值使用meta 元素萃取編碼的演算法。若演算法回傳編碼,且字集仍為空值,設字集為該編碼,且設需要指令為真。
          ↪ 若屬性的名稱是 "charset"
          字集為對應屬性的取值的編碼,且設需要指令為假。
        10. 回到「屬性」步驟。
        11. 「處理」:若需要指令為空值,則跳到整個「兩步」演算法的第二步
          Error creating thumbnail: Unable to save thumbnail to destination
        12. 需要指令為真但是已得指令為假,則跳到整個「兩步」演算法的第二步。
        13. 字集一種 UTF-16 編碼,將字集的值更改為 UTF-8
          Error creating thumbnail: Unable to save thumbnail to destination
        14. 字集不是使用者代理支援的編碼,則跳到整個「兩步」演算法的第二步。
        15. 回傳字集對應的編碼,可信度為「暫時」,並退出這些步驟。
          ↪ 開頭為一個 0x3C 位元組(ASCII <),可能接著一個 0x2F 位元組(ASCII /),最後是一個範圍在 0x41-0x5A 或 0x61-0x7A(一個 ASCII 子母)的位元組組成的位元組序列
          Error creating thumbnail: Unable to save thumbnail to destination
          1. 位置指標指向下一個是 0x09(ASCII TAB), 0x0A(ASCII LF), 0x0C(ASCII FF), 0x0D(ASCII CR), 0x20(ASCII 空白), 或 0x3E(ASCII >)的位元組。
            Error creating thumbnail: Unable to save thumbnail to destination
          2. 重複抓一個屬性直到無法再找屬性,並跳到整個「兩步」演算法的第二步。
          ↪ 開頭為:0x3C 0x21(ASCII '<!')的位元組序列
          ↪ 開頭為:0x3C 0x2F(ASCII '</')的位元組序列
          ↪ 開頭為:0x3C 0x3F(ASCII '<?')的位元組序列
          位置指標指向下一個 0x3E 位元組(ASCII >)
          Error creating thumbnail: Unable to save thumbnail to destination
          ↪ 其他位元組
          不做任何事
        16. 位置指標移至輸入串流的下一個位元組,並回到這個「兩步」演算法的第一步。
        當上面的「兩步」演算法要抓一個屬性時,代表進行:
        1. 位置上的位元組是 0x09(ASCII TAB), 0x0A(ASCII LF), 0x0C(ASCII FF), 0x0D(ASCII CR), 0x20(ASCII 空白), 或 0x2F(ASCII /)其一,則將位置指向下一個位元組並重做這個子步驟。
          Error creating thumbnail: Unable to save thumbnail to destination
        2. 位置上的位元組是 0x3E(ASCII >),則退出「抓一個屬性」演算法。沒有屬性。
        3. 否則,位置上的位元組是屬性名稱的起點。設屬性名稱屬性取值為空字串。
        4. 「屬性名稱」:用下述方式處理位置上的位元組
          Error creating thumbnail: Unable to save thumbnail to destination
          ↪ 若位元組為 0x3D(ASCII =),且屬性名稱不是空字串
          位置指向下一個位元組並跳到「取值」步驟。
          ↪ 若位元組為 0x09(ASCII TAB), 0x0A(ASCII LF), 0x0C(ASCII FF), 0x0D(ASCII CR),或 0x20(ASCII 空白)
          跳到「空白」步驟。
          ↪ 若位元組為 0x2F(ASCII /)或 0x31(ASCII >)
          退出「抓一個屬性」演算法。屬性名稱是屬性名稱的值,屬性取值是空字串。
          Error creating thumbnail: Unable to save thumbnail to destination
          ↪ 若位元組在 0x41(ASCII A)到 0x51(ASCII Z)的範圍裡
          將代碼點是 b+0x20 的 Unicode 字符附上屬性名稱(其中 b位置上位元組的值)。
          ↪ 其他所有情形
          將代表點是位置上位元組的值的 Unicode 字符附上屬性名稱。(ASCII 範圍外的位元組是如何處理的並不重要,畢竟只有 ASCII 字符才對字符編碼的偵測有影響。)
        5. 位置指向下一個位元組並回到前一個步驟。
        6. 「空白」:若位置上的位元組是 0x09(ASCII TAB), 0x0A(ASCII LF), 0x0C(ASCII FF), 0x0D(ASCII CR), 0x20(ASCII 空白), 或 0x2F(ASCII /)其一,則將位置指向下一個位元組並重複這個步驟
          Error creating thumbnail: Unable to save thumbnail to destination
        7. 位置上的位元組「不是」0x3D(ASCII =),則退出「抓一個屬性」演算法。屬性名稱是屬性名稱的值,屬性取值是空字串。
          Error creating thumbnail: Unable to save thumbnail to destination
        8. 位置移過該 0x3D(ASCII =)位元組。
        9. 「取值」:若位置上的位元組是 0x09(ASCII TAB), 0x0A(ASCII LF), 0x0C(ASCII FF), 0x0D(ASCII CR), 0x20(ASCII 空白), 或 0x2F(ASCII /)其一,則將位置指向下一個位元組並重複這個步驟
          Error creating thumbnail: Unable to save thumbnail to destination
        10. 用下述方式處理位置上的位元組:
          ↪ 若位元組為 0x22(ASCII ")或 0x27(ASCII ')
          Error creating thumbnail: Unable to save thumbnail to destination
          Error creating thumbnail: Unable to save thumbnail to destination
          1. b位置上位元組的值。
          2. 位置指向下一個位元組
          3. 位置上位元組的值是 b,則將位置指向下一個位元組並退出「抓一個屬性」演算法。屬性名稱是屬性名稱的值,屬性取值是屬性取值的值
            Error creating thumbnail: Unable to save thumbnail to destination
          4. 否則,若位置上的位元組在 0x41(ASCII A)到 0x51(ASCII Z)的範圍裡,則將一個代碼點比位置上位元組的值大 0x20 的 Unicode 字符附上屬性取值
          5. 否則,將代表點是位置上位元組的值的 Unicode 字符附上屬性取值
          6. 回到這些子步驟的第二步。
          ↪ 若位元組為 0x31(ASCII >)
          退出「抓一個屬性」演算法。屬性名稱是屬性名稱的值,屬性取值是空字串。
          ↪ 若位元組在 0x41(ASCII A)到 0x51(ASCII Z)的範圍裡
          將代碼點是 b+0x20 的 Unicode 字符附上屬性取值(其中 b位置上位元組的值)。將位置指向下一個位元組。
          ↪ 其他所有情形
          將代表點是位置上位元組的值的 Unicode 字符附上屬性取值。將位置指向下一個位元組。
        11. 用下述方式處理位置上的位元組
          Error creating thumbnail: Unable to save thumbnail to destination
          ↪ 若位元組為 0x09(ASCII TAB), 0x0A(ASCII LF), 0x0C(ASCII FF), 0x0D(ASCII CR), 0x20(ASCII 空白),或 0x3E(ASCII >)
          退出「抓一個屬性」演算法。屬性名稱是屬性名稱的值,屬性取值是屬性取值的值。
          ↪ 若位元組在 0x41(ASCII A)到 0x51(ASCII Z)的範圍裡
          將代碼點是 b+0x20 的 Unicode 字符附上屬性取值(其中 b位置上位元組的值)。
          ↪ 其他所有情形
          將代表點是位置上位元組的值的 Unicode 字符附上屬性取值
        12. 位置指向下一個位元組並回到前一個步驟。
        為了兼容性,使用者代理不應該使用會得到跟上述結果不同的預掃描演算法。(但是,如果你真的這樣做了,請告訴我們,這樣我們才可以改善這個演算法並讓大家受惠...)
      2. 若使用者代理透過上次訪問時的編碼
        Error creating thumbnail: Unable to save thumbnail to destination
        之類的資訊,能大致確定頁面的編碼,則回傳該編碼,可信度為「暫時」,並退出這些步驟。
      3. 使用者代理可嘗試透過頻率分析或其他演算法自動偵測資料串流的編碼。這些演算法可使用檔案內容以外的資訊,包括檔案的網址。若自動偵測成功並可得到字符編碼,則回傳該編碼,可信度為「暫時」,並退出這些步驟
        Error creating thumbnail: Unable to save thumbnail to destination
        [UNIVCHARDET]
        注:UTF-8 編碼有很容易偵測的位圖樣。具有批配 UTF-8 樣式的大於 0x7F 位元組的文件,編碼十分有可能是 UTF-8,而不批配的則十分有可能不是。本規範因此鼓勵使用者代理找尋這個樣式。[PPUTF8] [UTF8DET]
      4. 否則,回傳實作定義的預設編碼或是使用者指定的預設編碼,可信度為「暫時」
        Error creating thumbnail: Unable to save thumbnail to destination

        在受限環境或是有文件編碼有規定的環境(舉例來說,只在新網路使用的使用者代理)之下,本規範建議使用全方位的 UTF-8 編碼。

        在其他環境下,預設編碼一般與使用者的語言環境有關(作為使用者大致會逛的頁面的語言與編碼的一種猜測)。為與老舊內容兼容,本規範建議使用的對照表,以 BCP 47 語言標籤識別語言環境。[BCP47]

        語言環境建議預設編碼
        arUTF-8
        beISO-8859-5
        bgwindows-1251
        csISO-8859-2
        cyUTF-8
        faUTF-8
        hewindows-1255
        hrUTF-8
        huISO-8859-2
        jaWindows-31J
        kkUTF-8
        kowindows-949
        kuwindows-1254
        ltwindows-1257
        lvISO-8859-13
        mkUTF-8
        orUTF-8
        plISO-8859-2
        roUTF-8
        ruwindows-1251
        skwindows-1250
        slISO-8859-2
        srUTF-8
        thwindows-874
        trwindows-1254
        ukwindows-1251
        viUTF-8
        zh-CNGB18030
        zh-TWBig5
        其他語言環境windows-1252
      使用者代理必須在使用本演算法的回傳值選擇解碼器的那個瞬間,將文件的字符編碼設為該值
      Error creating thumbnail: Unable to save thumbnail to destination
      注:本演算法肆意違抗要求在缺少字符編碼宣告的情況下預設編碼是 ISO-8859-1 的 HTTP 規範,也肆意違抗要求在缺少字符編碼宣告的情況下預設編碼是 US-ASCII 的 RFC 2046。本規範的出發點在於與老舊內容達到最大的兼容。[HTTP] [RFC2046]
      輸入串流的前置處理

      使用者代理必須用給定的編碼,使用該編碼的規則將輸入串流內的位元組轉換成 Unicode 字符作為 tokenizer 的輸入,但是前頭若有 U+FEFF BYTE ORDER MARK

      字符,使用者代理必不可在編碼層將之剝離(下面規則會剝離這個字符)
      Error creating thumbnail: Unable to save thumbnail to destination

      若前頭若有 U+FEFF BYTE ORDER MARK 字符,使用者代理必須無視該字符

      Error creating thumbnail: Unable to save thumbnail to destination
      Error creating thumbnail: Unable to save thumbnail to destination
      注:不管 U+FEFF BYTE ORDER MARK 字符有沒有用來決定字元組序都把第一個該字符剝離的這項要求是對 Unicode 的肆意違抗,目的是增進使用者代理面對不正確轉碼器回覆力。

      U+000D CARRIAGE RETURN(CR)字符與 U+000A LINE FEED(LF)字符有特殊的 處理方式。使用者代理必須移除所有後面是 LF 字符的 CR 字符

      Error creating thumbnail: Unable to save thumbnail to destination
      ,並轉換所有後面不是 LF 字符的 CR 字符成 LR 字符
      Error creating thumbnail: Unable to save thumbnail to destination
      。因此,HTML DOM 裡的換行以 LF 字符表示,tokenization 階段的輸入不會有任何的 CR 字符。
      解析時的編碼變更

      當解析器要求使用者代理變更編碼的時候,使用者代理必須執行以下步驟。這可能會在上述的編碼嗅探演算法無法找到編碼或是找到的編碼不是檔案的實際編碼的時候發生。

      1. 若新的編碼與用來解讀輸入串流的編碼一樣或等同,則設可信度為「確定」並退出這些步驟
        Error creating thumbnail: Unable to save thumbnail to destination
        。這發生在檔案裡找到的編碼資訊與編碼嗅探演算法決定的編碼一致的時候,亦或是在第一次通過解析器時發現前面小節描述的編碼嗅探演算法無法照到正確編碼的情況下第二次通過的時候。
      2. 若已經用來解讀輸入串流的編碼是一個 UTF-16 編碼,則設可信度為「確定」並退出這些步驟。使用者代理無視新編碼,若新編碼與原來編碼不一樣,則新編碼很明顯不正確
        Error creating thumbnail: Unable to save thumbnail to destination
      3. 若新編碼是一個 UTF-16 編碼,改成 UTF-8
        Error creating thumbnail: Unable to save thumbnail to destination
      4. 若到上一個現在解碼器解碼過的位元組為止,新編碼與舊編碼解讀到的 Unicode 序列是一樣的,且使用者代理具有即時變更轉換器的功能,則使用者代理可即時改用新的轉換器來解碼
        Error creating thumbnail: Unable to save thumbnail to destination
        。設文件的字符編碼與用來轉換輸入串流的編碼為新的編碼,設可信度為「確定」並退出這些步驟。
      5. 否則,再次瀏覽這份文件,啟用置換並使用相同的資源瀏覽上下文,但是這次跳過編碼嗅探演算法而僅僅設編碼為新的編碼
        Error creating thumbnail: Unable to save thumbnail to destination
        可信度為「確定」。這應該盡可能在不使用網路層達成(使用者代理應該從記憶體裡的位元組重新解析),就算文件標注為不可緩存也一樣。若不可能不使用網路層且使用網路層會再一次發出方法不是 HTTP GET 的要求(或非 HTTP URL 的同等情形),則改設可信度為「確定」並無視新編碼
        Error creating thumbnail: Unable to save thumbnail to destination
        。這會造成資源的錯誤解讀。使用者代理可告知使用者這種狀況以幫助應用程式的開發。

      Tokenization

      字符引用的 Tokenization

      本小節定義吃掉字符引用的方法。此定義用於解析文字中的字符引用與屬性中的字符引用兩種情況。

      本演算法進行的動作取決於下個字符(緊接著 U+0026 AMPERSAND 的那個):

      ↪ U+0009 CHARACTER TABULATION(tab)
      ↪ U+000A LINE FEED(LF)
      ↪ U+000C FORM FEED (FF)
      ↪ U+0020 SPACE
      ↪ U+003C LESS-THAN SIGN
      ↪ U+0026 AMPERSAND
      ↪ EOF
      ↪ 「允許的額外字符」(若有指定)
      非字符引用。不吃掉任何字符,也不回傳任何東西。(也並非錯誤狀況)
      ↪ U+0023 NUMBER SIGN(#)
      吃掉 U+0023 NUMBER SIGN。

      再下來的動作依 U+0023 NUMBER SIGN 後面的字符而有所不同:

      U+0078 LATIN SMALL LETTER X
      U+0058 LATIN CAPITAL LETTER X

      吃掉 X。

      遵守下面步驟,字符範圍是 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)、U+0061 LATIN SMALL LETTER A 到 U+0066 LATIN SMALL LETTER F、U+0041 LATIN CAPITAL LETTER A 到 U+0046 LATIN CAPITAL LETTER F(也就是,0-9、A-F、a-f)。

      到需要解讀數字的時候,以十六進位解讀。

      其他字符

      遵守下面步驟,字符範圍是從 U+0030 DIGIT ZERO (0) 到 U+0039 DIGIT NINE (9)。

      到需要解讀數字的時候,以十進位解讀。

      吃掉批配上面描述的字符範圍的所有字符。

      若在範圍裡面的字符不存在,不吃掉任何字符(並吐出 U+0023 NUMBER SIGN 字符與 X 字符)。這是個解析錯誤,回傳空值。

      否則,若下一個字符是 U+003B SEMICOLON,則吃掉該字符。若不是,則這是個解析錯誤

      若前面批配的字符數量是一個或更多,則將這些字符組成的字串以數字解讀(用十六進位或是十進位)。

      若該數字是以下表格第一欄裡的數字其一,則這是個解析錯誤。尋找有該數字的那一行並回傳該行第二欄給出的 Unicode 字符的字符 token

      數字Unicode 字符
      0x00U+FFFDREPLACEMENT CHARACTER
      0x0DU+000DCARRIAGE RETURN (CR)
      0x80U+20ACEURO SIGN (€)
      0x81U+0081<control>
      0x82U+201ASINGLE LOW-9 QUOTATION MARK (‚)
      0x83U+0192LATIN SMALL LETTER F WITH HOOK (ƒ)
      0x84U+201EDOUBLE LOW-9 QUOTATION MARK („)
      0x85U+2026HORIZONTAL ELLIPSIS (…)
      0x86U+2020DAGGER (†)
      0x87U+2021DOUBLE DAGGER (‡)
      0x88U+02C6MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ)
      0x89U+2030PER MILLE SIGN (‰)
      0x8AU+0160LATIN CAPITAL LETTER S WITH CARON (Š)
      0x8BU+2039SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹)
      0x8CU+0152LATIN CAPITAL LIGATURE OE (Œ)
      0x8DU+008D<control>
      0x8EU+017DLATIN CAPITAL LETTER Z WITH CARON (Ž)
      0x8FU+008F<control>
      0x90U+0090<control>
      0x91U+2018LEFT SINGLE QUOTATION MARK (‘)
      0x92U+2019RIGHT SINGLE QUOTATION MARK (’)
      0x93U+201CLEFT DOUBLE QUOTATION MARK (“)
      0x94U+201DRIGHT DOUBLE QUOTATION MARK (”)
      0x95U+2022BULLET (•)
      0x96U+2013EN DASH (–)
      0x97U+2014EM DASH (—)
      0x98U+02DCSMALL TILDE (˜)
      0x99U+2122TRADE MARK SIGN (™)
      0x9AU+0161LATIN SMALL LETTER S WITH CARON (š)
      0x9BU+203ASINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›)
      0x9CU+0153LATIN SMALL LIGATURE OE (œ)
      0x9DU+009D<control>
      0x9EU+017ELATIN SMALL LETTER Z WITH CARON (ž)
      0x9FU+0178LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ)

      否則,若數字在 0xD800 到 0xDFFF 的範圍裡,或數字大於 0x10FFFF,則這是個解析錯誤。回傳 U+FFFD REPLACEMENT CHARACTER。

      否則,回傳代碼點是該數字的 Unicode 字符的字符 token。若數字在 0x0001 到 0x0008、0x000E 到 0x001F、0x007F 到 0x009F、0xFDD0 到 0xFDEF 的範圍裡,或數字是 0x000B、0xFFFE、0xFFFF、0x1FFFE、0x1FFFF、0x2FFFE、0x2FFFF、0x3FFFE、0x3FFFF、0x4FFFE、0x4FFFF、0x5FFFE、0x5FFFF、0x6FFFE、0x6FFFF、0x7FFFE、0x7FFFF、0x8FFFE、0x8FFFF、0x9FFFE、0x9FFFF、0xAFFFE、0xAFFFF、0xBFFFE、0xBFFFF、0xCFFFE、0xCFFFF、0xDFFFE、0xDFFFF、0xEFFFE、0xEFFFF、0xFFFFE、0xFFFFF、0x10FFFE 或 0x10FFFF 其中之一,則這是個解析錯誤

      ↪ 其他字符
      吃掉最多個能批配命名字符引用表格裡第一欄任一標識符的字符(以區分大小寫的方式)。

      若不能批配,則不吃掉任何字符,並回傳空值。在這種情況下,若 U+0026 AMPERSAND 字符(&)後面的字符為一個長度大於等於一的由 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)、U+0061 LATIN SMALL LETTER A 到 U+007A LATIN SMALL LETTER Z、U+0041 LATIN CAPITAL LETTER A 到 U+005A LATIN CAPITAL LETTER Z 的字符組成的串列,且後面接著 U+003B SEMICOLON 字符(;),則這是個解析錯誤

      若正被吃掉的字符引用是屬性的一部分,且批配的最後一個字符不是 U+003B SEMICOLON 字符(;),且下一個字符是 U+003D EQUALS SIGN 字符(=)或是由 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)、U+0061 LATIN SMALL LETTER A 到 U+007A LATIN SMALL LETTER Z、U+0041 LATIN CAPITAL LETTER A 到 U+005A LATIN CAPITAL LETTER Z 其一,則由於歷史因素使用者代理必須吐出 U+0026 AMPERSAND 字符(&)後面已批配的字符,並回傳空值。

      否則,成功解析字符引用。若批配的最後一個字符不是 U+003B SEMICOLON 字符(;),則這是個解析錯誤

      回傳對應字符引用名稱的一個或兩個字符 token(命名字符引用表格裡第二欄)。

      若原始碼裡面(不在屬性裡)有字串 I'm &notit; I tell you,則使用者代理會將這個字符引用當成 "not" 解析,也就是 I'm ¬it; I tell you(且這是一個解析錯誤)。但是若原始碼是 I'm ∉ I tell you,則使用者代理會將這個字符引用當成 "notin;" 解析,結果成為 I'm ∉ I tell you(且不是解析錯誤)。

      樹建構

      解析 HTML 內容內的 token 的規則
      插入模式:「IN HEAD」
      標籤名是 "meta" 的開始標籤

      若元素有 charset 屬性,且取值為使用者代理支援的 ASCII 兼容的字符編碼

      Error creating thumbnail: Unable to save thumbnail to destination
      或一個 UTF-16 編碼且可信度目前為「暫時」,則變更編碼charset 屬性取值對應的編碼。

      否則

      Error creating thumbnail: Unable to save thumbnail to destination
      ,若元素有 http-equiv 屬性且其取值 ASCII 不分大小寫批配 "Content-Type" 字串,且有 content 屬性,且對屬性的取值使用meta 元素萃取編碼的演算法可以得到使用者代理支援的 ASCII 兼容的字符編碼或一個 UTF-16 編碼且可信度目前為「暫時」,則變更編碼成萃取出來的編碼。

      序列化 HTML 区段

      解析 HTML 区段

      命名字符参考

      XHTML语法

      渲染

      用户代理不需用任何特定方式呈现HTML文档。然而本节内容提供了一个渲染HTML文档的建议,如果服从这个建议,很可能引导用户体验一致,且非常接近文档作者的意图。为了避免混淆本节内容的规范性,RFC2119 中的术语都没有被使用,相反的“预期”这个术语是用来表示引导一致用户体验的象征行为。对于指定为支持建议默认渲染的用户代理,术语“预期”在本节中具有和 RFC2119 定义的术语“必须”相同的一致性含义。

      介紹

      本規範預期一般的使用者代理支援 CSS,也因此本章節給的所有建議都使用 CSS 用語。使用其他表象機制的使用者代理可以由本章節提供的 CSS 規則導出其他機制的規則。

      在使用者代理支援 CSS 但是尚未有樣式層的規則(例如網頁作者樣式)時,本規範預期使用者代理按照本規範描述的渲染各元素,以將元素代表的概念呈現給使用者。

      本章節的各項建議一般假設使用者代理有解析度大於 96dpi 的視覺輸出媒介,但 HTML 適用於多媒介(它是個「不分媒介」的語言),因此本規範鼓勵使用者代理就目標媒介調整本章節的各項建議。

      本規範定義「使用者代理渲染一個元素」為,該元素Document,且它是一個 Document 節點或屬性使用者代理渲染它的父節點,而且以下三個方法沒有阻止該元素的渲染過程:

      • CSS 的 'display' 屬性設為 'none' 值
      • 不被解釋成 'hidden' 的 'visibility' 屬性的 'collapse' 值
      • 其他樣式語言的類似機制
      注:就算一個元素在畫面外也不代表使用者代理未渲染該元素。使用者代理一般不會渲染一個具有 hidden 屬性的元素,但是樣式表可以覆蓋這個設定。

      CSS 使用者代理樣式表與表象呈現提示

      介紹

      除非特別註明,本規範預期使用者代理將這幾個小節的 CSS 規則作為對於含有 HTML 元素文件的預設使用者代理層樣式表的一部分。
      Error creating thumbnail: Unable to save thumbnail to destination
      Error creating thumbnail: Unable to save thumbnail to destination

      有些規則是作為 CSS 層疊作者層無特異性的表象呈現提示的部份,本規範會註明這些規則為表象呈現提示

      顯示形態

      邊距與邊白

      對齊

      字體與顏色

      @namespace url(http://www.w3.org/1999/xhtml);
      
      address, cite, dfn, em, i, var { font-style: italic; }
      b, strong, th { font-weight: bold; }
      code, kbd, listing, plaintext, pre, samp, tt, xmp { font-family:  monospace; }
      h1 { font-size: 2.00em; font-weight: bold; }
      h2 { font-size: 1.50em; font-weight: bold; }
      h3 { font-size: 1.17em; font-weight: bold; }
      h4 { font-size: 1.00em; font-weight: bold; }
      h5 { font-size: 0.83em; font-weight: bold; }
      h6 { font-size: 0.67em; font-weight: bold; }
      big { font-size: larger; }
      small, sub, sup { font-size: smaller; }
      sub, sup { line-height: normal; }
      
      :link { color: blue; }
      :visited { color: purple; }
      mark { background: yellow; color: black; }
      
      table, td, th { border-color: gray; }
      thead, tbody, tfoot, tr { border-color: inherit; }
      table[rules=none], table[rules=groups], table[rules=rows],
      table[rules=cols], table[rules=all], table[frame=void],
      table[frame=above], table[frame=below], table[frame=hsides],
      table[frame=lhs], table[frame=rhs], table[frame=vsides],
      table[frame=box], table[frame=border],
      table[rules=none] > tr > td, table[rules=none] > tr > th,
      table[rules=groups] > tr > td, table[rules=groups] > tr > th,
      table[rules=rows] > tr > td, table[rules=rows] > tr > th,
      table[rules=cols] > tr > td, table[rules=cols] > tr > th,
      table[rules=all] > tr > td, table[rules=all] > tr > th,
      table[rules=none] > thead > tr > td, table[rules=none] > thead > tr > th,
      table[rules=groups] > thead > tr > td, table[rules=groups] > thead > tr > th,
      table[rules=rows] > thead > tr > td, table[rules=rows] > thead > tr > th,
      table[rules=cols] > thead > tr > td, table[rules=cols] > thead > tr > th,
      table[rules=all] > thead > tr > td, table[rules=all] > thead > tr > th,
      table[rules=none] > tbody > tr > td, table[rules=none] > tbody > tr > th,
      table[rules=groups] > tbody > tr > td, table[rules=groups] > tbody > tr > th,
      table[rules=rows] > tbody > tr > td, table[rules=rows] > tbody > tr > th,
      table[rules=cols] > tbody > tr > td, table[rules=cols] > tbody > tr > th,
      table[rules=all] > tbody > tr > td, table[rules=all] > tbody > tr > th,
      table[rules=none] > tfoot > tr > td, table[rules=none] > tfoot > tr > th,
      table[rules=groups] > tfoot > tr > td, table[rules=groups] > tfoot > tr > th,
      table[rules=rows] > tfoot > tr > td, table[rules=rows] > tfoot > tr > th,
      table[rules=cols] > tfoot > tr > td, table[rules=cols] > tfoot > tr > th,
      table[rules=all] > tfoot > tr > td, table[rules=all] > tfoot > tr > th { /*case-insensitive */
        border-color: black;
      }
      

      標點符號與裝飾

      繼承屬性的重設規則

      hr 元素

      fieldset 元素

      置換元素

      綁定

      框架與框架集

      互動媒介

      印刷媒介

      废弃的特性

      废弃但符合规范的特性

      本章節不具有實作相關內容

      对废弃但符合规范的特性进行警告

      非标准特性

      本章節不具有實作相關內容

      实施需求

      applet元素

      applet元素是Java特有的,它是embed元素的变体。applet元素现在已经被废弃,以便所有的扩展框架(如Java,.NET, Flash等等)能够以一致的方式进行处理。

      当此元素仍然出现在HTML解析器(HTML parser)XML解析器(XML parser)未闭合元素栈(stack of open elements)中时;当此元素没有出现在Document中(in a Document)时;当此元素所在的文档还未完全激活(fully active);当此元素所在文档被创建时,该文档浏览环境(browsing context)具有它的沙箱插件浏览环境标识(snadboxed plugins browsing context);当此元素所在的文档(Document)由一个sniffed type导航(navigation)期间被确认为text/html-sandboxed的资源解析而来时;当此元素包含一个media element的前身时;当此元素包含一个没有处于正在呈现它的fallback content状态时的object元素的前身时;当Java语言的运行时插件(plugin)不可用时;当Java运行时插件存在,但它却被禁用时;此元素将呈现(represents)等同于它所要表达给用户的的内容。

      否则,user agent应该实例化一个Java语言的运行时插件(plugin),并将此元素的所有属性名和属性值传递进去,它们将按照源码解析时属性加入的顺序添加到此元素上,然后是一个值为null的"PARAM"参数,然后是所有作为applet元素子节点的param元素提供的名字和值,这将存在tree order中,以供插件plugin使用。如果此插件支持脚本接口,HTMLAppletElement对象绘制此元素时应该将该接口暴露出去。applet元素将呈现此插件。

      注:applet元素不会被CSS的"display"属性影响。Java语言运行时即使在此元素被CSS的"display:none"样式隐藏时也会被实例化。

      applet元素必须实现HTTPAppletElement接口。

      interface HTMLAppletElement : HTMLElement {
                 attribute DOMString align;
                 attribute DOMString alt;
                 attribute DOMString archive;
                 attribute DOMString code;
                 attribute DOMString codeBase;
                 attribute DOMString height;
                 attribute unsigned long hspace;
                 attribute DOMString name;
                 attribute DOMString _object; // 底線並非標識符的一部分 
                 attribute unsigned long vspace;
                 attribute DOMString width;
      };
      

      align, alt, archive, code, height, hspace, name, object, vspace, 和 width 等IDL属性必须反映与它们各自同名属性的内容。为此,applet元素的object内容属性定义为包含一个URL

      IDL属性codeBase必须反映codebase内容属性,此属性因此目的而定义为包含一个URL

      marquee元素

      marquee是一个动态呈现内容的元素。CSS的transitions和animations会是更适合的机制。

      在本章节中提到的任务里的任务源(task source)DOM操作任务源(DOM manipulation task source)

      marquee元素必须实现HTMLMarqueeElement接口。

      interface HTMLMarqueeElement : HTMLElement {
                 attribute DOMString behavior;
                 attribute DOMString bgColor;
                 attribute DOMString direction;
                 attribute DOMString height;
                 attribute unsigned long hspace;
                 attribute long loop;
                 attribute unsigned long scrollAmount;
                 attribute unsigned long scrollDelay;
                 attribute boolean trueSpeed;
                 attribute unsigned long vspace;
                 attribute DOMString width;
      
                 attribute Function onbounce;
                 attribute Function onfinish;
                 attribute Function onstart;
      
        void start();
        void stop();
      };
      

      marquee元素可以被开启关闭,当它被创建时,默认为开启(turned on)状态。

      start()方法被调用时,marquee元素必须设置为开启(turned on)

      stop()方法被调用时,marquee元素必须设置为关闭(turned off)

      marquee元素被创建时,user agent必须做任务队列(queue a task)以便触发该元素上名为start的事件(fire a simple event)


      marquee元素上属性的内容behavior是个可枚举的属性(enumerated attribute),它包括如下关键词(全都不符合标准):

      关键词 描述
      scroll 滚动
      slide 滑动
      alternate 交替

      默认值为scroll


      marquee元素上属性的内容direction是个可枚举的属性(enumerated attribute),它包括如下关键词(全都不符合标准):

      关键词 描述
      left 向左
      right 向右
      up 向上
      down 向下

      默认值为left


      marquee元素上属性的内容truespeed是个布尔属性(boolean attribute)


      marquee元素具有一个marquee滚动间隔(marquee scroll interval),它的获取过程如下:

      1. 如果此元素有指定scrolldelay属性,且在使用非负整数解析规则(rules for parsing non-negative integers)去解析它的值时没有返回错误,则令delay的值为该解析后的值,否则,令delay值为85。
      2. 如果该元素没有指定truespeed属性,且delay值小于60,则令delay值为60。
      3. marquee滚动间隔(marquee scroll interval)即为delay的值,单位为毫秒。


      marquee元素具有一个marquee滚动的步进距离(marquee scroll distance),如果此元素指定了scrollamount属性,且在使用非负整数解析规则(rules for parsing non-negative integers)去解析它的值时没有返回错误,则该步进距离为该解析后的值,否则,步进距离为6,单位为CSS中的像素px。


      marquee元素具有一个marquee循环次数(marquee loop count),如果此元素指定了loop属性,且在使用整数解析规则(rules for parsing integers)去解析它的值时没有返回错误,或返回值小于1,则该循环次数为该解析后的值,否则,循环次数为-1。

      IDL属性loop,在获取的时候,必须返回此元素的marquee loop count;在设置的时候,如果所设的值与原有的值不同,且无论是大于0或等于-1,都必须为此元素属性的内容loop设置一个来自新值的有效整数(valid integer),其他值都应该被忽略。(如果有必要,需要为此元素加上loop属性及新值)

      marquee元素同样还具有一个marquee当前循环索引值(marquee curent loop index),当该元素被创建时,其值为0。

      渲染层将应时地增加marquee当前循环索引值(increment the marquee current loop index) ,必须使它按以下步骤来运行:

      1. 如果marquee循环次数(marquee loop count)为-1,则忽略下面这些步骤。
      2. marquee当前循环索引值(marquee current loop index)加1。
      3. 如果marquee当前循环索引值(marquee current loop index)大于等于此元素的marquee循环次数(marquee loop count),则关闭(turn off)此元素且做个任务对列(queue a task)触发该元素中名为finish的事件(fire a simple event)。<p>否则,如果该元素的behavior属性的状态为alternate,则做个任务队列触发该元素中名为bounce的事件

        否则,做个任务对列触发该元素中名为estart的事件


      以下列出的事件句柄(event handlers)(和与之对应的事件句柄事件类型(event handler event types))作为marquee元素的内容和IDL属性,必须支持:

      事件句柄 事件句柄事件类型
      onbounce 弹回(bounce)
      onfinish 结束(finish)
      onstart 开始(start)


      IDL属性behavior, direction, height, hspace, vspace, 和 width,必须能够反映与之同名属性的内容。

      IDL属性bgColor,必须能够反映bgcolor属性的内容。

      IDL属性scrollAmount,必须能够反映scrollamount属性的内容,默认值为6。

      IDL属性scrollDelay,必须能够反映scrolldelay属性的内容,默认值为85。

      IDL属性trueSpeed,必须能够反映truespeed属性的内容。

      Frames

      frameset元素在使用帧(框架)时作为documents中的body元素(the body element)

      frameset元素必须实现HTMLFrameSetElement接口。

      interface HTMLFrameSetElement : HTMLElement {
                 attribute DOMString cols;
                 attribute DOMString rows;
                 attribute Function onafterprint;
                 attribute Function onbeforeprint;
                 attribute Function onbeforeunload;
                 attribute Function onblur;
                 attribute Function onerror;
                 attribute Function onfocus;
                 attribute Function onhashchange;
                 attribute Function onload;
                 attribute Function onmessage;
                 attribute Function onoffline;
                 attribute Function ononline;
                 attribute Function onpagehide;
                 attribute Function onpageshow;
                 attribute Function onpopstate;
                 attribute Function onredo;
                 attribute Function onresize;
                 attribute Function onscroll;
                 attribute Function onstorage;
                 attribute Function onundo;
                 attribute Function onunload;
      };
      

      frameset元素的IDL属性colsrows必须反映与之同名属性的内容。

      frameset元素必须支持以下的事件句柄内容属性(event handler content attribute),暴露Window对象的事件句柄(event handlers)

      该DOM接口同时也暴露事件句柄IDL属性(event handler IDL attributes),将它们镜像到Window元素上。

      暴露到frameset元素上的那些Window对象上的事件句柄IDL属性onblur, onerror, onfocus, onload, 和 onscroll等,将覆盖通常被HTML元素(HTML elements)支持的同名的事件句柄IDL属性(event handler IDL attributes)


      frame元素定义了一个嵌套的浏览环境(nested browsing context),类似于iframe元素,但它渲染在frameset对象中。

      当此浏览环境被创建时,如果出现了一个src属性,那么user agent必须决定(resolve)相对于该元素的属性值,如果成功,则必须将该元素的浏览环境导航(navigate)绝对路径(absolute URL)的结果中,作为可替换的,且与该frame元素所在文档的浏览环境(browsing context)一起,作为源浏览环境(source browsing context)

      无论src属性在什么时候被设置,user agent必须给它一个相对于该元素的结果,如果成功的话,嵌套的浏览环境(browsing context)必须被导航(navigated)绝对路径(absolute URL)的结果中去,与该frame元素所在文档的浏览环境(browsing context)一起,作为源浏览环境(source browsing context)

      当此浏览环境被创建时,如果出现一个name属性,则浏览环境名称(browsing context name)必须设置为该属性的值;否则,该浏览环境名称(browsing context name)必须设置为空字符串。

      无论name属性在什么时候被设置,嵌套的浏览环境(browsing context)名称(name)必须设置为新的值。如果该属性被移除,那么,浏览环境名称(browsing context name)必须设置为空字符串。

      当一个frame里的内容被载入时,在内容本身的任何load事件被触发后,user agent必须做个任务队列(queue a task),去触发此frame元素上名为load的事件(fire a simple event)。当内容载入失败时(比如,因为网络错误等),user agent必须做个任务队列(queue a task)触发此元素上名为error的事件(fire a simple event)

      上面提到的任务(tasks)中的任务源(task source)是指DOM manipulation task source

      frame元素中有一个活动的解析器(active parser)时,且当此frame元素中有任何东西使该元素浏览环境(browsing content)活动文档(active document)load事件延迟时(delaying the load event),此frame必须延迟它的文档的load事件(delay the load event)

      frame元素必须实现HTMLFrameElement接口:

      interface HTMLFrameElement : HTMLElement {
                 attribute DOMString frameBorder;
                 attribute DOMString longDesc;
                 attribute DOMString marginHeight;
                 attribute DOMString marginWidth;
                 attribute DOMString name;
                 attribute boolean noResize;
                 attribute DOMString scrolling;
                 attribute DOMString src;
        readonly attribute Document contentDocument;
        readonly attribute WindowProxy contentWindow;
      };
      

      frame元素的IDL属性name, scrollingsrc,必须反映(reflect)与之同名属性的内容。

      frame元素的IDL属性frameBorder,必须反映(reflect)该元素frameborder属性的内容。

      frame元素的IDL属性longDesc,必须反映(reflect)该元素longdesc属性的内容,为此,它被定义为包含一个URL

      frame元素的IDL属性marginHeight,必须反映(reflect)该元素marginheight属性的内容。

      frame元素的IDL属性marginWidth,必须反映(reflect)该元素marginwidth属性的内容。

      frame元素的IDL属性noResize,必须反映(reflect)该元素noresize属性的内容。

      frame元素的IDL属性contentDocument,必须反映(reflect)该元素嵌套浏览环境(nested browsing context)活动文本(active document)Document对象。

      IDL属性contentWindow,必须返回frame元素嵌套浏览环境(nested browsing context)WindowProxy对象。

      其他元素,属性和API

      user agents在某种程度上来说,就语义化和渲染效果方面,必须采取与abbr相同的方式来对待acronym元素。


      [Supplemental]
      interface HTMLAnchorElement {
                 attribute DOMString coords;
                 attribute DOMString charset;
                 attribute DOMString name;
                 attribute DOMString rev;
                 attribute DOMString shape;
      };
      

      a元素的IDL属性coords, charset, name, revshape,必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLAreaElement {
                 attribute boolean noHref;
      };
      

      area元素的IDL属性noHref必须能够反映nohref元素属性的内容。


      basefont元素必须实现HTMLBaseFontElement接口:

      interface HTMLBaseFontElement : HTMLElement {
                 attribute DOMString color;
                 attribute DOMString face;
                 attribute long size; 
      };
      

      basefont元素的IDL属性color, facesize,必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLBodyElement {
                 attribute DOMString text;
                 attribute DOMString bgColor;
                 attribute DOMString background;
                 attribute DOMString link;
                 attribute DOMString vLink;
                 attribute DOMString aLink;
      };
      

      body元素的IDL属性text必须能够反映(reflect)该元素的text属性的内容。

      body元素的IDL属性bgColor必须能够反映(reflect)该元素的bgcolor属性的内容。

      body元素的IDL属性background必须能够反映(reflect)该元素的background属性的内容。(background属性没有定义为包含URL,无视之前渲染章节中关于它的规则。)

      body元素的IDL属性link必须能够反映(reflect)该元素的link属性的内容。

      body元素的IDL属性aLink必须能够反映(reflect)该元素的alink属性的内容。

      body元素的IDL属性vLink必须能够反映(reflect)该元素的vlink属性的内容。


      [Supplemental]
      interface HTMLBRElement {
                 attribute DOMString clear;
      };
      

      br元素的IDL属性clear必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLTableCaptionElement {
                 attribute DOMString align;
      };
      

      caption元素的IDL属性align必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLTableColElement {
                 attribute DOMString align;
                 attribute DOMString ch;
                 attribute DOMString chOff;
                 attribute DOMString vAlign;
                 attribute DOMString width;
      };
      

      col元素的IDL属性alignwidth必须能够反映(reflect)与之同名属性的内容。

      col元素的IDL属性ch必须能够反映(reflect)该元素的char属性的内容。

      col元素的IDL属性chOff必须能够反映(reflect)该元素的charoff属性的内容。

      col元素的IDL属性vAlign必须能够反映(reflect)该元素的valign属性的内容。


      user agents在某种程度上来说,就语义化和渲染效果方面,必须采取与ul相同的方式来对待dir元素。

      dir元素必须实现HTMLDirectoryElement接口:

      interface HTMLDirectoryElement : HTMLElement {
                 attribute boolean compact;
      };
      

      dir元素的IDL属性compact必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLDivElement {
                 attribute DOMString align;
      };
      

      div元素的IDL属性align必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLDListElement {
                 attribute boolean compact;
      };
      

      dl元素的IDL属性compact必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLEmbedElement {
                 attribute DOMString align;
                 attribute DOMString name;
      };
      

      embed元素的IDL属性namealign必须能够反映(reflect)与之同名属性的内容。


      font元素必须实现HTMLFontElement接口:

      interface HTMLFontElement : HTMLElement {
                 attribute DOMString color;
                 attribute DOMString face;
                 attribute DOMString size; 
      };
      

      font元素的IDL属性color, facesize 必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLHeadingElement {
                 attribute DOMString align;
      };
      

      h1 - h6元素的IDL属性align必须能够反映(reflect)与之同名属性的内容。


      注:{{{1}}}


      [Supplemental]
      interface HTMLHRElement {
                 attribute DOMString align;
                 attribute DOMString color;
                 attribute boolean noShade;
                 attribute DOMString size;
                 attribute DOMString width;
      };
      

      hr元素的IDL属性align, color, sizewidth 必须能够反映(reflect)与之同名属性的内容。

      hr元素的IDL属性noShade必须能够反映(reflect)该元素的noshade属性的内容。


      [Supplemental]
      interface HTMLHtmlElement {
                 attribute DOMString version;
      };
      

      html元素的IDL属性 version 必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLIFrameElement {
                 attribute DOMString align;
                 attribute DOMString frameBorder;
                 attribute DOMString longDesc;
                 attribute DOMString marginHeight;
                 attribute DOMString marginWidth;
                 attribute DOMString scrolling;
      };
      

      iframe元素的IDL属性alignscrolling 必须能够反映(reflect)与之同名属性的内容。

      iframe元素的IDL属性frameBorder必须能够反映(reflect)该元素的frameborder属性的内容。

      iframe元素的IDL属性longDesc必须能够反映(reflect)该元素的longdesc属性的内容。

      iframe元素的IDL属性marginHeight必须能够反映(reflect)该元素的marginHeight属性的内容。

      iframe元素的IDL属性marginWidth必须能够反映(reflect)该元素的marginWidth属性的内容。


      [Supplemental]
      interface HTMLImageElement {
                 attribute DOMString name;
                 attribute DOMString align;
                 attribute DOMString border;
                 attribute unsigned long hspace;
                 attribute DOMString longDesc;
                 attribute unsigned long vspace;
      };
      

      img元素的IDL属性name, align, border, spacespace 必须能够反映(reflect)与之同名属性的内容。

      img元素的IDL属性longDesc必须能够反映(reflect)该元素的longdesc内容属性,因此,它被定义为包含一个URL


      [Supplemental]
      interface HTMLInputElement {
                 attribute DOMString align;
                 attribute DOMString useMap;
      };
      

      input元素的IDL属性align必须能够反映(reflect)与之同名属性的内容。

      input元素的IDL属性useMap必须能够反映(reflect)该元素的usemap属性的内容。


      [Supplemental]
      interface HTMLLegendElement {
                 attribute DOMString align;
      };
      

      legend元素的IDL属性align必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLLIElement {
                 attribute DOMString type;
      };
      

      li元素的IDL属性type必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLLinkElement {
                 attribute DOMString charset;
                 attribute DOMString rev;
                 attribute DOMString target;
      };
      

      link元素的IDL属性charset, revtarget 必须能够反映(reflect)与之同名属性的内容。


      user agents在某种程度上来说,就语义化和渲染效果方面,必须采取与pre相同的方式来对待listing元素。


      [Supplemental]
      interface HTMLMenuElement {
                 attribute boolean compact;
      };
      

      menu元素的IDL属性compact必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLMetaElement {
                 attribute DOMString scheme;
      };
      

      user agents大可将meta元素上的内容属性scheme,当作为该元素内容属性name的扩展,当在处理一个meta元素,且它的name属性值为user agent认定为可支持scheme属性的内容时。

      user agents被鼓励可以忽略scheme属性,且被替代为处理给予元数据名称的值,如果它被指定为所有scheme属性预期的值。

      比如,如果user agent在name属性值为"eGMS.subject.keyword"的meta元素上发生行为,并且知道scheme属性使用此元数据名称,那么,可以考虑,将scheme属性,看作为name属性的扩展。因此,下面两个meta元素可视为两个不同的元数据提供了两个名字,一个是由"eGMS.subject.keyword"和"LGGC"组合而成,另一个是由"eGMS.subject.keyword"和"ORLY"组合而成:

      <!-- 此标记是无效的 -->
      <meta name="eGMS.subject.keyword" scheme="LGCL" content="Abandoned vehicles">
      <meta name="eGMS.subject.keyword" scheme="ORLY" content="Mah car: kthxbye">
      

      以上是按此标记建议的处理,然而,它应该与下面的内容相同:

      <meta name="eGMS.subject.keyword" content="Abandoned vehicles">
      <meta name="eGMS.subject.keyword" content="Mah car: kthxbye">
      

      meta元素的IDL属性scheme,必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLObjectElement {
                 attribute DOMString align;
                 attribute DOMString archive;
                 attribute DOMString border;
                 attribute DOMString code;
                 attribute DOMString codeBase;
                 attribute DOMString codeType;
                 attribute boolean declare;
                 attribute unsigned long hspace;
                 attribute DOMString standby;
                 attribute unsigned long vspace;
      };
      

      object元素的IDL属性align, archive, border, code, declare, hspace, standbyvspace,必须能够反映(reflect)与之同名属性的内容。

      object元素的IDL属性codeBase,必须能够反映(reflect)该元素的codebase属性的内容,为此,它被定义为包含一个URL

      object元素的IDL属性codeType,必须能够反映(reflect)该元素的codetype属性的内容。


      [Supplemental]
      interface HTMLOListElement {
                 attribute boolean compact;
      };
      

      ol元素的IDL属性compact,必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLParagraphElement {
                 attribute DOMString align;
      };
      

      p元素的IDL属性align,必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLParamElement {
                 attribute DOMString type;
                 attribute DOMString valueType;
      };
      

      param元素的IDL属性type,必须能够反映(reflect)与之同名属性的内容。

      param元素的IDL属性valueType,必须能够反映(reflect)该元素的valuetype属性的内容。


      user agents在某种程度上来说,就语义化和渲染效果方面,必须采取与pre相同的方式来对待plaintext元素。(虽然解析器对此元素存在特殊行为。)


      [Supplemental]
      interface HTMLPreElement {
                 attribute unsigned long width;
      };
      

      pre元素的IDL属性width,必须能够反映(reflect)与之同名属性的内容。


      [Supplemental]
      interface HTMLScriptElement {
                 attribute DOMString event;
                 attribute DOMString htmlFor;
      };
      

      script元素的IDL属性eventhtmlFor,在取值时,必须返回空字符串,在设值的时候什么都不做。


      [Supplemental]
      interface HTMLTableElement {
                 attribute DOMString align
                 attribute DOMString bgColor
                 attribute DOMString cellPadding
                 attribute DOMString cellSpacing
                 attribute DOMString frame
                 attribute DOMString rules
                 attribute DOMString summary
                 attribute DOMString width
      };
      

      table元素的IDL属性align, frame, summary, ruleswidth,必须能够反映(reflect)与之同名属性的内容。

      table元素的IDL属性bgColor,必须能够反映(reflect)该元素的bgcolor属性的内容。

      table元素的IDL属性cellPadding,必须能够反映(reflect)该元素的cellPadding属性的内容。

      table元素的IDL属性cellSpacing,必须能够反映(reflect)该元素的cellSpacing属性的内容。


      [Supplemental]
      interface HTMLTableSectionElement {
                 attribute DOMString align;
                 attribute DOMString ch;
                 attribute DOMString chOff;
                 attribute DOMString vAlign;
      };
      

      tbody, thead, tfoot元素的IDL属性align,必须能够反映(reflect)与之同名属性的内容。

      tbody, thead, tfoot元素的IDL属性ch,必须能够反映(reflect)元素上char属性的内容。

      tbody, thead, tfoot元素的IDL属性charOff,必须能够反映(reflect)元素上charoff属性的内容。

      tbody, thead, tfoot元素的IDL属性vAlign,必须能够反映(reflect)元素上valign属性的内容。


      [Supplemental]
      interface HTMLTableCellElement {
                 attribute DOMString abbr;
                 attribute DOMString align;
                 attribute DOMString axis;
                 attribute DOMString bgColor;
                 attribute DOMString ch;
                 attribute DOMString chOff;
                 attribute DOMString height;
                 attribute boolean noWrap;
                attribute DOMString vAlign;
                 attribute DOMString width;
      };
      

      td, th元素的IDL属性abbr, align, axis, heightwidth,必须能够反映(reflect)与之同名属性的内容。

      td, th元素的IDL属性bgColor,必须能够反映(reflect)元素上bgcolor属性的内容。

      td, th元素的IDL属性ch,必须能够反映(reflect)元素上char属性的内容。

      td, th元素的IDL属性chOff,必须能够反映(reflect)元素上charoff属性的内容。

      td, th元素的IDL属性noWrap,必须能够反映(reflect)元素上nowrap属性的内容。

      td, th元素的IDL属性vAlign,必须能够反映(reflect)元素上valign属性的内容。


      [Supplemental]
      interface HTMLTableRowElement {
                 attribute DOMString align;
                 attribute DOMString bgColor;
                 attribute DOMString ch;
                 attribute DOMString chOff;
                 attribute DOMString vAlign;
      };
      

      tr元素的IDL属性align,必须能够反映(reflect)与之同名属性的内容。

      tr元素的IDL属性bgColor,必须能够反映(reflect)元素上bgcolor属性的内容。

      tr元素的IDL属性ch,必须能够反映(reflect)元素上char属性的内容。

      tr元素的IDL属性chOff,必须能够反映(reflect)元素上charoff属性的内容。

      tr元素的IDL属性vAlign,必须能够反映(reflect)元素上valign属性的内容。


      [Supplemental]
      interface HTMLUListElement {
                 attribute boolean compact;
                 attribute DOMString type;
      };
      

      ul元素的IDL属性compacttype,必须能够反映(reflect)与之同名属性的内容。


      user agents在某种程度上来说,就语义化和渲染效果方面,必须采取与pre相同的方式来对待xmp元素。(虽然解析器对此元素存在特殊行为。)


      bgsound, isindex, multicol, nextid, rbspacer元素必须实现HTMLUnknownElement接口:


      [Supplemental]
      interface HTMLDocument {
                 attribute DOMString fgColor;
                 attribute DOMString bgColor;
                 attribute DOMString linkColor;
                 attribute DOMString vlinkColor;
                 attribute DOMString alinkColor;
      
        readonly attribute HTMLCollection anchors;
        readonly attribute HTMLCollection applets;
      
        void clear();
      
        readonly attribute HTMLAllCollection all;
      };
      

      以下表格中第一列所列出的这些Document属性,必须能够反映(reflect)第二列中同一行所对应的在正文元素(the body element)上给出的这些属性的内容,如果正文元素(the body element)是一个body元素(相对于frameset元素)。当此正文元素不存在或它是一个frameset元素时,这些属性转而在取值时必须返回空字符串,在设值时,什么也不做。

      IDL属性 内容属性
      fgColor text
      bgColor bgcolor
      linkColor link
      vlinkColor vlink
      alinkColor alink


      anchors属性必须返回一个植根于Document节点的HTMLCollection,过滤后仅匹配到有name属性的a元素。

      applets属性必须返回一个植根于Document节点的HTMLCollection,过滤后仅匹配到applet元素。

      clear()方法必须什么都不做。


      all属性必须返回一个植根于Document节点的HTMLCollection,过滤后匹配到所有的元素。

      通过all返回的对象有一些异常的行为
      Error creating thumbnail: Unable to save thumbnail to destination
      • 如果在JavaScript中调用ToBoolean()操作,user agents必须将通过all返回的对象设置为false.
      • 如果为了在JavaScript中做==!=,user agents必须将通过all返回的对象赋值为undefined
      • 如果在JavaScript中调用typeof操作应用在通过all返回的对象上时,user agent必须令其返回字符串undefined
      注:这些需求都是有意违反(willful violation)当前正在编写的JavaScript规范(ECMAScript 第3版)的。JavaScript规范中对ToBoolean()操作的需求是将所有对象转换为true值,且,为了完成一些确定的操作,它将不为那些看似为undefined的对象提供准备。这些违反都是出于此目的,那就是,期望能够兼容两种类别的遗留内容:一种是通过document.all来检测遗留的user agents,另一种是仅支持那些遗留user agents且document.all对象不是用来进行检测的情况。[ECMA262]

      IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)考量

      索引

      参考文献

      致谢

      感谢Tim Berners-Lee发明了HTML,没有他的贡献所有这一切都不会存在。