HTML Imports 中文规范

W3C 编辑草案

当前版本
http://w3c.github.io/webcomponents/spec/imports/
最新版本
http://www.w3.org/TR/html-imports/
最新编辑草案
http://w3c.github.io/webcomponents/spec/imports/
历史版本
修订历史
https://github.com/w3c/webcomponents/commits/gh-pages/spec/imports/
参与
讨论 public-webapps@w3.org (Web Applications 工作组)
提交Bug (w3.org's Bugzilla)
编辑
Dimitri Glazkov, Google, <>
Hajime Morrita, Google, <>

摘要

HTML导入是一种在其他HTML文档中引入和复用HTML文档的方法。

文档状态

本节介绍此文档发布时的状态。其他文档可能取代此文档。在 W3C 技术报告索引 (http://www.w3.org/TR/) 可以找到此技术报告的当前W3C发布版本和最新修订版本列表。

此文档是由 Web应用工作组 发布的编辑草案。如果你想提交关于此文档的评论,请发送至 public-webapps@w3.org (订阅存档)。 欢迎任何反馈。

发布为编辑草案并不意味着 W3C 会员的认可。这是一个文档草案,可能在任何时候更新、覆盖或被其他文档替代。不宜在在产品中引用此文档。

此文档由 W3C 专利政策 (2004-02-05) 操作的一个小组出品。 W3C 维护一个关联此小组产出成果的 专利声明的公开名单,该页面还包含了专利公开说明书。根据 W3C 专利政策第6条,拥有专利实际知识,且相信包含基本权利的人必须公开相关信息。

目录

  1. 关于本文档
  2. 依赖
  3. 术语
  4. 链接类型 "import"
  5. HTMLLinkElement 接口扩展
  6. Document 接口扩展
  7. 加载导入
    1. 导入依赖
    2. 更新分支
    3. 请求导入
    4. 获取导入
    5. 导入与内容安全策略
  8. 解析导入
    1. 附加:准备一个脚本算法
    2. 附加:树构建算法
    3. 补充:解析XHTML文档
  9. 在 Imports 中编写脚本
    1. 补充:脚本启用标准
    2. 补充:document.currentScript
  10. 导入的样式处理
  11. 导入中的事件
    1. 补充:事件处理器
  12. 鸣谢

关于本文档

所有图表,示例,备注,以及明确标记为非规范的部分都是非规范的。其他内容都是规范的。

在本文档的规范部分中的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 和 "OPTIONAL" 在 RFC2119 的描述中有解释。为了方便阅读,这些词语不会以全部大写字母出现在本规范。

任何时刻,一个符合UA必须对状态或概念模型状态的反应做决定。这被称为算法。这些算法根据等价处理定义。等价处理 是强加给算法实现者的约束。对于相同的输入,要求UA实现和指定算法的输出必须保持完全一致。

依赖

本文档依赖以下规范:

术语

HTML导入, 或此后的 导入,是指在 HTML 文档 中作为 外部资源 链接HTML 文档。 链接到一个 导入 的文档称为 导入来源。对任何给定的导入,一个 导入来源祖先 是它的 导入来源 或它的 导入来源 的任意 导入来源祖先

一个有它自己的 浏览上下文导入来源 被称为 主文档。 每个 导入 被关联到一个 主文档:如果 导入来源 是一个 主文档,那么此 来源 是这个 导入主文档。 否则,导入来源主文档导入主文档

导入文档与主文档共享它的 defaultView。 (参见 Bug 23170.)

一个 导入URL 称为 导入地址

导入来源 中,一个 导入 表示一个 Document, 称为 导入文档导入文档 没有 浏览上下文

主文档 关联的所有 导入 形成一个 主文档导入映射。 此映射以 导入地址 作为键保存 导入。导入映射一开始是空的。新的项根据 导入获取算法 被添加到此映射中。

为了能在HTML中声明 导入HTML链接类型 增加了一个新的链接类型:

import 关键字可以用于 link 元素。 此关键字创建一个 导入外部资源链接

import 关键字给资源指定的默认类型是 text/html

link 元素有一个 async 属性。async 属性是一个 布尔属性

获取 资源的适当时间是,当外部资源链接 被创建或它的元素 被插入到文档中

不论 linkmedia 导入始终会被获取和应用。

下面文档有一个导入,位于 /imports/heart.html:


<!DOCTYPE html>
<html lang="en-US">
    <head>
        <title>Human Being</title>
        <link rel="import" href="/imports/heart.html">
    </head>
    <body>
        <p>What is a body without a heart?</p>
    </body>
</html>

HTMLLinkElement 接口扩展


partial interface HTMLLinkElement {
    readonly attribute Document? import;
};

import 属性 必需 返回 null,如果:

否则,此属性 必需 返回 导入导入文档,由 link 元素呈现。

每次 必需 返回相同的对象。

这是如何访问前面例子中提到的导入文档:


var link = document.querySelector('link[rel=import]');
var heart = link.import;
// Access DOM of the document in /imports/heart.html
var pulse = heart.querySelector('div.pulse');

HTML parserXML ParserDocument 上下文中的 导入 被称为 阻塞脚本的导入。 如果此 元素Document 的解析器创建的,或者这个 元素 是一个 import 类型的 link,而且此 link 没有被 标记为异步, 而且此导入已经 完全下载,且 事件循环 的最后时间已经到达步骤1,而且 元素 Document 中,而且用户代理尚未放弃此 导入。 用户代理可以随时放弃一个 导入

放弃一个未下载或仍在下载中的导入,即脚本可以结束操作错误的信息。比如,如果一个导入注册了一个自定义元素,而某个脚本依赖此元素,如果用户代理放弃,这个脚本会发现此元素不可用。实现者必须平衡脚本使用错误信息时,什么都不做只是等待完成一个很慢的网络请求,导致影响性能的可能性。

如果在 文档导入依赖 中存在 阻塞脚本的导入,那么此 文档 有可阻塞脚本的导入。否则此文档 没有阻塞脚本的导入

每当一个导入完成下载或一个新的导入开始下载,状态 "有阻塞脚本的导入" 都会改变。在这些时刻,HTML解析器会解除阻塞。

Document 接口扩展

补充 document.open() 方法

增加如下步骤为定义的第一步:

  1. 如果 Document 是一个 导入,抛出 InvalidStateError 异常。

补充 document.write() 方法

增加如下步骤为定义的第一步:

  1. 如果 Document 是一个 导入,抛出 InvalidStateError 异常。

补充 document.close() 方法

增加如下步骤为定义的第一步:

  1. 如果 Document 是一个 导入,抛出 InvalidStateError 异常。

加载 Imports

导入依赖

每个文档都有一个 导入链接表,其项都由 链接 构成, 包括 link 元素,URL地址。而且,项可以 标记为分支。此表开始为空,通过 导入请求 算法添加项。

一个 导入文档 有0个或多个 导入祖先导入祖先 是一个文档。 如果文档 A导入链接列表 包含一个 地址 指向文档 B分支 项,那么 AB 的一个 导入祖先B 也称为 Document导入父亲导入祖先 是可传递的:如果文档 C 是文档 B 的一个 导入祖先,而文档 B 是文档 A 的一个 导入祖先,那么 C 是文档 A 的一个 导入祖先

一个 导入文档 也有0个或多个 导入前置。 一个 导入前置 是一个文档。如果在文档 B导入父亲导入链接地址 里,文档 A 的URL地址位于文档 B 的URL地址之前,且定位 链接 被标记为 分支,那么 AB导入前置

文档 A导入祖先前置 定义如下:如果文档 B 是文档 C 的一个 导入前置,而 C 是文档 A 的一个 导入祖先,那么 BA 的 一个 导入祖先前置

如果一个 Document 是文档 A导入祖先前置导入前置,或者是链接到 A导入链接表分支 项,那么它是 A导入依赖

导入链接表导入依赖 限制导入中的脚本执行顺序。每个导入中的 link 元素的顺序决定了脚本执行顺序。导入前置 的选择要知道这个顺序。

导入链接表 的链接结构形成一个有向图。每个节点是一个文档,它的边缘是一个 链接分支 形成一个延伸树。这个树给出了脚本执行的准确顺序。

一个导入链接表的示例。

在图中,

导入来源导入父亲 的区别是 导入来源 体现了 节点树 的状态,而 导入父亲 则是由此文档中的算法创造的。

更新分支

在一个 链接 被添加到 导入链接表 后,更新标记 算法 必需主文档 执行。等价于 执行如下步骤:

输入
DOCUMENT文档对象
  1. 如果 DOCUMENT主文档,取消 DOCUMENT导入链接表 中所有 链接分支 标记, 所有 导入 都被关联到 DOCUMENT
  2. 定义 LIST 等于 DOCUMENT导入链接表
  3. 对于 LIST 中的每个 ITEM
    1. 定义 LOCATION 等于 ITEM地址
    2. 定义 IMPORT 为一个 URL 等于 LOCATION导入
    3. 如果没有其他的 链接地址LOCATION 相同且被标记为 分支,则标记 ITEM 为一个 分支
    4. 如果 ITEM 被标记为 分支IMPORT 不等于 null, 调用 IMPORT更新标记 算法。

请求导入

当用户代理尝试 获取 一个链接导入, 它 必需 运行 导入请求 算法, 等价于 运行如下步骤:

输入
LINK,建立到导入的 外部资源链接link 元素。
LOCATION,链接资源的 URL
  1. 如果 LINKasync 属性为 true, 则标记 LINK异步
  2. 定义 DOCUMENTLINK 的一个文档。
  3. 定义 LISTDOCUMENT导入链接表
  4. 定义 ITEMLINKLOCATION
    1. 添加 ITEMLIST 的末尾。
    2. 调用 主文档更新标记 算法。

获取导入

所有链接到 主文档 或在 导入映射 中的 导入必需使用如下描述的 导入获取算法,代替HTML规范指定的 获取链接资源 算法。

导入获取算法 必需 等价于 执行如下步骤:

输入
LINK,建立到导入的 外部资源链接link 元素。
LOCATION导入地址
输出
IMPORT导入文档
  1. 如果 LOCATION 已在 导入映射 中:
    1. 赋值 IMPORT 等于 LOCATION 对应的 导入文档,然后停止
  2. LOCATION 获取资源,设置请求的 主文档模式CORS证书模式same-origin
    1. 如果获取的 响应类型错误
      • 添加 LOCATIONnull导入映射,然后停止
    2. 赋值 IMPORT 为一个新的 Document对象,其文档地址 等于 LOCATION
    3. 赋值 PARSER 为一个新的 HTML parser,与 IMPORT 相关。
    4. 添加 LOCATIONIMPORT导入映射
    5. 当每个 任务队列 里的 网络任务源 任务 获取资源时:
      1. 用获取的字节数据填充 PARSER输入字节流
      2. 使用 utf-8一种已知确定的编码),处理 PARSER输入字节流
    6. 当已没有有效字节数据:
      1. PARSER网络任务源 产生一个队列任务,处理隐含的 EOF 字符。
所有已经加载和正在加载的导入都在 导入链接表 中,因此,所有链接到此表中的导入的 导入 也会使用 导入获取算法 被下载,其 LOCATION 是导入的 导入地址

当此算法完成,如果 IMPORT 不为null,则必需认为下载是成功的,否则为失败。

每个没有被 标记为异步 的导入会 延迟文档的加载事件

link 元素成功下载后,会发送一个简单的 load 事件。下载失败则发送一个简单的 error 事件。

因为导入会延迟加载事件,Document 不会 完全下载,直到它链接的所有导入都下载完成。

导入和内容安全策略

内容安全策略 必需通过 script-src 指令限制导入的加载。

每个导入必需主文档 的内容安全策略限制。 例如,如果发送 内容安全头字段 到一个导入,用户代理必需 应用 主文档 的策略到导入文档。

解析导入

导入 的解析行为被定义为 HTML解析 的一组改变。

补充:准备一个脚本算法

准备一个脚本 算法的第15步,修改条件“如果元素没有 src 属性”的最后部分为:

... 且 HTML parserXML parser 的创建了 script 元素的 Document有阻塞脚本的样式有阻塞脚本的导入

补充:树构建算法

在 DOCTYPE 的章节部分 12.2.5.4.1 初始插入模式,修改 如果文档不是一个 iframe srcdoc 文档 ... 为如下:

如果文档不是一个 iframe srcdoc 文档,也不是一个 导入 ...

文本插入模式 的条件 Otherwise 的子条件“一个script结束标记”,修改步骤3为:

  1. 如果解析器的 Document 有阻塞脚本的样式有阻塞脚本的导入脚本"准备被解析器执行" 标记没有设置,翻阅事件循环,直到解析器的 Document 没有阻塞脚本样式没有阻塞脚本导入 且脚本的 "准备被解析器执行" 标记被设置。

补充:解析XHTML文档

修改运行 准备 script 元素的第3步如下:

  1. 翻阅事件循环,直至解析器的 Document 没有阻塞脚本的样式没有阻塞脚本的导入等待解析块脚本"准备被解析器执行" 标记被设置。

在导入中编写脚本

补充:脚本启用标准

增加下述条件到 开启和关闭脚本 标准列表:

补充:document.currentScript

修改 document.currentScript 的定义为:

currentScript 属性,必需返回文档或文档的 导入映射 中最近初始化的脚本。当文档创建后,currentScript 属性必需初始化为 null。如果文档为 导入文档,那么它的 currentScript 始终为 null。

导入的样式处理

导入style 元素和外部资源 link 元素的内容必需被当做 主文档样式处理模型 的输入源。

不同文档之间的文档顺序中的 出现顺序 被定义为,比较两个元素,x,其所在文档是 Dx,和 y,其所在文档是 Dy,如下:

这是一个导入树的文档顺序演示图。

在这个示例中,主文档有2个导入 B导入来源祖先link 元素。当比较 b1m2b1m2 前面,因为在主文档中,用于比较的第一个 link 出现在 m2 的前面。

一个导入树中不同文档样式的文档顺序示例。

这个比较使用 导入来源祖先 概念来代替 导入祖先。这意味着移动导入 link 改变DOM结构会影响这个顺序。它遵循样式表的 style 元素和 link 元素的工作方式。

参见 Bug 24756.

导入中的事件

导入 中的事件被定义为一组 HTML事件 改变。

附加:事件处理器

修改 事件处理器内容属性 的脚本创建标准,扩展第一段:

当设置一个事件处理器内容属性时,如果这个元素属于一个在 浏览上下文导入映射 中的 文档,...

鸣谢

David Hyatt 开发了 XBL 1.0Ian Hickson 参与了 XBL 2.0 的编写。这些文献在行为依附问题上提供了巨大而深刻的见解,并极大地影响了本说明书。

Alex Russell 和他的重要远见引发了新一波围绕行为依附课题的热潮和如何在网络上应用于实践。

Dominic CooneyRoland Steiner 不知疲倦的仔细研究网络平台范围内的问题,为此文档打下了坚实的基础。

编辑还要感谢 Alex KomoroskeAngelina FabbroAnne van KesterenBoris ZbarskyBrian KardellDaniel BuchnerEdward O'ConnorEric BidelmanErik ArvidssonElliott SprehnGabor KrizsanitsHayato ItoJames SimonsenJonas SickingKen ShirriffNeel GoyalOlli PettayRafael WeinsteinScott MilesSteve OrvellTab AtkinsWilliam Chan,和 William Chen,感谢他们对此说明书的评论和贡献。

这个列表太短了。还有很多工作要做。请通过评审和提交bugs来参与贡献 — 不要忘了要求编辑添加你的名字到此章节。