HTML 导入是一种在其他 HTML 文档中包含和复用 HTML 文档的方式 [HTML].
本节描述本文档在发布时的状态。当前的 W3C 出版物列表以及本技术报告的最新修订版可在 https://w3org.cn/TR/ 的 W3C 技术报告索引 中找到。
本文件由 Web Applications Working Group 以 已停止草案 形式发布,使用 推荐轨道。
以已停用草案形式发布并不意味着得到 W3C 及其成员的认可。
以停止草案的形式发布意味着该文档不再计划推进或维护。引用此文档时应视为已废弃的工作。
本文件由遵循 W3C 专利政策 的小组制作。W3C 维护一份 公开的专利披露列表,列出与小组交付物相关的专利披露;该页面还包括披露专利的指南。任何实际了解其认为包含 必要权利要求 的专利的个人,必须依据 W3C 专利政策第 6 节进行披露。
本文档受 2021 年 11 月 2 日的 W3C 流程文档管辖。
除了标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MAY 与 MUST 应按照 BCP 14 [RFC2119] [RFC8174] 的说明进行解释,仅当它们全大写出现时(如本文所示)。
任何点,当符合规范的 UA 必须对概念模型的状态或对状态的反应作出决定时,都被捕获为 算法。这些算法以 处理等价性 为定义依据。处理等价性 是对算法实现者施加的约束,要求 UA 实现的算法与规范中规定的算法在所有输入下的输出完全相同。
HTML 导入(或下文简称 imports)是 HTML 文档 [HTML],它们被 链接 为 外部资源,来源于另一个 HTML 文档。链接到 import 的文档称为 import referrer。对于任意给定的 import,其 import referrer ancestor 要么是它的 import referrer,要么是该 import referrer 的任何 import referrer ancestor。由于同一 import 可以从多个 import referrer 被引用,因此每个 import 都拥有一个或多个 import referrers 与 import referrer ancestors。
一个 import referrer 并非 import,即它不关联任何 import referrer,此类文档称为 主文档。每个 import 与唯一的 主文档 关联:如果该 referrer 本身是 主文档,则它就是该 import 的 主文档。否则,该 import referrer 的 主文档 即为该 import 的 主文档。
一个 URL 被称为 import location。
在每个 import referrer 中,import 以 Document [WHATWG-DOM] 的形式表现,称为 imported document。
导入的文档并不存在 浏览上下文。
与 主文档 关联的所有 import 组成该 主文档 的 import map。该映射以 import location 为键,import 为值进行存储。映射在开始时为空;在 import fetching algorithm 指定时会向映射添加新项。
为了跟踪 已请求 的 import,每个文档都有一个 import link list。每个条目由 link(即 link 元素)以及 location(URL)组成。条目还可以 标记为分支。列表起始为空,条目按 import request 算法的规定加入。
每个 imported document 都有一个 import parent:如果文档 A 的 import link list 包含一个标记为 分支 的条目,其 location 指向文档 B,则 A 为 B 的 import parent。
每个 imported document 还拥有一个或多个 import ancestor:若文档 A 是文档 B 的 import parent,则 A 为 B 的 import ancestor。import ancestor 关系具传递性:如果 A 是 B 的 import parent,且 B 是 C 的 import parent,则 A 也同时是 C 的 import parent。
每个 imported document 还有一个或多个 import predecessor。若文档 A 的 URL 在文档 B 的 import parent 的 import link list 中位于文档 B 的 URL 之前,并且其对应的 link 被标记为 分支,则 A 为 B 的 import predecessor。
文档 A 的 import ancestor predecessors 定义如下:若文档 B 为文档 C 的 import predecessor,且 C 为 A 的 import ancestor,则 B 为 A 的 import ancestor predecessor。
处于 import ancestor predecessors 或 import predecessors 中的 Document,或从文档 A 的 import link list 中标记为 分支 的条目链接而来,称为 A 的 import dependent。
import link list 与 import dependent 共同约束了导入中脚本的执行顺序。其目的是提供一个由每个 import 中的 link 元素顺序决定的确定性脚本执行顺序。每个节点的边按 import link list 的顺序排列。import predecessor 的选择也会考虑此顺序。
import link lists 的链接结构形成一个有向图。图中的每个节点对应一个文档,边对应一个 link。标记为 分支 的节点旨在形成该图的生成树。此树为脚本执行提供确定的顺序。
在 图 1 中,
import referrer 与 import parent 的区别在于:import referrer 反映 节点树 的状态,而 import parent 则由本文件所述算法构建。
为了在 HTML 中声明 import,向 HTML link types 中添加了新的链接类型。
关键词 import 可与 link 元素一起使用。此关键词会创建一个指向 import 的 外部资源链接。
使用 import 关键字的资源默认类型为 text/html。
link 元素可以拥有 async 属性。async 属性是 布尔属性。
WebIDLpartial interface HTMLLinkElement {
readonly attribute Document? import;
};
在获取时,import 属性 必须返回 null,如果
否则,属性 必须返回对应 imported document,该文档由 import,并由该 link 元素表示。
每次都应返回同一对象。
在 Document(HTML 解析器或 XML 解析器)的上下文中出现的 import,如果满足以下条件,则被视为 阻塞脚本的 import:该 元素 由该 Document 的解析器创建,且该 元素 为类型为 import 的 link,且该 link 未被标记为 async,且 import 尚未 完全加载,并且在事件循环最近一次到达步骤 1 时,该 元素 正在该 Document 中,且用户代理尚未放弃该 import。用户代理 可以 在任何时候放弃一个 import。
在 import 加载完毕之前放弃它,即使之后它仍会加载,这意味着脚本可能会在信息不完整的情况下运行。例如,如果一个 import 注册了自定义元素,而脚本依赖该元素的可用性,则当用户代理过早放弃时,脚本会发现该元素不可用。实现者必须在脚本使用错误信息的可能性与因等待慢速网络请求而产生的性能影响之间取得平衡。
如果 Document 中存在 阻塞脚本的 import,则该文档 拥有阻塞脚本的 import。如果文档的 import dependent 中不存在此类 import,则该文档 没有阻塞脚本的 import。
“拥有阻塞脚本的 import” 状态会在每次已有 import 完全加载或新的 import 加载启动时改变。HTML 解析器会在这些时机相应地解除阻塞。
将以下步骤作为定义的第一步
InvalidStateError 异常。将以下步骤作为定义的第一步
InvalidStateError 异常。将以下步骤作为定义的第一步
InvalidStateError 异常。在向 import link list 添加 link 后,需对 master document 运行 update marking 算法,等价于执行以下步骤。
当用户代理尝试 获取 已链接的 import 时,必须同时运行 import request 算法,等价于执行以下步骤。
所有从 master document 或其 import map 中的 import,必须使用下面描述的 import fetching algorithm 进行获取,而非 HTML 所规定的 获取已链接资源 方法。
import fetching 算法 必须 等价于执行以下步骤。
link 元素。如果算法完成时 IMPORT 不为 null,则该加载尝试 MUST 被视为成功;否则视为失败。
每个未被标记为 async 的延迟文档的 load 事件的导入。
link 元素在加载成功时触发一个名为load的简单事件。若加载失败,则触发一个名为error的简单事件。
内容安全策略 [CSP3] MUST 通过script-src指令限制导入加载。
每个导入 MUST 受其主文档的内容安全策略约束。例如,如果向导入发送了内容安全头字段,用户代理 MUST 强制执行 主文档的策略于被导入的文档。
在准备脚本算法的第 15 步中,修改以 如果元素没有 src 属性 开头的条件的最后部分,使其读取
...以及创建 Document 的HTML 解析器或XML 解析器的script 元素有阻止脚本执行的样式表或有阻止脚本执行的导入
在12.2.5.4.1 “initial” 插入模式章节的 DOCTYPE 部分,修改文本 if the document is not an iframe srcdoc document...
为
if the document is not an iframe src document nor an import...
在“text” 插入模式中,条件 An end tag whose name is "script" 的子条件 Otherwise 中,将第 3 步修改为
Document 有阻止脚本的样式表或有阻止脚本的导入或该脚本的“ready to be parser‑executed” 标志未被设置:旋转事件循环,直至解析器的Document 没有阻止脚本的样式表且没有阻止脚本的导入且该脚本的“ready to be parser‑executed” 标志被设置。修改在准备 script 元素后运行的步骤第 3 步,使其读取
将以下条件加入启用与禁用脚本准则列表
修改document.currentScript 的定义如下
currentScript 属性时,MUST 返回文档或该文档的导入映射中最近一次初始化的值。文档创建时,currentScript MUST 被初始化为 null。若文档是被导入的文档,其 currentScript 始终为 null。style 元素的内容以及link 元素的外部资源在导入中MUST 被视为样式处理模型 [CSS2] 的输入来源,适用于主文档。
与主文档关联的一组导入形成一个导入链接树,即树形结构。依据导入链接树形成算法,使用null 作为 PARENT,主文档 作为 TREE,并将其所有导入作为 POOL,即可定义导入链接树。
来自不同文档的声明的出现顺序 [CSS-CASCADE-3] 由导入链接树决定。若两条声明所属的节点文档不同,则比较它们在导入链接树中的树序,后者获胜。
通过扩展首段来修改事件处理程序内容属性的脚本创建准则。
本规范将custom element order(自定义元素顺序)重新定义为[CUSTOM-ELEMENTS]的自定义元素顺序与导入树顺序之和,其中导入树顺序会被缩放,使其最低值始终大于[CUSTOM-ELEMENTS]的自定义元素顺序可能的最高值。
给定自定义元素在导入链接树中的导入树顺序由树序决定,前提是该导入链接树已通过将每个导入的link 替换为其被导入文档的内容后进行扁平化。
最高稳定顺序是指在第一次遇到的导入中,自定义元素顺序之前的那个值(依据树序),且该导入尚未完全加载。如果不存在这样的元素,则最高稳定顺序为扁平化导入链接树中最高的自定义元素顺序。在处理基元素队列时,用户代理应只调用至最高稳定顺序(含)之前的回调。
由于导入是异步加载的,我们需要把已排序的元素队列拆分为两部分:一部分是所有导入已经加载完毕、状态已稳定的部分,另一部分是仍在加载、实际排序尚未确定的部分。例如,假设你有如下文档结构
index.html
<link rel="import" href="import.html">
...
<me-second></me-second>
...
import.html
<me-first></me-first>
在扁平化的导入链接树中,自定义元素的顺序为 me-first(1),me-second(2)。然而,解析器很可能会先发现 me-second,因为后者不需要加载 import.html。当网络栈完成工作时,最高稳定顺序仍停留在起始位置。一旦 import.html 准备就绪,顺序会直接跳到 me-second(2)。
David Hyatt 开发了 XBL 1.0,而 Ian Hickson 与其共同编写了 XBL 2.0。这些文档为行为附件问题提供了大量洞见,并深刻影响了本规范。
Alex Russell 及其深谋远虑的构想在行为附件以及其在 Web 上的实际应用方面掀起了新一轮热潮。
Dominic Cooney 与 Roland Steiner 不懈努力,在 Web 平台范围内界定了问题的边界,为本文件奠定了坚实的基础。
编辑者还想感谢 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 对本规范的评论与贡献。
此名单过于简短,仍有大量工作待完成。请通过审阅并提交错误报告来贡献力量——并别忘了请编辑者把你的名字加入本节。
引用自
引用自
引用自
引用自