Copyright © 2013 W3C© (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
HTML导入是一种在其他HTML文档中引入和复用HTML文档的方法。
本节介绍此文档发布时的状态。其他文档可能取代此文档。在 W3C 技术报告索引 (http://www.w3.org/TR/) 可以找到此技术报告的当前W3C发布版本和最新修订版本列表。
此文档是由 Web应用工作组 发布的编辑草案。如果你想提交关于此文档的评论,请发送至 public-webapps@w3.org (订阅,存档)。 欢迎任何反馈。
发布为编辑草案并不意味着 W3C 会员的认可。这是一个文档草案,可能在任何时候更新、覆盖或被其他文档替代。不宜在在产品中引用此文档。
此文档由 W3C 专利政策 (2004-02-05) 操作的一个小组出品。 W3C 维护一个关联此小组产出成果的 专利声明的公开名单,该页面还包含了专利公开说明书。根据 W3C 专利政策第6条,拥有专利实际知识,且相信包含基本权利的人必须公开相关信息。
所有图表,示例,备注,以及明确标记为非规范的部分都是非规范的。其他内容都是规范的。
在本文档的规范部分中的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 和 "OPTIONAL" 在 RFC2119 的描述中有解释。为了方便阅读,这些词语不会以全部大写字母出现在本规范。
任何时刻,一个符合UA必须对状态或概念模型状态的反应做决定。这被称为算法。这些算法根据等价处理定义。等价处理 是强加给算法实现者的约束。对于相同的输入,要求UA实现和指定算法的输出必须保持完全一致。
本文档依赖以下规范:
HTML导入, 或此后的 导入,是指在 HTML 文档 中作为 外部资源 链接 的 HTML 文档。 链接到一个 导入 的文档称为 导入来源。对任何给定的导入,一个 导入来源祖先 是它的 导入来源 或它的 导入来源 的任意 导入来源祖先。
一个有它自己的 浏览上下文 的 导入来源 被称为 主文档。 每个 导入 被关联到一个 主文档:如果 导入 的 来源 是一个 主文档,那么此 来源 是这个 导入 的 主文档。 否则,导入来源 的 主文档 是 导入 的 主文档。
defaultView
。
(参见 Bug 23170.)
在 导入来源 中,一个 导入 表示一个 Document
, 称为 导入文档。导入文档 没有 浏览上下文。
主文档 关联的所有 导入 形成一个 主文档 的 导入映射。 此映射以 导入地址 作为键保存 导入。导入映射一开始是空的。新的项根据 导入获取算法 被添加到此映射中。
import
"为了能在HTML中声明 导入,HTML链接类型 增加了一个新的链接类型:
import
关键字可以用于 link
元素。 此关键字创建一个 导入 的 外部资源链接。
import
关键字给资源指定的默认类型是 text/html
。
link
元素有一个 async 属性。async
属性是一个 布尔属性。
下面文档有一个导入,位于 /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
不 表示 一个 导入link
元素不 在 Document
中否则,此属性 必需 返回 导入 的 导入文档,由 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 parser 或 XML Parser 的 Document
上下文中的 导入 被称为 阻塞脚本的导入。 如果此 元素 是 Document
的解析器创建的,或者这个 元素 是一个 import
类型的 link
,而且此 link
没有被 标记为异步, 而且此导入已经 完全下载,且 事件循环 的最后时间已经到达步骤1,而且 元素 在 Document
中,而且用户代理尚未放弃此 导入。 用户代理可以随时放弃一个 导入。
放弃一个未下载或仍在下载中的导入,即脚本可以结束操作错误的信息。比如,如果一个导入注册了一个自定义元素,而某个脚本依赖此元素,如果用户代理放弃,这个脚本会发现此元素不可用。实现者必须平衡脚本使用错误信息时,什么都不做只是等待完成一个很慢的网络请求,导致影响性能的可能性。
如果在 文档
的 导入依赖 中存在 阻塞脚本的导入,那么此 文档
有可阻塞脚本的导入。否则此文档 没有阻塞脚本的导入。
每当一个导入完成下载或一个新的导入开始下载,状态 "有阻塞脚本的导入" 都会改变。在这些时刻,HTML解析器会解除阻塞。
Document
接口扩展document.open() 方法
增加如下步骤为定义的第一步:
InvalidStateError
异常。document.write()
方法增加如下步骤为定义的第一步:
InvalidStateError
异常。document.close()
方法增加如下步骤为定义的第一步:
InvalidStateError
异常。每个文档都有一个 导入链接表,其项都由 链接 构成, 包括 link
元素,URL地址。而且,项可以 标记为分支。此表开始为空,通过 导入请求 算法添加项。
一个 导入文档 有0个或多个 导入祖先。导入祖先 是一个文档。 如果文档 A 的 导入链接列表 包含一个 地址 指向文档 B 的 分支 项,那么 A 是 B 的一个 导入祖先。B 也称为 Document
的 导入父亲。导入祖先 是可传递的:如果文档 C 是文档 B 的一个 导入祖先,而文档 B 是文档 A 的一个 导入祖先,那么 C 是文档 A 的一个 导入祖先。
一个 导入文档 也有0个或多个 导入前置。 一个 导入前置 是一个文档。如果在文档 B 的 导入父亲 的 导入链接地址 里,文档 A 的URL地址位于文档 B 的URL地址之前,且定位 链接 被标记为 分支,那么 A 是 B 的 导入前置。
文档 A 的 导入祖先前置 定义如下:如果文档 B 是文档 C 的一个 导入前置,而 C 是文档 A 的一个 导入祖先,那么 B 是 A 的 一个 导入祖先前置。
如果一个 Document
是文档 A 的 导入祖先前置 或 导入前置,或者是链接到 A 的 导入链接表 的 分支 项,那么它是 A 的 导入依赖。
导入链接表 和 导入依赖 限制导入中的脚本执行顺序。每个导入中的 link
元素的顺序决定了脚本执行顺序。导入前置 的选择要知道这个顺序。
导入链接表 的链接结构形成一个有向图。每个节点是一个文档,它的边缘是一个 链接。 分支 形成一个延伸树。这个树给出了脚本执行的准确顺序。
在图中,
在一个 链接 被添加到 导入链接表 后,更新标记 算法 必需 被 主文档 执行。等价于 执行如下步骤:
当用户代理尝试 获取 一个链接导入, 它 必需 运行 导入请求 算法, 等价于 运行如下步骤:
所有链接到 主文档 或在 导入映射 中的 导入,必需使用如下描述的 导入获取算法,代替HTML规范指定的 获取链接资源 算法。
导入获取算法 必需 等价于 执行如下步骤:
当此算法完成,如果 IMPORT 不为null,则必需认为下载是成功的,否则为失败。
内容安全策略 必需通过 script-src 指令限制导入的加载。
每个导入必需被 主文档 的内容安全策略限制。 例如,如果发送 内容安全头字段 到一个导入,用户代理必需 应用 主文档 的策略到导入文档。
在 准备一个脚本 算法的第15步,修改条件“如果元素没有 src
属性”的最后部分为:
... 且 HTML parser 或 XML parser 的创建了 script
元素的 Document
,有阻塞脚本的样式 或 有阻塞脚本的导入
在 DOCTYPE 的章节部分 12.2.5.4.1 初始插入模式,修改 如果文档不是一个 iframe srcdoc 文档 ...
为如下:
如果文档不是一个 iframe srcdoc 文档,也不是一个 导入 ...
在 文本插入模式 的条件 Otherwise 的子条件“一个script结束标记”,修改步骤3为:
Document
有阻塞脚本的样式 或 有阻塞脚本的导入 或 脚本的 "准备被解析器执行" 标记没有设置,翻阅事件循环,直到解析器的 Document
没有阻塞脚本样式 和 没有阻塞脚本导入 且脚本的 "准备被解析器执行" 标记被设置。增加下述条件到 开启和关闭脚本 标准列表:
修改 document.currentScript
的定义为:
currentScript
属性,必需返回文档或文档的 导入映射 中最近初始化的脚本。当文档创建后,currentScript
属性必需初始化为 null。如果文档为 导入文档,那么它的 currentScript
始终为 null。
导入 的 style
元素和外部资源 link
元素的内容必需被当做 主文档 的 样式处理模型 的输入源。
不同文档之间的文档顺序中的 出现顺序 被定义为,比较两个元素,x,其所在文档是 Dx,和 y,其所在文档是 Dy,如下:
link
元素,Ly 是一个单独导入 Dy 的 link
元素。使用文档顺序比较两者,如果 Lx 在前,则元素 x 在前,否则 y 在前。
link
元素。比较 x 的文档顺序和 Ly,如果 x 在 Ly 前面,那么 x 也在 y 的前面。
这是一个导入树的文档顺序演示图。
在这个示例中,主文档有2个导入 B 的 导入来源祖先 的 link 元素。当比较 b1 和 m2,b1 在 m2 前面,因为在主文档中,用于比较的第一个 link
出现在 m2 的前面。
这个比较使用 导入来源祖先 概念来代替 导入祖先。这意味着移动导入 link
改变DOM结构会影响这个顺序。它遵循样式表的 style
元素和 link
元素的工作方式。
参见 Bug 24756.
修改 事件处理器内容属性 的脚本创建标准,扩展第一段:
David Hyatt 开发了 XBL 1.0,Ian Hickson 参与了 XBL 2.0 的编写。这些文献在行为依附问题上提供了巨大而深刻的见解,并极大地影响了本说明书。
Alex Russell 和他的重要远见引发了新一波围绕行为依附课题的热潮和如何在网络上应用于实践。
Dominic Cooney 和 Roland Steiner 不知疲倦的仔细研究网络平台范围内的问题,为此文档打下了坚实的基础。
编辑还要感谢 Alex Komoroske,Angelina Fabbro,Anne van Kesteren,Boris Zbarsky,Brian Kardell,Daniel Buchner,Edward O'Connor,Eric Bidelman,Erik Arvidsson,Elliott Sprehn,Gabor Krizsanits,Hayato Ito,James Simonsen,Jonas Sicking,Ken Shirriff,Neel Goyal,Olli Pettay,Rafael Weinstein,Scott Miles,Steve Orvell,Tab Atkins,William Chan,和 William Chen,感谢他们对此说明书的评论和贡献。
这个列表太短了。还有很多工作要做。请通过评审和提交bugs来参与贡献 — 不要忘了要求编辑添加你的名字到此章节。