目录

  1. 1 概述
  2. 2 公共基础设施
  3. 3 HTML 文档的语义,结构,与API
  4. 4 HTML 元素
  5. 5 微数据
  6. 6 用户交互
  7. 7 加载 Web 页面
  8. 8 Web 应用 API
  9. 9 通信
  10. 10 Web workers
  11. 11 Web 存储
  12. 12 HTML 语法
  13. 13 XML 语法
  14. 14 渲染
  15. 15 废弃的特性
  16. 16 IANA 注意事项
  17. 索引
  18. References
  19. Acknowledgments

详细目录

  1. 1 概述
    1. 1.1 本标准的适用范围
    2. 1.2 这是 HTML5 吗?
    3. 1.3 背景
    4. 1.4 受众
    5. 1.5 范围
    6. 1.6 历史
    7. 1.7 设计笔记
      1. 1.7.1 脚本执行的可串行性
      2. 1.7.2 与其他标准的兼容性
      3. 1.7.3 可扩展性
    8. 1.8 HTML 和 XML 语法
    9. 1.9 本标准的结构
      1. 1.9.1 如何阅读本标准
      2. 1.9.2 排版惯例
    10. 1.10 隐私问题
      1. 1.10.1 跨站通信
    11. 1.11 HTML 的简单介绍
      1. 1.11.1 使用 HTML 编写安全应用
      2. 1.11.2 使用脚本 API 时常见的陷阱
      3. 1.11.3 编写 HTML 时如何发现错误:验证器和一致性检查器
    12. 1.12 对页面作者的一致性要求
      1. 1.12.1 表示性的标记
      2. 1.12.2 语法错误
      3. 1.12.3 内容模型和属性值的限制
    13. 1.13 推荐阅读
  2. 2 公共基础设施
    1. 2.1 术语
      1. 2.1.1 Parallelism
      2. 2.1.2 资源
      3. 2.1.3 XML 兼容性
      4. 2.1.4 DOM 树
      5. 2.1.5 脚本
      6. 2.1.6 插件
      7. 2.1.7 字符编码
      8. 2.1.8 符合性类别
      9. 2.1.9 Dependencies
      10. 2.1.10 可扩展性
      11. 2.1.11 与 XPath 和 XSLT 交互
    2. 2.2 区分大小写和字符串比较
    3. 2.3 公共微语法
      1. 2.3.1 常见的解析器风格
      2. 2.3.2 布尔属性
      3. 2.3.3 关键字和枚举属性
      4. 2.3.4 数字
        1. 2.3.4.1 有符号整数
        2. 2.3.4.2 非负整数
        3. 2.3.4.3 浮点数
        4. 2.3.4.4 百分数和长度
        5. 2.3.4.5 非零百分数和长度
        6. 2.3.4.6 浮点数列表
        7. 2.3.4.7 维度值列表
      5. 2.3.5 日期和时间
        1. 2.3.5.1 月份
        2. 2.3.5.2 日期
        3. 2.3.5.3 无年的日期
        4. 2.3.5.4 时间
        5. 2.3.5.5 本地日期和时间
        6. 2.3.5.6 时区
        7. 2.3.5.7 全球日期和时间
        8. 2.3.5.8 星期
        9. 2.3.5.9 时间间隔
        10. 2.3.5.10 模糊的时间
      6. 2.3.6 颜色
      7. 2.3.7 空格分隔的令牌
      8. 2.3.8 逗号分隔的令牌
      9. 2.3.9 引用
      10. 2.3.10 媒体查询
    4. 2.4 URL
      1. 2.4.1 术语
      2. 2.4.2 解析 URL
      3. 2.4.3 基 URL 的动态变化
    5. 2.5 获取资源
      1. 2.5.1 术语
      2. 2.5.2 确定响应类型
      3. 2.5.3meta 元素提取字符编码
      4. 2.5.4 CORS 设置属性
      5. 2.5.5 引荐来源策略属性
      6. 2.5.6 Nonce attributes
    6. 2.6 通用 DOM 接口
      1. 2.6.1 在 IDL 属性中反映内容属性
      2. 2.6.2 集合
        1. 2.6.2.1 The HTMLAllCollection interface
          1. 2.6.2.1.1 [[Call]] ( thisArgument, argumentsList )
        2. 2.6.2.2 HTMLFormControlsCollection 接口
        3. 2.6.2.3 HTMLOptionsCollection 接口
      3. 2.6.3 DOMStringList 接口
      4. 2.6.4 垃圾回收
    7. 2.7 安全地传递结构化数据
      1. 2.7.1 可序列化对象
      2. 2.7.2 可传输对象
      3. 2.7.3 StructuredSerializeInternal ( valueforStorage [ ,memory ] )
      4. 2.7.4 StructuredSerialize ( value )
      5. 2.7.5 StructuredSerializeForStorage ( value )
      6. 2.7.6 StructuredDeserialize ( serializedtargetRealm [ ,memory ] )
      7. 2.7.7 StructuredSerializeWithTransfer ( valuetransferList )
      8. 2.7.8 StructuredDeserializeWithTransfer ( serializeWithTransferResulttargetRealm )
      9. 2.7.9 在其他规范中执行序列化和传输
  3. 3 HTML 文档的语义,结构,与API
    1. 3.1 文档
      1. 3.1.1 Document 对象
      2. 3.1.2 资源元数据管理
      3. 3.1.3 DOM 树访问器
    2. 3.2 元素
      1. 3.2.1 语义
      2. 3.2.2 DOM 中的元素
      3. 3.2.3 HTML 元素构造器
      4. 3.2.4 元素定义
        1. 3.2.4.1 属性
      5. 3.2.5 内容模型
        1. 3.2.5.1 "nothing" 内容模型
        2. 3.2.5.2 内容的种类
          1. 3.2.5.2.1 元数据内容
          2. 3.2.5.2.2 流式内容
          3. 3.2.5.2.3 章节内容
          4. 3.2.5.2.4 标题内容
          5. 3.2.5.2.5 短语内容
          6. 3.2.5.2.6 嵌入内容
          7. 3.2.5.2.7 交互式内容
          8. 3.2.5.2.8 可感知内容
          9. 3.2.5.2.9 脚本支持元素
        3. 3.2.5.3 透明内容模型
        4. 3.2.5.4 段落
      6. 3.2.6 全局属性
        1. 3.2.6.1 title 属性
        2. 3.2.6.2 langxml:lang 属性
        3. 3.2.6.3 translate 属性
        4. 3.2.6.4 dir 属性
        5. 3.2.6.5 style 属性
        6. 3.2.6.6 使用 data-* 属性 嵌入自定义不可见数据
      7. 3.2.7 innerText IDL 属性
      8. 3.2.8 与双向算法相关的要求
        1. 3.2.8.1 双向算法格式化字符的编写一致性标准
        2. 3.2.8.2 用户代理一致性标准
      9. 3.2.9 ARIA 与 平台可访问性 API 相关的要求
  4. 4 HTML 元素
    1. 4.1 文档元素
      1. 4.1.1 html 元素
    2. 4.2 文档元数据
      1. 4.2.1 head 元素
      2. 4.2.2 title 元素
      3. 4.2.3 base 元素
      4. 4.2.4 link 元素
        1. 4.2.4.1 处理 media 属性
        2. 4.2.4.2 处理 type 属性
        3. 4.2.4.3link 元素获取资源
        4. 4.2.4.4 处理 `Link` 协议头
        5. 4.2.4.5 为用户提供一种跟随使用 link 元素创建的超链接的方式
      5. 4.2.5 meta 元素
        1. 4.2.5.1 标准元数据名
        2. 4.2.5.2 其他元数据名称
        3. 4.2.5.3 Pragma directives
        4. 4.2.5.4 Specifying the document's character encoding
      6. 4.2.6 The style element
      7. 4.2.7 Interactions of styling and scripting
    3. 4.3 Section
      1. 4.3.1 The body element
      2. 4.3.2 The article element
      3. 4.3.3 The section element
      4. 4.3.4 The nav element
      5. 4.3.5 The aside element
      6. 4.3.6 The h1, h2, h3, h4, h5, and h6 elements
      7. 4.3.7 The hgroup element
      8. 4.3.8 The header element
      9. 4.3.9 The footer element
      10. 4.3.10 The address element
      11. 4.3.11 标题和章节
        1. 4.3.11.1 Creating an outline
        2. 4.3.11.2 Sample outlines
        3. 4.3.11.3 暴露目录给用户
      12. 4.3.12 Usage summary
        1. 4.3.12.1 使用 article 还是 section?
    4. 4.4 Grouping content
      1. 4.4.1 The p element
      2. 4.4.2 The hr element
      3. 4.4.3 The pre element
      4. 4.4.4 The blockquote element
      5. 4.4.5 The ol element
      6. 4.4.6 The ul element
      7. 4.4.7 The menu element
      8. 4.4.8 The li element
      9. 4.4.9 The dl element
      10. 4.4.10 The dt element
      11. 4.4.11 The dd element
      12. 4.4.12 The figure element
      13. 4.4.13 The figcaption element
      14. 4.4.14 The main element
      15. 4.4.15 The div element
    5. 4.5 Text-level semantics
      1. 4.5.1 The a element
      2. 4.5.2 The em element
      3. 4.5.3 The strong element
      4. 4.5.4 The small element
      5. 4.5.5 The s element
      6. 4.5.6 The cite element
      7. 4.5.7 The q element
      8. 4.5.8 The dfn element
      9. 4.5.9 The abbr element
      10. 4.5.10 The ruby element
      11. 4.5.11 The rt element
      12. 4.5.12 The rp element
      13. 4.5.13 The data element
      14. 4.5.14 The time element
      15. 4.5.15 The code element
      16. 4.5.16 The var element
      17. 4.5.17 The samp element
      18. 4.5.18 The kbd element
      19. 4.5.19 The sub and sup elements
      20. 4.5.20 The i element
      21. 4.5.21 The b element
      22. 4.5.22 The u element
      23. 4.5.23 The mark element
      24. 4.5.24 The bdi element
      25. 4.5.25 The bdo element
      26. 4.5.26 The span element
      27. 4.5.27 The br element
      28. 4.5.28 The wbr element
      29. 4.5.29 Usage summary
    6. 4.6 Links
      1. 4.6.1 概述
      2. 4.6.2 Links created by a and area elements
      3. 4.6.3 API for a and area elements
      4. 4.6.4 Following hyperlinks
      5. 4.6.5 Downloading resources
        1. 4.6.5.1 Hyperlink auditing
      6. 4.6.6 Link types
        1. 4.6.6.1 Link type "alternate"
        2. 4.6.6.2 "author" 链接类型
        3. 4.6.6.3 "bookmark" 链接类型
        4. 4.6.6.4 Link type "canonical"
        5. 4.6.6.5 "dns-prefetch" 链接类型
        6. 4.6.6.6 "external" 链接类型
        7. 4.6.6.7 "help" 链接类型
        8. 4.6.6.8 Link type "icon"
        9. 4.6.6.9 "license" 链接类型
        10. 4.6.6.10 Link type "modulepreload"
        11. 4.6.6.11 "nofollow" 链接类型
        12. 4.6.6.12 Link type "noopener"
        13. 4.6.6.13 Link type "noreferrer"
        14. 4.6.6.14 "pingback" 链接类型
        15. 4.6.6.15 "preconnect 链接类型"
        16. 4.6.6.16 "prefetch" 链接类型
        17. 4.6.6.17 Link type "preload"
        18. 4.6.6.18 "prerender" 链接类型
        19. 4.6.6.19 Link type "search"
        20. 4.6.6.20 Link type "stylesheet"
        21. 4.6.6.21 "tag" 链接类型
        22. 4.6.6.22 顺序链接类型
          1. 4.6.6.22.1 "next" 链接类型
          2. 4.6.6.22.2 "prev" 链接类型
        23. 4.6.6.23 其他链接类型
    7. 4.7 Edits
      1. 4.7.1 The ins element
      2. 4.7.2 The del element
      3. 4.7.3 Attributes common to ins and del elements
      4. 4.7.4 编辑与段落
      5. 4.7.5 编辑与列表
      6. 4.7.6 编辑与表格
    8. 4.8 嵌入内容
      1. 4.8.1 The picture element
      2. 4.8.2 The source element
      3. 4.8.3 The img element
      4. 4.8.4 图片
        1. 4.8.4.1 概述
          1. 4.8.4.1.1 自适应图片
        2. 4.8.4.2 sourceimg 元素通用的属性
          1. 4.8.4.2.1 Srcset attributes
          2. 4.8.4.2.2 Sizes attributes
        3. 4.8.4.3 Processing model
          1. 4.8.4.3.1 When to obtain images
          2. 4.8.4.3.2 响应 DOM 变化
          3. 4.8.4.3.3 The list of available images
          4. 4.8.4.3.4 Decoding images
          5. 4.8.4.3.5 Updating the image data
          6. 4.8.4.3.6 Selecting an image source
          7. 4.8.4.3.7 Updating the source set
          8. 4.8.4.3.8 Parsing a srcset attribute
          9. 4.8.4.3.9 Parsing a sizes attribute
          10. 4.8.4.3.10 源像素密度规范化
          11. 4.8.4.3.11 Reacting to environment changes
        4. 4.8.4.4 为图片提供替代文字的要求
          1. 4.8.4.4.1 通用指引
          2. 4.8.4.4.2 只包含图片的链接或按钮
          3. 4.8.4.4.3 A phrase or paragraph with an alternative graphical representation: charts, diagrams, graphs, maps, illustrations
          4. 4.8.4.4.4 带有替代图形表示的短语或标签:图标,徽标
          5. 4.8.4.4.5 Text that has been rendered to a graphic for typographical effect
          6. 4.8.4.4.6 A graphical representation of some of the surrounding text
          7. 4.8.4.4.7 辅助性图片
          8. 4.8.4.4.8 不提供任何信息的纯装饰性图片
          9. 4.8.4.4.9 组成但个没有链接的大图的图片组
          10. 4.8.4.4.10 组成单个有链接的大图的图片组
          11. 4.8.4.4.11 内容的关键部分
          12. 4.8.4.4.12 不是给用户看的图片
          13. 4.8.4.4.13 给特定的、已知一定可以查看图片的人的 e-mail 或私人文档中的图片
          14. 4.8.4.4.14 Guidance for markup generators
          15. 4.8.4.4.15 规范检查工具指引
      5. 4.8.5 The iframe element
      6. 4.8.6 The embed element
      7. 4.8.7 The object element
      8. 4.8.8 The param element
      9. 4.8.9 video 元素
      10. 4.8.10 The audio element
      11. 4.8.11 The track element
      12. 4.8.12 Media elements
        1. 4.8.12.1 Error codes
        2. 4.8.12.2 Location of the media resource
        3. 4.8.12.3 MIME types
        4. 4.8.12.4 网络状态
        5. 4.8.12.5 Loading the media resource
        6. 4.8.12.6 Offsets into the media resource
        7. 4.8.12.7 Ready states
        8. 4.8.12.8 Playing the media resource
        9. 4.8.12.9 Seeking
        10. 4.8.12.10 多媒体轨道的媒体资源
          1. 4.8.12.10.1 AudioTrackList and VideoTrackList objects
          2. 4.8.12.10.2 声明式地选择特定的音频和视频轨道
        11. 4.8.12.11 计时字幕
          1. 4.8.12.11.1 Text track model
          2. 4.8.12.11.2 Sourcing in-band text tracks
          3. 4.8.12.11.3 Sourcing out-of-band text tracks
          4. 4.8.12.11.4 显示各种格式的 字幕提示 的 指南
          5. 4.8.12.11.5 Text track API
          6. 4.8.12.11.6 Event handlers for objects of the text track APIs
          7. 4.8.12.11.7 元数据字幕的最佳实践
        12. 4.8.12.12 通过 URL 识别轨道类型
        13. 4.8.12.13 User interface
        14. 4.8.12.14 Time ranges
        15. 4.8.12.15 The TrackEvent interface
        16. 4.8.12.16 Events summary
        17. 4.8.12.17 Security and privacy considerations
        18. 4.8.12.18 作者使用媒体元素的最佳实践
        19. 4.8.12.19 Best practices for implementers of media elements
      13. 4.8.13 The map element
      14. 4.8.14 The area element
      15. 4.8.15 图片映射
        1. 4.8.15.1 编写
        2. 4.8.15.2 Processing model
      16. 4.8.16 MathML
      17. 4.8.17 SVG
      18. 4.8.18 Dimension attributes
    9. 4.9 表格数据
      1. 4.9.1 The table element
        1. 4.9.1.1 描述表格的技术
        2. 4.9.1.2 表格设计技术
      2. 4.9.2 The caption element
      3. 4.9.3 The colgroup element
      4. 4.9.4 The col element
      5. 4.9.5 The tbody element
      6. 4.9.6 The thead element
      7. 4.9.7 The tfoot element
      8. 4.9.8 The tr element
      9. 4.9.9 The td element
      10. 4.9.10 The th element
      11. 4.9.11 Attributes common to td and th elements
      12. 4.9.12 Processing model
        1. 4.9.12.1 Forming a table
        2. 4.9.12.2 Forming relationships between data cells and header cells
      13. 4.9.13 示例
    10. 4.10 表单
      1. 4.10.1 概述
        1. 4.10.1.1 编写表单的用户界面
        2. 4.10.1.2 实现服务器端表单处理
        3. 4.10.1.3 配置表单与服务器通信
        4. 4.10.1.4 客户端表单验证
        5. 4.10.1.5 启用表单控件的客户端自动填充
        6. 4.10.1.6 Improving the user experience on mobile devices
        7. 4.10.1.7 The difference between the field type, the autofill field name, and the input modality
        8. 4.10.1.8 日期、时间和数字格式
      2. 4.10.2 Categories
      3. 4.10.3 The form element
      4. 4.10.4 The label element
      5. 4.10.5 The input element
        1. 4.10.5.1 type 属性的状态
          1. 4.10.5.1.1 Hidden state (type=hidden)
          2. 4.10.5.1.2 Text (type=text) state and Search state (type=search)
          3. 4.10.5.1.3 Telephone state (type=tel)
          4. 4.10.5.1.4 URL state (type=url)
          5. 4.10.5.1.5 E-mail state (type=email)
          6. 4.10.5.1.6 Password state (type=password)
          7. 4.10.5.1.7 Date state (type=date)
          8. 4.10.5.1.8 Month state (type=month)
          9. 4.10.5.1.9 Week state (type=week)
          10. 4.10.5.1.10 Time state (type=time)
          11. 4.10.5.1.11 Local Date and Time state (type=datetime-local)
          12. 4.10.5.1.12 Number state (type=number)
          13. 4.10.5.1.13 Range state (type=range)
          14. 4.10.5.1.14 Color state (type=color)
          15. 4.10.5.1.15 Checkbox state (type=checkbox)
          16. 4.10.5.1.16 Radio Button state (type=radio)
          17. 4.10.5.1.17 File Upload state (type=file)
          18. 4.10.5.1.18 Submit Button state (type=submit)
          19. 4.10.5.1.19 Image Button state (type=image)
          20. 4.10.5.1.20 Reset Button state (type=reset)
          21. 4.10.5.1.21 Button state (type=button)
        2. 4.10.5.2 关于表单控件的本地化的实现笔记
        3. 4.10.5.3 通用 input 元素属性
          1. 4.10.5.3.1 The maxlength and minlength attributes
          2. 4.10.5.3.2 size 属性
          3. 4.10.5.3.3 readonly 属性
          4. 4.10.5.3.4 required 属性
          5. 4.10.5.3.5 multiple 属性
          6. 4.10.5.3.6 pattern 属性
          7. 4.10.5.3.7 minmax 属性
          8. 4.10.5.3.8 The step attribute
          9. 4.10.5.3.9 list 属性
          10. 4.10.5.3.10 The placeholder attribute
        4. 4.10.5.4 Common input element APIs
        5. 4.10.5.5 通用事件行为
      6. 4.10.6 The button element
      7. 4.10.7 The select element
      8. 4.10.8 The datalist element
      9. 4.10.9 The optgroup element
      10. 4.10.10 The option element
      11. 4.10.11 The textarea element
      12. 4.10.12 The output element
      13. 4.10.13 The progress element
      14. 4.10.14 The meter element
      15. 4.10.15 The fieldset element
      16. 4.10.16 The legend element
      17. 4.10.17 Form control infrastructure
        1. 4.10.17.1 A form control's value
        2. 4.10.17.2 可变性
        3. 4.10.17.3 Association of controls and forms
      18. 4.10.18 表单控件通用的属性
        1. 4.10.18.1 Naming form controls: the name attribute
        2. 4.10.18.2 提交元素 element directionality: the dirname attribute
        3. 4.10.18.3 Limiting user input length: the maxlength attribute
        4. 4.10.18.4 Setting minimum input length requirements: the minlength attribute
        5. 4.10.18.5 Enabling and disabling form controls: the disabled attribute
        6. 4.10.18.6 Form submission
          1. 4.10.18.6.1 Autofocusing a form control: the autofocus attribute
        7. 4.10.18.7 自动填充
          1. 4.10.18.7.1 Autofilling form controls: the autocomplete attribute
          2. 4.10.18.7.2 Processing model
      19. 4.10.19 APIs for the text control selections
      20. 4.10.20 约束
        1. 4.10.20.1 定义
        2. 4.10.20.2 Constraint validation
        3. 4.10.20.3 The constraint validation API
        4. 4.10.20.4 安全性
      21. 4.10.21 表单提交
        1. 4.10.21.1 概述
        2. 4.10.21.2 隐式提交
        3. 4.10.21.3 Form submission algorithm
        4. 4.10.21.4 Constructing the entry list
        5. 4.10.21.5 Selecting a form submission encoding
        6. 4.10.21.6 URL 编码的表单数据
        7. 4.10.21.7 Multipart form data
        8. 4.10.21.8 Plain text form data
      22. 4.10.22 表单重置
    11. 4.11 Interactive elements
      1. 4.11.1 The details element
      2. 4.11.2 The summary element
      3. 4.11.3 命令
        1. 4.11.3.1 Facets
        2. 4.11.3.2 使用 a 元素来定义命令
        3. 4.11.3.3 使用 button 元素来定义命令
        4. 4.11.3.4 使用 input 元素来定义命令
        5. 4.11.3.5 Using the option element to define a command
        6. 4.11.3.6legend 元素上 使用 accesskey 属性 来定义一个命令
        7. 4.11.3.7 使用 accesskey 属性给其他元素定义命令
      4. 4.11.4 The dialog element
    12. 4.12 脚本
      1. 4.12.1 The script element
        1. 4.12.1.1 Processing model
        2. 4.12.1.2 Scripting languages
        3. 4.12.1.3 script 元素内容的限制
        4. 4.12.1.4 Inline documentation for external scripts
        5. 4.12.1.5 Interaction of script elements and XSLT
      2. 4.12.2 The noscript element
      3. 4.12.3 The template element
        1. 4.12.3.1 Interaction of template elements with XSLT and XPath
      4. 4.12.4 The slot element
      5. 4.12.5 The canvas element
        1. 4.12.5.1 The 2D rendering context
          1. 4.12.5.1.1 实现说明
          2. 4.12.5.1.2 Canvas 状态
          3. 4.12.5.1.3 Line styles
          4. 4.12.5.1.4 Text styles
          5. 4.12.5.1.5 Building paths
          6. 4.12.5.1.6 Path2D objects
          7. 4.12.5.1.7 Transformations
          8. 4.12.5.1.8 Image sources for 2D rendering contexts
          9. 4.12.5.1.9 Fill and stroke styles
          10. 4.12.5.1.10 Drawing rectangles to the bitmap
          11. 4.12.5.1.11 Drawing text to the bitmap
          12. 4.12.5.1.12 Drawing paths to the canvas
          13. 4.12.5.1.13 Drawing focus rings and scrolling paths into view
          14. 4.12.5.1.14 Drawing images
          15. 4.12.5.1.15 Pixel manipulation
          16. 4.12.5.1.16 合成
          17. 4.12.5.1.17 Image smoothing
          18. 4.12.5.1.18 Shadows
          19. 4.12.5.1.19 滤镜
          20. 4.12.5.1.20 使用外部定义的 SVG 滤镜
          21. 4.12.5.1.21 Drawing model
          22. 4.12.5.1.22 最佳实践
          23. 4.12.5.1.23 示例
        2. 4.12.5.2 ImageBitmap 渲染上下文
          1. 4.12.5.2.1 Introduction
          2. 4.12.5.2.2 The ImageBitmapRenderingContext interface
        3. 4.12.5.3 The OffscreenCanvas interface
          1. 4.12.5.3.1 The offscreen 2D rendering context
        4. 4.12.5.4 Color spaces and color correction
        5. 4.12.5.5 Serializing bitmaps to a file
        6. 4.12.5.6 canvas 元素的安全问题
    13. 4.13 Custom elements
      1. 4.13.1 概述
        1. 4.13.1.1 创建自主的 Custom Element
        2. 4.13.1.2 创建定制的内建元素
        3. 4.13.1.3 自主 custom element 的缺点
        4. 4.13.1.4 在创建之后升级元素
      2. 4.13.2 对 custom element 构造器的要求
      3. 4.13.3 核心概念
      4. 4.13.4 CustomElementRegistry 接口
      5. 4.13.5 升级
      6. 4.13.6 Custom element reactions
    14. 4.14 Common idioms without dedicated elements
      1. 4.14.1 内容的主要部分
      2. 4.14.2 面包屑导航
      3. 4.14.3 标签云
      4. 4.14.4 对话
      5. 4.14.5 脚注
    15. 4.15 Disabled elements
    16. 4.16 使用选择符和 CSS 匹配 HTML 元素
      1. 4.16.1 CSS 'attr()' 函数的大小写敏感性
      2. 4.16.2 Case-sensitivity of selectors
      3. 4.16.3 Pseudo-classes
  5. 5 微数据
    1. 5.1 概述
      1. 5.1.1 Overview
      2. 5.1.2 The basic syntax
      3. 5.1.3 Typed items
      4. 5.1.4 Global identifiers for items
      5. 5.1.5 Selecting names when defining vocabularies
    2. 5.2 Encoding microdata
      1. 5.2.1 The microdata model
      2. 5.2.2 Items
      3. 5.2.3 Names: the itemprop attribute
      4. 5.2.4 Values
      5. 5.2.5 Associating names with items
      6. 5.2.6 Microdata and other namespaces
    3. 5.3 Sample microdata vocabularies
      1. 5.3.1 vCard
        1. 5.3.1.1 Conversion to vCard
        2. 5.3.1.2 Examples
      2. 5.3.2 vEvent
        1. 5.3.2.1 Conversion to iCalendar
        2. 5.3.2.2 Examples
      3. 5.3.3 Licensing works
        1. 5.3.3.1 Examples
    4. 5.4 Converting HTML to other formats
      1. 5.4.1 JSON
  6. 6 用户交互
    1. 6.1 hidden 属性
    2. 6.2 Inert subtrees
    3. 6.3 Activation
    4. 6.4 焦点
      1. 6.4.1 概述
      2. 6.4.2 数据模型
      3. 6.4.3 The tabindex attribute
      4. 6.4.4 Processing model
      5. 6.4.5 Sequential focus navigation
      6. 6.4.6 Focus management APIs
    5. 6.5 指定快捷键
      1. 6.5.1 概述
      2. 6.5.2 The accesskey attribute
      3. 6.5.3 Processing model
    6. 6.6 编辑
      1. 6.6.1 Making document regions editable: The contenteditable content attribute
      2. 6.6.2 Making entire documents editable: the designMode IDL attribute
      3. 6.6.3 Best practices for in-page editors
      4. 6.6.4 Editing APIs
      5. 6.6.5 Spelling and grammar checking
      6. 6.6.6 Autocapitalization
      7. 6.6.7 Input modalities: the inputmode attribute
    7. 6.7 Drag and drop
      1. 6.7.1 Introduction
      2. 6.7.2 The drag data store
      3. 6.7.3 The DataTransfer interface
        1. 6.7.3.1 The DataTransferItemList interface
        2. 6.7.3.2 The DataTransferItem interface
      4. 6.7.4 The DragEvent interface
      5. 6.7.5 Processing model
      6. 6.7.6 Events summary
      7. 6.7.7 The draggable attribute
      8. 6.7.8 拖放模型中的安全风险
  7. 7 加载 Web 页面
    1. 7.1 Browsing contexts
      1. 7.1.1 嵌套浏览上下文
        1. 7.1.1.1 在 DOM 中导航嵌套浏览上下文
      2. 7.1.2 輔助浏览上下文
        1. 7.1.2.1 在 DOM 中导航辅助浏览上下文
      3. 7.1.3 Security
      4. 7.1.4 浏览上下文分类
      5. 7.1.5 Browsing context names
    2. 7.2 Window, WindowProxy, 和 Location 对象的安全基础设施
      1. 7.2.1 Integration with IDL
      2. 7.2.2 Shared internal slot: [[CrossOriginPropertyDescriptorMap]]
      3. 7.2.3 Shared abstract operations
        1. 7.2.3.1 CrossOriginProperties ( O )
        2. 7.2.3.2 IsPlatformObjectSameOrigin ( O )
        3. 7.2.3.3 CrossOriginGetOwnPropertyHelper ( O, P )
        4. 7.2.3.4 CrossOriginGet ( O, P, Receiver )
        5. 7.2.3.5 CrossOriginSet ( O, P, V, Receiver )
        6. 7.2.3.6 CrossOriginOwnPropertyKeys ( O )
    3. 7.3 The Window object
      1. 7.3.1 APIs for creating and navigating browsing contexts by name
      2. 7.3.2 Accessing other browsing contexts
      3. 7.3.3 Named access on the Window object
      4. 7.3.4 Garbage collection and browsing contexts
      5. 7.3.5 Closing browsing contexts
      6. 7.3.6 Browser interface elements
      7. 7.3.7 Script settings for Window objects
    4. 7.4 The WindowProxy exotic object
      1. 7.4.1 [[GetPrototypeOf]] ( )
      2. 7.4.2 [[SetPrototypeOf]] ( V )
      3. 7.4.3 [[IsExtensible]] ( )
      4. 7.4.4 [[PreventExtensions]] ( )
      5. 7.4.5 [[GetOwnProperty]] ( P )
      6. 7.4.6 [[DefineOwnProperty]] ( P, Desc )
      7. 7.4.7 [[Get]] ( P, Receiver )
      8. 7.4.8 [[Set]] ( P, V, Receiver )
      9. 7.4.9 [[Delete]] ( P )
      10. 7.4.10 [[OwnPropertyKeys]] ( )
    5. 7.5 Origin
      1. 7.5.1 Relaxing the same-origin restriction
    6. 7.6 Sandboxing
    7. 7.7 Session history and navigation
      1. 7.7.1 The session history of browsing contexts
      2. 7.7.2 The History interface
      3. 7.7.3 Implementation notes for session history
      4. 7.7.4 The Location interface
        1. 7.7.4.1 [[GetPrototypeOf]] ( )
        2. 7.7.4.2 [[SetPrototypeOf]] ( V )
        3. 7.7.4.3 [[IsExtensible]] ( )
        4. 7.7.4.4 [[PreventExtensions]] ( )
        5. 7.7.4.5 [[GetOwnProperty]] ( P )
        6. 7.7.4.6 [[DefineOwnProperty]] ( P, Desc )
        7. 7.7.4.7 [[Get]] ( P, Receiver )
        8. 7.7.4.8 [[Set]] ( P, V, Receiver )
        9. 7.7.4.9 [[Delete]] ( P )
        10. 7.7.4.10 [[OwnPropertyKeys]] ( )
    8. 7.8 Browsing the Web
      1. 7.8.1 Navigating across documents
      2. 7.8.2 HTML 文件的页面加载处理模型
      3. 7.8.3 XML 文件的页面加载处理模型
      4. 7.8.4 文本文件的页面加载处理模型
      5. 7.8.5 multipart/x-mixed-replace 资源的媒体的页面加载处理模型
      6. 7.8.6 媒体的页面加载处理模型
      7. 7.8.7 使用插件的内容的页面加载处理模型
      8. 7.8.8 没有 DOM 的内联内容的页面加载处理模型
      9. 7.8.9 Navigating to a fragment
      10. 7.8.10 History traversal
        1. 7.8.10.1 Persisted user state restoration
        2. 7.8.10.2 The PopStateEvent interface
        3. 7.8.10.3 The HashChangeEvent interface
        4. 7.8.10.4 The PageTransitionEvent interface
      11. 7.8.11 Unloading documents
        1. 7.8.11.1 The BeforeUnloadEvent interface
      12. 7.8.12 Aborting a document load
    9. 7.9 Offline Web applications
      1. 7.9.1 概述
        1. 7.9.1.1 支持遗留应用的离线缓存
        2. 7.9.1.2 Events summary
      2. 7.9.2 Application caches
      3. 7.9.3 缓存清单语法
        1. 7.9.3.1 一些示例清单
        2. 7.9.3.2 Writing cache manifests
        3. 7.9.3.3 Parsing cache manifests
      4. 7.9.4 Downloading or updating an application cache
      5. 7.9.5 应用缓存选择算法
      6. 7.9.6 Changes to the networking model
      7. 7.9.7 应用缓存过期
      8. 7.9.8 磁盘空间
      9. 7.9.9 离线应用缓存的安全问题
      10. 7.9.10 Application cache API
      11. 7.9.11 Browser state
  8. 8 Web 应用 API
    1. 8.1 脚本
      1. 8.1.1 概述
      2. 8.1.2 启用和禁用脚本
      3. 8.1.3 处理模型
        1. 8.1.3.1 Definitions
        2. 8.1.3.2 Fetching scripts
        3. 8.1.3.3 Creating scripts
        4. 8.1.3.4 Calling scripts
        5. 8.1.3.5 Realm, 设置对象, 和全局对象
          1. 8.1.3.5.1 Entry
          2. 8.1.3.5.2 Incumbent
          3. 8.1.3.5.3 Current
          4. 8.1.3.5.4 Relevant
        6. 8.1.3.6 Killing scripts
        7. 8.1.3.7 与 JavaScript 任务队列的集成
          1. 8.1.3.7.1 EnqueueJob(queueName, job, arguments)
        8. 8.1.3.8 Integration with the JavaScript module system
          1. 8.1.3.8.1 HostResolveImportedModule(referencingScriptOrModule, specifier)
          2. 8.1.3.8.2 HostImportModuleDynamically(referencingScriptOrModule, specifier, promiseCapability)
          3. 8.1.3.8.3 HostGetImportMetaProperties(moduleRecord)
        9. 8.1.3.9 Integration with the JavaScript agent formalism
        10. 8.1.3.10 Integration with the JavaScript agent cluster formalism
        11. 8.1.3.11 Runtime script errors
          1. 8.1.3.11.1 文档中的运行时脚本错误
          2. 8.1.3.11.2 ErrorEvent 接口
        12. 8.1.3.12 Unhandled promise rejections
          1. 8.1.3.12.1 HostPromiseRejectionTracker(promise, operation)
          2. 8.1.3.12.2 PromiseRejectionEvent 接口
        13. 8.1.3.13 HostEnsureCanCompileStrings(callerRealm, calleeRealm)
      4. 8.1.4 事件循环
        1. 8.1.4.1 定义
        2. 8.1.4.2 Processing model
        3. 8.1.4.3 Generic task sources
        4. 8.1.4.4 Dealing with the event loop from other specifications
      5. 8.1.5 事件
        1. 8.1.5.1 Event handlers
        2. 8.1.5.2 Event handlers on elements, Document objects, and Window objects
          1. 8.1.5.2.1 IDL definitions
        3. 8.1.5.3 Event firing
    2. 8.2 The WindowOrWorkerGlobalScope mixin
    3. 8.3 Base64 utility methods
    4. 8.4 Dynamic markup insertion
      1. 8.4.1 Opening the input stream
      2. 8.4.2 Closing the input stream
      3. 8.4.3 document.write()
      4. 8.4.4 document.writeln()
    5. 8.5 Timers
    6. 8.6 用户提示
      1. 8.6.1 Simple dialogs
      2. 8.6.2 Printing
    7. 8.7 System state and capabilities
      1. 8.7.1 The Navigator object
        1. 8.7.1.1 Client identification
        2. 8.7.1.2 Language preferences
        3. 8.7.1.3 Custom scheme handlers: the registerProtocolHandler() method
          1. 8.7.1.3.1 Security and privacy
        4. 8.7.1.4 Cookies
        5. 8.7.1.5 Plugins
    8. 8.8 Images
    9. 8.9 Animation frames
  9. 9 通信
    1. 9.1 MessageEvent 接口
    2. 9.2 服务器发送的事件
      1. 9.2.1 概述
      2. 9.2.2 The EventSource interface
      3. 9.2.3 Processing model
      4. 9.2.4 Parsing an event stream
      5. 9.2.5 Interpreting an event stream
      6. 9.2.6 Authoring notes
      7. 9.2.7 无连接推送和其他特性
      8. 9.2.8 垃圾回收
      9. 9.2.9 Implementation advice
    3. 9.3 Web sockets
      1. 9.3.1 概述
      2. 9.3.2 The WebSocket interface
      3. 9.3.3 Feedback from the protocol
      4. 9.3.4 Ping and Pong frames
      5. 9.3.5 The CloseEvent interface
      6. 9.3.6 Garbage collection
    4. 9.4 跨文档通信
      1. 9.4.1 概述
      2. 9.4.2 安全
        1. 9.4.2.1 作者
        2. 9.4.2.2 用户代理
      3. 9.4.3 发布消息
    5. 9.5 通道
      1. 9.5.1 概述
        1. 9.5.1.1 示例
        2. 9.5.1.2 端口作为 Web 上对象能力模型的基础
        3. 9.5.1.3 端口作为抽象服务实现的基础
      2. 9.5.2 消息通道
      3. 9.5.3 消息端口
      4. 9.5.4 广播给多个端口
      5. 9.5.5 端口与垃圾回收
    6. 9.6 向其他浏览上下文广播
  10. 10 Web workers
    1. 10.1 概述
      1. 10.1.1 涵盖范围
      2. 10.1.2 示例
        1. 10.1.2.1 数字密集型计算的后台 worker
        2. 10.1.2.2 使用 JavaScript 模块作为 worker
        3. 10.1.2.3 共享 worker 概述
        4. 10.1.2.4 通过共享 Worker 来共享状态
        5. 10.1.2.5 委托
        6. 10.1.2.6 Providing libraries
      3. 10.1.3 教程
        1. 10.1.3.1 创建专用 worker
        2. 10.1.3.2 与专用 Worker 通信
        3. 10.1.3.3 共享 worker
    2. 10.2 基础设施
      1. 10.2.1 全局作用域
        1. 10.2.1.1 WorkerGlobalScope 通用接口
        2. 10.2.1.2 专用 Worker 与 DedicatedWorkerGlobalScope 接口
        3. 10.2.1.3 共享 worker 与 SharedWorkerGlobalScope 接口
      2. 10.2.2 事件循环
      3. 10.2.3 The worker's lifetime
      4. 10.2.4 Processing model
      5. 10.2.5 Runtime script errors
      6. 10.2.6 创建 Worker
        1. 10.2.6.1 The AbstractWorker mixin
        2. 10.2.6.2 Script settings for workers
        3. 10.2.6.3 Dedicated workers and the Worker interface
        4. 10.2.6.4 Shared workers and the SharedWorker interface
      7. 10.2.7 Concurrent hardware capabilities
    3. 10.3 Worker 中可用的 API
      1. 10.3.1 Importing scripts and libraries
      2. 10.3.2 The WorkerNavigator interface
      3. 10.3.3 The WorkerLocation interface
  11. 11 Web 存储
    1. 11.1 Introduction
    2. 11.2 API
      1. 11.2.1 The Storage interface
      2. 11.2.2 The sessionStorage attribute
      3. 11.2.3 The localStorage attribute
      4. 11.2.4 The storage event
        1. 11.2.4.1 The StorageEvent interface
    3. 11.3 磁盘空间
    4. 11.4 隐私
      1. 11.4.1 User tracking
      2. 11.4.2 Sensitivity of data
    5. 11.5 安全
      1. 11.5.1 DNS 欺骗攻击
      2. 11.5.2 Cross-directory attacks
      3. 11.5.3 Implementation risks
  12. 12 HTML 语法
    1. 12.1 Writing HTML documents
      1. 12.1.1 The DOCTYPE
      2. 12.1.2 Elements
        1. 12.1.2.1 Start tags
        2. 12.1.2.2 End tags
        3. 12.1.2.3 Attributes
        4. 12.1.2.4 Optional tags
        5. 12.1.2.5 内容模型限制
        6. 12.1.2.6 对原始文本和可转义的原始文本元素的内容的限制
      3. 12.1.3 文本
        1. 12.1.3.1 换行
      4. 12.1.4 Character references
      5. 12.1.5 CDATA 部分
      6. 12.1.6 注释
    2. 12.2 Parsing HTML documents
      1. 12.2.1 Overview of the parsing model
      2. 12.2.2 Parse errors
      3. 12.2.3 输入字节流
        1. 12.2.3.1 使用已知字符编码进行解析
        2. 12.2.3.2 Determining the character encoding
        3. 12.2.3.3 字符编码
        4. 12.2.3.4 Changing the encoding while parsing
        5. 12.2.3.5 Preprocessing the input stream
      4. 12.2.4 解析状态
        1. 12.2.4.1 The insertion mode
        2. 12.2.4.2 The stack of open elements
        3. 12.2.4.3 活动格式化元素列表
        4. 12.2.4.4 元素指针
        5. 12.2.4.5 其他解析状态标志
      5. 12.2.5 Tokenization
        1. 12.2.5.1 Data state
        2. 12.2.5.2 RCDATA state
        3. 12.2.5.3 RAWTEXT state
        4. 12.2.5.4 Script data state
        5. 12.2.5.5 PLAINTEXT state
        6. 12.2.5.6 Tag open state
        7. 12.2.5.7 End tag open state
        8. 12.2.5.8 Tag name state
        9. 12.2.5.9 RCDATA 小于号状态
        10. 12.2.5.10 RCDATA 结束标签打开状态
        11. 12.2.5.11 RCDATA end tag name state
        12. 12.2.5.12 RAWTEXT 小于号状态
        13. 12.2.5.13 RAWTEXT end tag open state
        14. 12.2.5.14 RAWTEXT end tag name state
        15. 12.2.5.15
        16. 12.2.5.16 Script data end tag open state
        17. 12.2.5.17 Script data end tag name state
        18. 12.2.5.18 脚本数据转义开始状态
        19. 12.2.5.19 脚本数据转义开始
        20. 12.2.5.20 脚本数据转义状态
        21. 12.2.5.21 脚本数据转义横线状态
        22. 12.2.5.22 Script data escaped dash dash state
        23. 12.2.5.23 脚本数据转义小于号状态
        24. 12.2.5.24 Script data escaped end tag open state
        25. 12.2.5.25 Script data escaped end tag name state
        26. 12.2.5.26 脚本数据双重转义开始状态
        27. 12.2.5.27 Script data double escaped state
        28. 12.2.5.28 脚本数据双重转义横线状态
        29. 12.2.5.29 Script data double escaped dash dash state
        30. 12.2.5.30 脚本数据双重转义小于号状态
        31. 12.2.5.31 脚本数据双重转义结束状态
        32. 12.2.5.32 Before attribute name state
        33. 12.2.5.33 Attribute name state
        34. 12.2.5.34 After attribute name state
        35. 12.2.5.35 Before attribute value state
        36. 12.2.5.36 Attribute value (double-quoted) state
        37. 12.2.5.37 Attribute value (single-quoted) state
        38. 12.2.5.38 Attribute value (unquoted) state
        39. 12.2.5.39 After attribute value (quoted) state
        40. 12.2.5.40 Self-closing start tag state
        41. 12.2.5.41 Bogus comment state
        42. 12.2.5.42 Markup declaration open state
        43. 12.2.5.43 Comment start state
        44. 12.2.5.44 Comment start dash state
        45. 12.2.5.45 Comment state
        46. 12.2.5.46 注释小于号状态
        47. 12.2.5.47 注释小于号感叹号状态
        48. 12.2.5.48 注释小于号感叹号横线状态
        49. 12.2.5.49 Comment less-than sign bang dash dash state
        50. 12.2.5.50 Comment end dash state
        51. 12.2.5.51 Comment end state
        52. 12.2.5.52 Comment end bang state
        53. 12.2.5.53 DOCTYPE state
        54. 12.2.5.54 Before DOCTYPE name state
        55. 12.2.5.55 DOCTYPE name state
        56. 12.2.5.56 After DOCTYPE name state
        57. 12.2.5.57 After DOCTYPE public keyword state
        58. 12.2.5.58 Before DOCTYPE public identifier state
        59. 12.2.5.59 DOCTYPE public identifier (double-quoted) state
        60. 12.2.5.60 DOCTYPE public identifier (single-quoted) state
        61. 12.2.5.61 After DOCTYPE public identifier state
        62. 12.2.5.62 Between DOCTYPE public and system identifiers state
        63. 12.2.5.63 After DOCTYPE system keyword state
        64. 12.2.5.64 Before DOCTYPE system identifier state
        65. 12.2.5.65 DOCTYPE system identifier (double-quoted) state
        66. 12.2.5.66 DOCTYPE system identifier (single-quoted) state
        67. 12.2.5.67 After DOCTYPE system identifier state
        68. 12.2.5.68 Bogus DOCTYPE state
        69. 12.2.5.69 CDATA 部分状态
        70. 12.2.5.70 CDATA 部分括号状态
        71. 12.2.5.71 CDATA 部分结束状态
        72. 12.2.5.72 Character reference state
        73. 12.2.5.73 Named character reference state
        74. 12.2.5.74 Ambiguous ampersand state
        75. 12.2.5.75 数字字符引用状态
        76. 12.2.5.76 Hexademical character reference start state
        77. 12.2.5.77 Decimal character reference start state
        78. 12.2.5.78 Hexademical character reference state
        79. 12.2.5.79 Decimal character reference state
        80. 12.2.5.80 数字字符引用结束状态
      6. 12.2.6 Tree construction
        1. 12.2.6.1 Creating and inserting nodes
        2. 12.2.6.2 解析只包含文本的元素
        3. 12.2.6.3 Closing elements that have implied end tags
        4. 12.2.6.4 解析 HTML 内容中的标记的规则
          1. 12.2.6.4.1 "initial" 插入模式
          2. 12.2.6.4.2 "before html" 插入模式
          3. 12.2.6.4.3 "before head" 插入模式
          4. 12.2.6.4.4 The "in head" insertion mode
          5. 12.2.6.4.5 "in head noscript" 插入模式
          6. 12.2.6.4.6 "after head" 插入模式
          7. 12.2.6.4.7 The "in body" insertion mode
          8. 12.2.6.4.8 The "text" insertion mode
          9. 12.2.6.4.9 "in table" 插入模式
          10. 12.2.6.4.10 The "in table text" insertion mode
          11. 12.2.6.4.11 The "in caption" 插入模式
          12. 12.2.6.4.12 "in column group" 插入模式
          13. 12.2.6.4.13 "in table body" 插入模式
          14. 12.2.6.4.14 "in row" 插入模式
          15. 12.2.6.4.15 "in cell" 插入模式
          16. 12.2.6.4.16 "in select" 插入模式
          17. 12.2.6.4.17 "in select in table" 插入模式
          18. 12.2.6.4.18 "in template" 插入模式
          19. 12.2.6.4.19 "after body" 插入模式
          20. 12.2.6.4.20 "in frameset" 插入模式
          21. 12.2.6.4.21 "after frameset" 插入模式
          22. 12.2.6.4.22 "after after body" 插入模式
          23. 12.2.6.4.23 "after after frameset" 插入模式
        5. 12.2.6.5 The rules for parsing tokens in foreign content
      7. 12.2.7 The end
      8. 12.2.8 Coercing an HTML DOM into an infoset
      9. 12.2.9 解析器的错误处理和奇怪的场景介绍
        1. 12.2.9.1 错误嵌套的标签:<b><i></b></i>
        2. 12.2.9.2 错误嵌套的标签:<b><p></b></p>
        3. 12.2.9.3 Unexpected markup in tables
        4. 12.2.9.4 解析时修改页面的脚本
        5. 12.2.9.5 在多个文档中移动的脚本的执行
        6. 12.2.9.6 Unclosed formatting elements
    3. 12.3 序列化 HTML 片段
    4. 12.4 解析 HTML 片段
    5. 12.5 Named character references
  13. 13 XML 语法
    1. 13.1 以 XML 语法编写文档
    2. 13.2 Parsing XML documents
    3. 13.3 Serializing XML fragments
    4. 13.4 Parsing XML fragments
  14. 14 渲染
    1. 14.1 Introduction
    2. 14.2 The CSS user agent style sheet and presentational hints
    3. 14.3 Non-replaced elements
      1. 14.3.1 Hidden elements
      2. 14.3.2 The page
      3. 14.3.3 Flow content
      4. 14.3.4 Phrasing content
      5. 14.3.5 Bidirectional text
      6. 14.3.6 Quotes
      7. 14.3.7 Sections and headings
      8. 14.3.8 Lists
      9. 14.3.9 Tables
      10. 14.3.10 Margin collapsing quirks
      11. 14.3.11 Form controls
      12. 14.3.12 The hr element
      13. 14.3.13 The fieldset and legend elements
    4. 14.4 Replaced elements
      1. 14.4.1 Embedded content
      2. 14.4.2 Images
      3. 14.4.3 Attributes for embedded content and images
      4. 14.4.4 Image maps
    5. 14.5 微件
      1. 14.5.1 简介
      2. 14.5.2 button 元素
      3. 14.5.3 detailssummary 元素
      4. 14.5.4 input 元素作为文本输入微件
      5. 14.5.5 The input element as domain-specific widgets
      6. 14.5.6 The input element as a range control
      7. 14.5.7 The input element as a color well
      8. 14.5.8 The input element as a checkbox and radio button widgets
      9. 14.5.9 The input element as a file upload control
      10. 14.5.10 The input element as a button
      11. 14.5.11 The marquee element
      12. 14.5.12 The meter element
      13. 14.5.13 The progress element
      14. 14.5.14 The select element
      15. 14.5.15 The textarea element
    6. 14.6 Frames and framesets
    7. 14.7 Interactive media
      1. 14.7.1 Links, forms, and navigation
      2. 14.7.2 The title attribute
      3. 14.7.3 Editing hosts
      4. 14.7.4 Text rendered in native user interfaces
    8. 14.8 Print media
    9. 14.9 Unstyled XML documents
  15. 15 废弃的特性
    1. 15.1 Obsolete but conforming features
      1. 15.1.1 Warnings for obsolete but conforming features
    2. 15.2 Non-conforming features
    3. 15.3 Requirements for implementations
      1. 15.3.1 The marquee element
      2. 15.3.2 Frames
      3. 15.3.3 Other elements, attributes and APIs
  16. 16 IANA 注意事项
    1. 16.1 text/html
    2. 16.2 multipart/x-mixed-replace
    3. 16.3 application/xhtml+xml
    4. 16.4 text/cache-manifest
    5. 16.5 text/ping
    6. 16.6 application/microdata+json
    7. 16.7 text/event-stream
    8. 16.8 `Ping-From`
    9. 16.9 `Ping-To`
    10. 16.10 `Refresh`
    11. 16.11 `Last-Event-ID`
    12. 16.12 web+ scheme prefix
  17. 索引
    1. Elements
    2. Element content categories
    3. Attributes
    4. Element Interfaces
    5. 所有接口
    6. Events
    7. MIME 类型
  18. References
  19. Acknowledgments

1 概述

Spec bugs: 23036

1.1 本标准的适用范围

本标准详细地定义了 Web 平台的很大一部分内容。Web 平台的标准栈中,它相对于其他标准的定位可以总结为:

CSS SVG MathML NPAPI Geo Fetch CSP JPEG GIF PNG THIS SPECIFICATION HTTP TLS MQ DOM Unicode Web IDL MIME URL XML JavaScript Encodings

1.2 这是 HTML5 吗?

This section is non-normative.

答案是:是的。

详细地说,广义的 "HTML5" 是指一系列的现代 Web 技术。 这些技术中很多都由 WHATWG 开发,本文档就是其中之一。 其他的可以在这里访问: the WHATWG specification index

W3C 也在以独立的文档发布本标准中的部分内容,尽管我们已要求他们停止这样做。

1.3 背景

This section is non-normative.

HTML 是万维网的核心标记语言。最初 HTML 主要设计为在语义级别描述科学文档的语言。 然而它的总体设计使它在接下来的几年中能够适配一些其他类型的文档,甚至包括应用程序。

1.4 受众

This section is non-normative.

本标准是为以下读者提供的:使用了本标准定义的特性的文档和脚本的作者, 用于操作那些使用了本标准定义的特性的页面的工具的实现者, 希望根据本标准的要求确认文档或实现的正确性的个人。

本文档对还没有整体熟悉 Web 技术的读者可能不合适, 因为在有些地方为精确性而省略了具体阐述,为完整性而较为简洁概括。 易懂的教程和编写指南可以为这个话题提供更加温和的介绍。

具体地,为了完整地理解本标准中那些更加技术的部分,对 DOM 基础的熟悉是必要的。 对 Web IDL,HTTP,XML,Unicode,字符编码,JavaScript 和 CSS 的理解在有些地方也有帮助,但并非完全必要。

1.5 范围

This section is non-normative.

本标准只限于为编写可访问的 Web 页面(从静态文档到动态应用) 提供语义级别的标记语言,以及相应的语义级别的脚本 API。

本标准的范围不包括提供具体媒体的自定义呈现机制(尽管 Web 浏览器的默认渲染规则在本标准末尾有所涵盖, 一些挂钩到 CSS 的机制也作为语言的一部分加以提供)。

本标准的范围并非要描述整个操作系统。具体地,硬件配置软件、图像操作工具、 以及用户在高端工作站日常使用的应用程序都在范围之外。 对于应用软件,本标准只针对用户偶尔使用的,或定期使用但在不同地点的, 且 CPU 要求较低的特定应用。这样的应用例如在线购物系统、搜索系统、游戏(尤其是多人在线游戏)、 公开电话簿或地址簿、通信软件(邮件客户端、即时通信客户端、讨论软件), 文档编辑软件等。

1.6 历史

This section is non-normative.

在最初的5年中(1990-1995),HTML经历了若干次修订和扩展。最初由 CERN 主要托管,随后是 IETF。

随着 W3C 的诞生,HTML 的开发再次易主。1995 年第一次扩展 HTML 的尝试(HTML 3.0)以失败告终,随后转变为更加务实的 HTML 3.2,在 1997 年完成。 就在同年很快开始了 HTML4 的开发。

随后一年 W3C 成员决定停止 HTML 的演变,并开始开发基于 XML 的替代品 XHTML。 该 工作首先将 HTML4 重新规划为 XML,也就是著名的 XHTML 1.0。 唯一增加的特性就是新的序列化,该工作在 2000 年完成。 XHTML 1.0 之后,在 XHTML 模块化的口号下 W3C 的主要精力转向让其他工作组更容易地扩展 XHTML。 与此同时,W3C 致力于一门新的、与此前的 HTML 和 XHTML 都不兼容的语言:XHTML2。

大概在 1998 年 HTML 停止演化的时候,浏览器厂商开发的部分 HTML API 被标准化和发布在 DOM Level 1(1998) 和 DOM Level 2 Core,以及 DOM Level 2 HTML(2000年开始2003年完成)中。 在 2004 年发布了一些 DOM Level 3 标准,但是 Level 3 草案尚未全部完成工作组就关闭了。 这些工作也最终不了了之。

2003 年 XForms (一项定位于下一代 Web 表单的技术)的发布 重新激起了对 HTML 演化的兴趣,而不是像从前那样寻求新的替代品。 这时人们发现 XML 作为 Web 技术的部署只局限于全新的技术(比如 RSS 和后来的 Atom), 而不是取代已经部署的技术(比如 HTML)。

概念验证显示,在不要求浏览器实现与现存 HTML Web 页面不兼容的渲染引擎的情况下, 也可能扩展 HTML4 的表单来提供 XForms 1.0 引入的很多特性。 这一概念验证是对 HTML 重新燃起的兴趣产生的第一项成果。 在这早期阶段,虽然本草案已经公开可用且已广泛征求建议,该标准只在 Opera Software 版权下发布。

应该重新开启 HTML 演化的想法在 W3C 工作组得到了测试。 Mozilla 和 Opera 共同向 W3C 工作组提交了提议,包括 HTML5 工作背后的一些原则(见下文),以及前述的只涉及表单特性的早期草案。 该提议因为与此前选择的 Web 演化方向冲突而被拒绝, W3C 职员和会员投票支持继续开发基于 XML 的替代品。

此后 Apple,Mozilla 和 Opera 共同声明他们将继续在 WHATWG(一个新的组织)团体下投入工作。 他们为此创建了一个公开的邮件列表,草案也移交到了 WHATWG 网站。随后版权也修改为这三家共同拥有, 同时允许该标准的重用。

WHATWG 基于若干核心原则,具体地:技术需要向后兼容,标准和实现需要相符(即使这意味着更改标准而不是实现), 标准需要足够详细来使得一个实现在不需对其他实现进行逆向工程的情况下,就能可达到完全的互操作性。

其中后一个原则,要求 HTML5 标准的范围应包括先前在 HTML4,XHTML1,和 DOM2 HTML 这三篇独立的文档中标准化的内容。 同时意味着相比于此前的考虑,需要显著地引入更多的细节。

2006 年,W3C 暗示了参与 HTML5 开发的兴趣,并于 2007 年组建了工作组来与 WHATWG 共同开发 HTML5 标准。 Apple,Mozilla,和 Opera 允许 W3C 在 W3C 版权下发布该标准, 只要保留一版 WHATWG 网站的那份较少限制的许可协议。

数年中各方一同工作,然而在 2011 年,这些工作组最终发现他们有着不同的目标: W3C 希望发布一个"完成的" HTML5 版本,而 WHATWG 希望持续地维护一个 HTML Living Standard, 持续地维护该标准而不是锁定在一个带着已知问题的状态, 同时按照需求增加新的特性来发展整个平台。

从此 WHATWG 一直在(与其他组织一同)开发该标准, W3C 则复制 WHATWG 的修复工作到他们所在的文档分支(也有其他的一些改动)。

1.7 设计笔记

This section is non-normative.

必须承认 HTML 的很多方面乍一看毫无意义或者不太一致。

HTML,它的 DOM API,以及很多其他的支持技术是由互不相识的有着不同目的的人,经数十年开发完成。

因此特性的出现有着不同的来源,也未经专门的一致的方式设计。 而且由于 Web 独有的特点,实现的 Bug 常常会变成事实上的惯例,以及现在合法的、标准的行为。 因为编写的内容常常会无意地依赖于这些未能及时修复的实现。

尽管这样,人们还是为坚持某些设计目标而付出努力。在接下来的几个小节中描述了这些努力。

1.7.1 脚本执行的可串行性

This section is non-normative.

为了避免让 Web 作者处理多线程的复杂性,HTML 和 DOM API 的设计使得脚本无法检测同时运行的其他脚本。 甚至在使用 workers 时,设计意图中实现的行为可以被认为是 在所有 浏览环境 中串行地执行所有脚本。

1.7.2 与其他标准的兼容性

This section is non-normative.

本标准和多种多样的其他有相互影响和依赖。很不幸在某些情况下,相互冲突的需求使得本标准违反了其他标准的要求。 当这种情况发生时,每一项冲突都会标记为 "willful violation",而且会说明该冲突的原因。

1.7.3 可扩展性

This section is non-normative.

HTML 有广泛的可扩展性机制,可用来安全地添加语义:

1.8 HTML 和 XML 语法

This section is non-normative.

本标准定义了一个描述文档和应用的抽象语言,以及一些 API 来与使用该语言的资源的内存表示进行交互。

这一内存表示又称为 "DOM HTML",或简称为 "DOM"。

对于传输使用了该抽象语言的资源,有很多不同的具体语法。本标准中定义了其中两种。

第一个这样的具体语法是 HTML 语法。这是对多数作者推荐的格式,它与多数遗留的 Web 浏览器相兼容。 如果一个文档以text/html MIME type进行传输, 然后它将会被 Web 浏览器作为 HTML 文档处理。 本标准定义了最新的 HTML 语法,简单地称为 "HTML"。

第二个具体的语法是 XML。当一篇文档以XML MIME type(比如application/xhtml+xml) 传输时,它将会被 Web 浏览器当做 XML 文档处理,被 XML 处理器解析。 作者需要注意 XML 和 HTML 的处理存在差别;具体地,即使很小的语法错误都将阻止 XML 文档的完整渲染, 然而它们在 HTML 语法中将会被忽略。

给 HTML 用的 XML 语法此前被称为 "XHTML",但本标准不适用该术语 (原因之一是 MathML 和 SVG 的 HTML 语法中未使用该术语)。

DOM,HTML 语法,XML 语法不能用来表示同样的内容。 例如 HTML 语法不能表示命名空间,但 DOM 和 XML 语法却支持。 类似地,HTML 语法可以表示使用 noscript 特性的文档, 但 DOM 和 XML 语法却不能。 包含 "-->" 的注释只能在 DOM 中表示,HTML 和 XML 语法却不行。

1.9 本标准的结构

This section is non-normative.

本标准分为以下主要的部分:

概述
为 HTML 标准提供上下文的非规范性材料。
通用基础设施
合规的类、算法、定义、标准其余部分的通用基础。
HTML 文档的语义,结构,与 API
文档由元素构成,这些元素使用 DOM 组成一棵树。 这部分定义了该 DOM 的特性,介绍了所有元素共同的特性,以及在定义元素时用到的概念。
HTML 元素
每个元素都有一个预定义的含义,本章便解释了这些含义。 也给出了作者使用这些元素的规则,以及用户代理处理这些元素的要求。 这里包含了大量的 HTML 独有的特性,例如视频播放和副标题,表单控件和表单提交, 以及名为 HTML canvas 的 2D 图形 API。
微数据
本标准介绍了为文档增加机器可读注解的机制,这样工具可以从文档中抽取键值对的树。 这部分文档描述了该机制 和用于将 HTML 文档转换为其他格式的一些算法。 这部分还为联系信息、日历事件和许可协议定义了一些示例的微数据词汇。
用户交互
HTML 文档可以提供一些用户与内容交互以及用户修改内容的机制,在本章中给出了这些机制的描述。 比如焦点的工作机制、以及拖放操作。
加载 Web 页面
HTML 文档不是空中楼阁 — 这部分定义了很多影响处理多页面环境的特性,比如 Web 浏览器和 Web 应用的离线缓存。
Web 应用 API
这部分介绍了 HTML 应用脚本的基本特性。
Web workers
这部分定义了 JavaScript 后台线程的 API。
通信 API
这部分描述了 HTML 编写的应用可用来与同一客户端中的,不同域名的其他应用通信的一些机制。 也介绍了一个服务器推送事件流机制,称为 Server Sent Events 或 EventSource, 以及一个未脚本提供的双向全双工套接字协议,称为 Web Sockets。
Web storage
这部分定义了一个基于键值对的客户端存储机制。
HTML 语法
XML 语法
只有表示为序列化的形式并发送给其他人,所有的这些特性才会有意义。 所以这两部分定义了 HTML 和 XML 的语法 ,以及如何使用这些语法来解析内容的规则。
渲染
这部分定义了 Web 浏览器默认的渲染规则。

还有一些附录,列出了 废弃的特性IANA 考虑,以及一些索引。

1.9.1 如何阅读本标准

阅读本标准的方式与其他标准类似。首先应该完整地阅读多次,然后至少倒着读一次, 然后应该从目录中随机选入章节并跟着所有交叉引用读一次。

如下面一致性要求部分所述,本标准描述了各一致性等级的一致性标准。 特别地,有些一致性要求适用于生产者(例如作者和他们创建的文档), 也有一些适用于消费者(例如 Web 浏览器)。 他们的要求是不同的:对生产者的要求声明了什么是允许的,而对消费者的要求声明了软件的行为。

例如,“foo 属性的值必须是一个合法的整数” 是对生产者的要求,因为它规定了允许的取值;相反, “foo 属性的值必须使用 解析整数的规则来解析” 是对消费者的要求,因为它描述了如何处理内容。

对生产者的要求不会对消费者产生任何影响。

继续上述例子,“属性值必须是合法的整数”刻意地没有暗示对消费者的要求。 事实上消费者可能被要求把该属性当做透明的字符串,完全不关心它的值是否满足要求。 也可能被要求以指定的规则来解析它的值(就像上述例子中那样),这些规则就定义了如何处理不合法的值(在本例子中就是非数字的值)。

1.9.2 排版惯例

这是定义、要求,或者解释。

这是注意事项。

这是翻译者的注释。

这是例子。

这是未解决的问题。

这是警告

interface Example {
  // 这是一个 IDL 定义
};
variable = object . method( [ optionalArgument ] )

这是给作者看的,描述了接口的使用。

/* 这是一个 CSS 片段 */

术语的定义标记为 这样。 该术语的使用标记为 这样这样

元素、属性或 API 的定义标记为这样。 该元素、属性或 API 的引用标记为 这样

其他代码片段标记为这样

变量标记为这样

在算法中,同步部分的步骤标记为 ⌛。

有些情况下,要求以列表的形式给出,列表项包括条件和对应的要求。 在该情况下,适用于某项条件的要求紧跟着条件出现,这些要求的条件可能有很多个。例如:

这是一个条件
这是另一个条件
这是适用于上述条件的要求
这是第三个条件
这是适用于第三个条件的要求

1.10 隐私问题

This section is non-normative.

一些 HTML 特性牺牲了用户方便来获得一定的用户隐私。

通常地,由于互联网的架构,用户之间可以通过 IP 地址来加以区分。 但 IP 地址不能完美地匹配用户,当用户换用了不同的设备,或切换了网络时,他们的 IP 地址将会变化。 类似地,NAT 路由、代理服务器、共享计算机使得看起来都来自同一 IP 地址的网络包事实上来自不同用户。 洋葱路由等技术可以用来进一步匿名化请求, 使得来自同一互联网节点的同一用户的请求看起来来自联网的很多不同部分。

然而,用户请求使用的 IP 地址并非将用户请求关联到每个用户的唯一的机制。 比如 Cookie 就是专门为此设计的,也是大多数 Web 会话特性的基础。 这使得你可以使用账号来登录一个网站。

还有一些更加细微的机制。用户系统的某些特征也可以用来区分用户群体。 通过收集足够的信息,可以计算出一个单独用户的浏览器的 "数字指纹"。 在确定哪些请求来自同一用户的问题上,该方法不差于 IP 地址。

这样对请求进行分组(尤其是跨站点)可以用于正当的用途,也可以用于恶意的用户。 一个合理的正当用途的例子可能是:基于访问频次来确定一个用户喜欢有狗作为插图的网站还是有猫作为插图的网站, 然后在访问这些网站时,自动地使用他所偏好的插图。 然而恶意的用途包括:政府将用户的家庭住址(通过他从网站获取导航信息时使用的地址确定) 与他的政治偏好(通过检查他参加的论坛网站确定)相关联,来决定是否应该阻止他在选举中投票。

因为恶意的用途可能会非常邪恶,鼓励用户代理的实现者考虑为他们的用户提供工具, 来最小化泄漏可能被用于识别用户的信息。

不幸的是(正如本章第一段所暗示的),有时暴露特定的信息(该信息也可能被用来识别用户)可获得非常多好处, 所以并直接非阻止所有可能的泄漏那么简单。 比如,用户登录一个网站并在特定的认证下发布内容要求该用户的请求可以被识别为都来自同一用户, 这差不多也就是登录的定义。更细微地,像文本宽度这样的信息对于很多涉及到绘制文本到画布的效果 (例如:任何涉及在文本周围绘制边框的效果)都是必须的,这也会泄漏可以用来对用户请求分组的信息。 这种情况下可能暴露了用户装有哪些字体(通过暴力搜索),用户间这一信息的差别可能会相当大。

本标准中可能被用来 识别用户 的特性都有像本段一样的标记。 (This is a fingerprinting vector.)

平台中其他可能被用于相同用途的特性包括但不限于:

1.10.1 跨站通信

postMessage() API 提供了两个网站直接通信的机制。 乍一看这可能为上述问题的产生提供了新的方式。然而在实践中,网站间通信的很多机制已先于该 API 而存在: 网站嵌套另一个网站可通过iframe来发送数据;网站可以使用带有服务器可识别标志的跨站图片请求, 来发起服务器端的数据交换;还有上述提到的指纹技术可以在网站间唯一地识别访客,然后便可以在服务器端交换信息。

根本来讲,如果用户不信任某个网站会尊重他们的信息,就应该避免访问那个网站。

1.11 HTML 的简单介绍

This section is non-normative.

一个基本的 HTML 文档看起来像这样:

<!DOCTYPE html>
<html lang="en">
 <head>
  <title>Sample page</title>
 </head>
 <body>
  <h1>Sample page</h1>
  <p>This is a <a href="demo.html">simple</a> sample.</p>
  <!-- this is a comment -->
 </body>
</html>

HTML 文档由树状的元素和文本组成。源码中每个元素由 一个 开始标签(例如 "<body>") 和一个 结束标签(例如 "</body>")表示。 (某些开始标签和结束标签在某些情况下可以 省略。)

标签的嵌套必须使所有标签都完全在其他标签内部,不应出现重叠:

<p>This is <em>very <strong>wrong</em>!</strong></p>
<p>This <em>is <strong>correct</strong>.</em></p>

本标准定义了 HTML 中使用的一些元素,以及它们的嵌套规则。

元素可以有属性来控制元素的行为。在下面的例子中是一个 超链接, 由一个a元素和它的 href 属性组成:

<a href="demo.html">simple</a>

属性 应放置在开始标签中,由 属性名属性值构成, 以 "=" 分隔。 如果不包含空格" ' ` = <>, 属性值可以保持 没有引号 ; 否则必须使用单引号或双引号。 如果属性值是空字符串,属性值以及 "=" 可以一起省略。

<!-- empty attributes -->
<input name=address disabled>
<input name=address disabled="">

<!-- attributes with a value -->
<input name=address maxlength=200>
<input name=address maxlength='200'>
<input name=address maxlength="200">

HTML 用户代理(比如 Web 浏览器)解析这些标记,把它转化为 DOM(Document Object Model)树。 DOM 树是文档在内存中的表示。

DOM 数包含若干种节点,具体地:DocumentType 节点、 Element节点、Text 节点、Comment 节点, 以及有时会出现的 ProcessingInstruction 节点。

本章顶部的代码片段将会转化为下列 DOM 树:

树中的document 元素html 元素, 在 HTML 文档的这一位置总是应该有这样一个元素。它包含两个元素, headbody,以及它们之间的一个 Text 节点。

DOM 树中的 Text 节点比你预想的要多,因为源码包含一些空格(表示为"␣")和换行("⏎"), 这些都会变成 DOM 中的 Text 节点。然而因为历史原因,并非所有这些源码中的空格和换行都出现在 DOM 中。 具体地,所有head开始标签前的空白都会被悄悄地丢掉,所有body结束标签后的空白都会出现在body的尾部。

head 元素包含一个 title 元素,其中包含一个 内容为 "Sample page" 的 Text 节点。类似地,body 元素包含一个 h1 元素,一个p 元素,和一个注释。


页面中的脚本可以操作该 DOM 树。脚本(比如 JavaScript)是可以使用 script标签或 事件处理内容属性内嵌的小程序。 比如下面是一个表单,其中的脚本设置了表单中output元素的内容并输出 "Hello World":

<form name="main">
 Result: <output name="result"></output>
 <script>
  document.forms.main.elements.result.value = 'Hello World';
 </script>
</form>

DOM 树中的每个元素表示为一个对象,这些对象提供 API 以供操作。 例如,一个链接(比如上述树中的a元素)的 "href"属性可以通过多种方式改变:

var a = document.links[0]; // obtain the first link in the document
a.href = 'sample.html'; // change the destination URL of the link
a.protocol = 'https'; // change just the scheme part of the URL
a.setAttribute('href', 'https://example.com/'); // change the content attribute directly

由于 DOM 树是实现者(尤其是像 Web 浏览器这样的交互式实现)用来处理和显示 HTML 文档的, 本标准更多地是按照 DOM 树来介绍的,而不是按照上面描述的标记代码。


HTML 文档表示了交互式内容的一种媒体无关的描述。HTML 文档可能会渲染在屏幕、语音合成器、或者盲文点触设备。 为了精确地控制渲染行为,作者可以使用一个像 CSS 这样的样式语言。

在下列例子中,使用 CSS 将页面设置为蓝底白字。

<!DOCTYPE html>
<html lang="en">
 <head>
  <title>Sample styled page</title>
  <style>
   body { background: navy; color: yellow; }
  </style>
 </head>
 <body>
  <h1>Sample styled page</h1>
  <p>This page is just a demo.</p>
 </body>
</html>

关于更多 HTML 的使用细节,鼓励作者参考教程和指南。 本标准中的一些示例可能也有用,但新手作者需要注意本标准必须非常详细地定义该语言, 以至于一开始可能很难理解。

1.11.1 使用 HTML 编写安全应用

This section is non-normative.

当使用 HTML 创建交互式网站时,需要注意避免引入漏洞,使得攻击者通过这些漏洞危害网站本身或网站用户信息的完整性。

对这一问题的全面研究超出了本文档的范围,我们强烈建议网站作者去更详细地研究这一问题。 即便如此,本节尝试对 HTML 应用程序开发中的一些常见陷阱作简单介绍。

Web 的安全模型基于“域”的概念,因此 Web 上许多潜在的攻击涉及跨域操作。[ORIGIN]

不验证用户输入
跨站脚本(XSS)
SQL 注入

当接受不可信输入时(例如文本评论这样的用户生成内容,URL 参数中的值,来自第三方网站的消息等), 必须在使用前验证数据,并在显示时正确转义。 否则就会允许恶意的用户执行各种攻击, 这些攻击可能是轻微的,例如提供诸如负的年龄这样的假的用户信息; 也可能是严重的,例如在每次用户查看包含该信息的页面时执行脚本; 也可能是传播性的攻击导致灾难性后果,比如删除服务器中的所有数据。

当编写过滤器验证用户输入时,过滤器应当是基于白名单的,允许已知的安全构造并禁止所有其他输入。 基于黑名单的过滤器(禁止已知的错误输入并允许其他所有输入)是不安全的, 因为并不是所有错误输入都是已知的(因为它可能会在未来发明)。

例如,一个页面查看它的 URL 查询字符串来决定显示的内容, 然后网站将用户重定向到显示该消息的页面。比如:

<ul>
 <li><a href="message.cgi?say=Hello">Say Hello</a>
 <li><a href="message.cgi?say=Welcome">Say Welcome</a>
 <li><a href="message.cgi?say=Kittens">Say Kittens</a>
</ul>

如果这一消息没有转义就显示给用户,恶意的攻击者可能会构造一个包含脚本元素的 URL:

https://example.com/message.cgi?say=%3Cscript%3Ealert%28%27Oh%20no%21%27%29%3C/script%3E

如果攻击者随后说服受害者访问此页面,攻击者选择的脚本将在页面上运行。 这样的脚本可以执行任意的恶意操作,只要是站点提供的。 例如站点是电子商务商店,这样的脚本可以导致在用户不知情的情况下进行任意的购买。

这称为跨站脚本攻击。

有很多构造可以欺骗网站执行代码。以下是网站作者在编写白名单过滤器时应考虑的事项:

跨站请求伪造 (CSRF)

如果网站允许用户提交的表单产生用户相关的影响,例如使用名字在论坛上发布消息, 进行购买或申请护照,那么很有必要核实该请求确实是用户有意发起的, 而不是由另一个站点欺骗用户不知情地发起请求。

该问题的存在是因为 HTML 表单可能被提交到其他域名。

站点可以通过为表单填充用户相关的隐藏标记或检查所有请求的`Origin`头字段, 来防止这样的攻击。

Clickjacking

如果页面为用户提供的界面中包含用户可能不希望执行的操作时, 该页面应当经过特殊设计来避免用户被欺骗以激活该界面的可能性。

一种用户被欺骗的可能是,如果恶意站点将受害站点放在一个小的 iframe 中然后让用户去点击, 例如让用户玩一个反应类游戏。一旦用户开始玩这个游戏,恶意站点可以在用户正要点击时快速地将这个 iframe 放到鼠标光标下。 以此来欺骗用户点击受害站点的界面。

为了避免这种情况,鼓励不期望在 iframe 下使用的站点只有检测(例如通过比较window对象和top属性的值) 到它们不在 iframe 下时才激活它们的界面。

1.11.2 使用脚本 API 时常见的陷阱

This section is non-normative.

HTML 中的脚本有着"运行到完成"的语义,这意味着浏览器通常在执行任何其他操作 (诸如触发进一步的事件或继续解析文档)之前会不中断地执行脚本。

另一方面,HTML 文件的解析是逐步发生的,这意味着解析器可以在任何地方暂停来让脚本运行。 这通常是一件好事,但确实意味着作者需要小心地避免在事件可能已经触发之后才绑定事件处理程序。

有两项技术能够可靠地完成这件事情:使用 事件处理程序内容属性, 或者在同一脚本中创建元素和添加事件处理程序。后一种更为安全,因为如前所述, 脚本会在进一步的事件发生前一直运行到完成。

一个可以表示此种情形的例子是img元素和load事件。 该事件在元素解析完成时就会触发,特别是当图片已经被缓存之后(这很常见)。

这里,作者在img标签上使用 onload 事件处理程序 来捕捉 load 事件:

<img src="games.png" alt="Games" onload="gamesLogoHasLoaded(event)">

如果使用脚本添加元素,那么只要在同一脚本中添加事件处理函数,该事件就不会被错过:

<script>
 var img = new Image();
 img.src = 'games.png';
 img.alt = 'Games';
 img.onload = gamesLogoHasLoaded;
 // img.addEventListener('load', gamesLogoHasLoaded, false); // would work also
</script>

然而如果作者首先创建了img元素,然后在另一个单独的脚本中添加了事件监听器, 那么有可能load事件会在两者之间触发,导致它被错过:

<!-- Do not use this style, it has a race condition! -->
 <img id="games" src="games.png" alt="Games">
 <!-- the 'load' event might fire here while the parser is taking a
      break, in which case you will not see it! -->
 <script>
  var img = document.getElementById('games');
  img.onload = gamesLogoHasLoaded; // might never fire!
 </script>

1.11.3 编写 HTML 时如何发现错误:验证器和一致性检查器

This section is non-normative.

鼓励作者使用一致性检查器(又称验证器)来发现常见的错误。 WHATWG 维护着这种工具的一个列表:https://validator.whatwg.org/

1.12 对页面作者的一致性要求

This section is non-normative.

与以前版本的 HTML 规范不同,此规范不仅定义了对有效文档的处理, 也详细定义了对无效文档的处理过程。

然而,即使无效内容的处理在大多数情况下是良好定义的,文档的一致性仍然很重要: 在实践中,互操作性(所有实现以可靠和相同或等同的方式处理特定内容的情况)并不是文档一致性要求的唯一目标。 本节详细地介绍了合法文档和错误文档仍然有所区别的一些常见原因。

1.12.1 表示性的标记

This section is non-normative.

先前 HTML 版本的大多数表示性特性不再被允许。一般来说,表示性的标记有这样一些问题:

表示性元素的使用导致较差的可访问性

尽管使用显示性的标记也可以为使用辅助技术(Assistive Technologies,AT)的用户 提供可接受的体验(比如使用 ARIA),但这样做显然比使用适当的语义标记更加困难。 此外,即使使用这样的技术也不能帮助那些既没有 AT 又没有图形的用户(比如使用文本模式浏览器的用户)访问页面。

另一方面,使用媒体无关的标记为编写更多用户(比如文本浏览器的用户)可用的文档提供了简单的方式。

更高的维护成本

使用样式无关的标记编写的站点,显然更容易维护。比如,对于到处都在使用 <font color=""> 的站点,更改颜色需要更改整个站点, 然而对基于 CSS 的站点做类似的改动,只需更改一个文件。

更大的文档大小

表示性标记往往会增加冗余,因此导致更大的文档大小。

出于这些原因,在本版本的 HTML 中移除了表示性的标记。 这一改动并不突然,HTML4 在很多年前就已经不推荐使用表示性标记, 并提供了一种模式(HTML4 Transitional) 来帮助作者从表示性标记进行迁移; 后来 XHTML 1.1 更进一步地一起废弃了那些特性。

HTML 中唯一保留下来的表示性标记特性是 style 属性和 style 元素。 生产环境中使用 style 属性也在某种程度上不再推荐, 但在创建原型(这些规则之后可以直接移动到单独的样式表中) 以及在特殊情况下(当单独的样式表不方便时)提供特定样式很有用。 类似地,style 元素在引入外部样式内容或者提供页面特定样式时很有用。 但一般来说,当样式适用于多个页面时,外部样式表可能更加方便。

值得注意的是有些先前的表示性元素在本标准中已经被重新定义为媒体无关的: b, i, hr, s, small, and u.

1.12.2 语法错误

This section is non-normative.

限制 HTML 的语法是为了避免各种各样的问题。

不直观的错误处理行为

某些不合法的语法构造在解析后会导致很不直观的 DOM 树。

例如,以下标记片段会导致 DOM 树中的 hr 元素 在相应的 table 元素之前

<table><hr>...
可选错误恢复的错误

为了允许在受控环境中使用的用户代理不必实现更奇怪和复杂的错误处理规则, 允许用户代理在遇到解析错误时失败。

错误处理行为与流式用户代理不兼容的的错误

一些错误处理行为(比如上面提到的<table><hr>...) 与流式用户代理(不存储状态且通过一次遍历来处理 HTML 文件的用户代理)不兼容。 为了避免与这样的用户代理的互操作性问题,任何导致该行为的语法都是无效的。

会导致信息集强制的错误

当一个基于 XML 的用户代理连接到一个 HTML 解析器时, 某些 XML 强制的不变式(比如元素或属性名不可包含多个冒号)可能被 HTML 文件违反。 处理这种情况可能要求解析器将 HTML DOM 信息强加给 XML 兼容的信息集。 要求这一处理的多数语法构造都是不合法的。 (包含两个连续的间隔符的注释,或以一个间隔符结尾的注释是特例,这在 HTML 语法中是允许的)。

这一规则意味着基于 XML 的用户代理只需连接一个 HTML 解析器(Parser)即可拥有理解 HTML 的能力。所以 HTML 与 XML 只是语法有所不同, 表达语义的能力应当是等价的。

会导致性能下降的错误

某些语法构造可能导致很差的性能。为了阻止这些构造的使用,通常把它们归为不合规范的。

例如,下列标记会导致很差的性能,因为所有未闭合的 i 元素必须在每个段落中重新构造, 导致每个段落中的元素累加地增多:

<p><i>She dreamt.
<p><i>She dreamt that she ate breakfast.
<p><i>Then lunch.
<p><i>And finally dinner.

该片段的结果 DOM 将会是:

涉及到脆弱的语法构造的错误

由于历史原因有一些语法构造相对脆弱。为了避免用户意外地掉到坑里,它们也被归为不合规范的。

例如,即使省略了关闭分号,对属性中命名的字符引用的解析也会发生。 可以安全地引入一个&以及紧随其后的不构成特殊命名的字符引用, 但如果这些字母改成构成命名的字符引用,它们将会被解释为那个特殊字符。

在这个代码片段中,属性值是“?bill&ted”:

<a href="?bill&ted">Bill and Ted</a>

在下面的代码片段中,属性值实际上会变成“?art©”, 而不是 期望的 “?art&copy”, 因为即使没有最后的分号“&copy”也会一样地被处理为 “&copy;”最终被解释为“©”:

<a href="?art&copy">Art and Copy</a>

为了避免这一问题,要求所有命名的字符引用以分号结束, 所有使用命名字符引用但未添加分号的都被标记为错误。

因此正确地表达上述情况的方式如下:

<a href="?bill&ted">Bill and Ted</a> <!-- &ted is ok, since it's not a named character reference -->
<a href="?art&amp;copy">Art and Copy</a> <!-- the & has to be escaped, since &copy is a named character reference -->
涉及旧用户代理中的已知互操作性问题的错误

某些语法构造在旧的用户代理中会造成一些已知的细微或严重的问题。 因此他们被标记为不合规范的来帮助作者避免这些问题。

例如 U+0060 重音符(`)不允许出现在没有引号的属性中。 因为在某些旧用户代理中,它有时会被当做一个引号。

另一个例子是必须使用 DOCTYPE 来触发 非怪异模式, 因为旧用户代理在 怪异模式 下的行为通常都没有文档。

可能引发对作者的安全攻击的错误

某些限制纯粹是为了避免已知的安全问题。

例如,对使用 UTF-7 的限制纯粹是为了避免作者成为使用 UTF-7 的已知跨站脚本攻击的的目标。[UTF7]

作者的意图不清楚的情况

作者意图不清楚的标记通常被划为不规范的。 尽早修复这些错误会使得后续维护更为容易。

例如,作者是要将以下内容作为 h1 标题还是 h2 标题的意图并不明确:

<h1>Contact details</h2>
可能是拼写错误的情况

当用户发生了拼写错误,提早捕获该错误是有帮助的,因为这可以节省作者很多调试时间。 因此本标准通常认为使用与本标准中定义的名字不匹配的元素名、属性名等是错误的。

例如,如果作者键入<capton> 而不是 <caption>,这将被标记为错误,作者可以立即更正错字。

将来可能会干扰新语法的错误

为了允许将来扩展语言语法,某些本来无害的特性也是不允许的。

例如,在结束标签中的“属性”目前被忽略,但它们是非法的。 以防未来使用该语法特性的语言变更与已部署(但是合法的!)内容产生冲突。

一些作者发现,在实践中总是用引号包含所有的属性并且总是包含所有的可选标签很有帮助, 相比于利用 HTML 语法的灵活性而带来的一点简洁,更偏好这一做法带来的一致性。 为了协助这样的作者,一致性检查器可以提供执行这一惯例的运行模式。

1.12.3 内容模型和属性值的限制

This section is non-normative.

除了语言的语法,本标准还对如何指定元素和属性做出了限制。 这些限制是出于类似的原因:

语义可疑的内容

为了避免误用定义了含义的元素, 定义内容模型时,限制了可疑的元素嵌套方式。

例如,本标准不允许 section 元素嵌套在 kbd 元素中,因为作者不太可能表示 应该键入整个 section

表达的语义存在冲突

类似地,为了让作者对元素使用中的错误引起注意, 表达出的语义存在明显的矛盾也被认为是一致性错误。

例如下面的片段中的语义是毫无意义的: 分隔符不能同时是单元格,单选按钮也不能是进度条。

<hr role="cell">
<input type=radio role=progressbar>

另一个例子是对ul元素的内容模型的限制, 该限制只允许 li 子元素。根据定义列表只可包含一些列表项。 所以如果 ul 元素包含一些除了 li 之外的元素, 它的含义就不清楚了。

默认样式可能会导致困惑的情况

某些元素有一些默认样式和行为,它们的某些组合可能会令人困惑。 如果存在没有这一问题的等效替代,就不允许这样令人困惑的组合。

例如,div 元素会被渲染为 block boxesspan 元素则为 inline boxes。将 block box 放到 inline box 中就会导致不必要的困惑;因为只嵌套 div 元素,或只嵌套 span 元素,或在div元素中嵌套 span 元素都可以与在span元素中嵌套div元素 达到同样的目的。但只有后者涉及到在 inline box 中嵌套 block box, 所以后者的组合方式是不允许的。

另一个可能的例子是 交互内容 不可嵌套。例如: button 元素不可包含 textarea 元素。 这是因为这样嵌套交互元素可能对用户造成困惑。可以并排放置这些元素。

对本标准可能的误解

有时,某些禁止是因为允许它将可能会让作者困惑。

例如,设置 disabled 属性为 "false" 是不允许的,因为表面上看起来它的含义是元素可用, 但实际上含义是元素被 禁用 (实现中起作用的是该属性是否存在,而非它的值)。

纯粹为了简化语言而强加的限制

一些一致性错误简化了作者需要学习的语言。

例如,area 元素的 shape 属性,在实践中虽然同时接受 circcircle 取值并作为同义词,但禁止 circ 值的使用, 以此来简化教程和其他学习材料。同时允许它们并没有好处, 但它们可能在学习语言时造成额外的困惑。

解析器的一些怪异行为

某些元素的解析有点奇怪(通常是由于历史原因), 它们的内容模型限制旨在避免作者碰到这些问题。

例如,phrasing content 中不允许 form 元素,因为当解析 HTML 时, form 元素的开始标签将会产生一个 p 元素的关闭标签。因此下面的标记会产生两个 段落(而不是一个):

<p>Welcome. <form><label>Name:</label> <input></form>

与下面代码的解析结果完全一样:

<p>Welcome. </p><form><label>Name:</label> <input></form>
可能导致难以调试的脚本错误的情况

有些错误旨在避免难以调试的脚本问题。

比如,这就是为什么有两个等值的 id 属性是不合法的。 重复的 ID 导致选择到错误的元素,有时会产生难以确定原因的灾难性后果。

会浪费编写时间的错误

某些构造被禁止是因为历史上它们曾浪费大量的编写时间。 鼓励作者避免使用这些构造,将来可以节省很多时间。

例如,script 元素的 src 属性会导致元素的内容被忽略。 然而这并不明显(尤其是元素内容是可执行脚本时)— 这会导致作者花费大量时间尝试调试内联脚本,却没意识到它并未执行。 为了减少这一问题,在本标准中src 属性出现时,script元素中不允许存在可执行脚本。 这意味着作者在验证他们的文档时,不太可能在这样的错误上浪费时间。

影响作者在 HTML 和 XML 语法间迁移的部分

有些作者喜欢编写用 XML 和 HTML 解释可以得到类似结果的文件。 由于种种微妙的复杂性(尤其是涉及脚本、样式、或其他任何自动的序列化), 一般并不鼓励这一做法,尽管如此,本标准也有一些限制意在在某种程度上减轻困难。 这让作者在 HTML 和 XML 语法之间迁移时,可以更容易地将其用于过渡步骤。

例如,围绕 langxml:lang 属性有一些复杂的规则, 就是为了让 HTML 和 XML 同步。

另一个例子可能是在 HTML 序列化中对 xmlns 属性值的限制,意在确保不管是 HTML 还是 XML 解析, 合法的文档中元素总在同一命名空间。

为将来扩充而保留的部分

对语法的某些限制是为了允许语言的未来版本中添加新的语法, 类似地,对元素和属性取值的内容模型的一些限制是为了允许将来对 HTML 词库进行扩充。

例如,限制 target 属性的值, 以 U+005F 下划线(_)起始的只能是特定的预定义值。这允许了在将来引入新的预定义值, 同时不会与作者定义的值产生冲突。

对其他标准的误用

某些限制意在支持其他标准作出的限制。

例如,使用媒体查询列表的属性只能使用 合法的 媒体查询列表,强调了遵循那一标准的一致性规则的重要性。

1.13 推荐阅读

This section is non-normative.

本标准的读者可能对以下文档感兴趣。

Character Model for the World Wide Web 1.0: Fundamentals [CHARMOD]

这个架构风格标准定义了 World Wide Web 中可互操作的文本操作。为其他标准的作者、软件开发者,以及内容开发者提供了通用的参考。 该标准构建在 Universal Character Set 之上,同时定义在 Unicode Standard 和 ISO/IEC 10646。 涉及的话题包括:字符、编码、字符串、引用处理模型、字符编码的选择和识别、字符转义,以及字符串索引。

Unicode 安全考虑 [UTR36]

由于 Unicode 包含大量的字符,引入了世界上不同的书写系统, 错误的使用会将程序和系统暴露在可能的安全攻击之下。随着越来越多的产品被国际化该问题尤为重要。 该标准描述了程序员、系统分析师、标准开发者,以及用户应当考虑的安全事项,为减少风险提供了明确的建议。

Web Content Accessibility Guidelines (WCAG) 2.0 [WCAG]

Web Content Accessibility Guidelines (WCAG) 2.0 对于提高 Web 内容的可访问性给出了广泛的建议。 遵循这些指导可以使更多的残障人士(包括失明和弱视、失聪和听觉损耗、学习和认知障碍、行动不便、语言障碍、光过敏等)可访问您的内容。 遵循这些指导也通常会使您的 Web 内容对普通用户更加可用。

Authoring Tool Accessibility Guidelines (ATAG) 2.0 [ATAG]

该标准为设计 Web 内容写作工具提供了指导意见,使得残障人士也可使用这些工具。 遵从这些指导的写作工具将会通过为残障作者提供可访问的用户界面以提升可访问性,以及为所有作者提供、支持和提升产出 Web 内容的可访问性。

User Agent Accessibility Guidelines (UAAG) 2.0 [UAAG]

该文档为设计降低残障人士 Web 访问门槛的用户代理提供了指导意见。 用户代理包括浏览器和其他获取和渲染 Web 内容的软件。 遵循这些指导的用户代理通过它自己的用户界面以及其他内部工具 (包括与其他技术通信的能力,尤其是辅助性技术)提升可访问性。 此外,除残障人士之外的所有用户都会发现遵循该标准用户代理更加可用。

2 公共基础设施

该标准依赖于 WHATWG Infra 标准。 [INFRA]

2.1 术语

该标准所说的属性,指的是 HTML,XML 和 IDL 属性,通常在同一个上下文中。当未具体提及所指时,HTML 和 XML 属性指的是 content attributes,而 IDL attributes指的是在 IDL 接口中定义的属性。同样,“属性”这个词也同时指 Javascript 对象属性和 CSS 属性。在可能产生混淆时, 该标准使用 object propertiesCSS properties 来区别。

一般而言,当该标准申明一个特性可以在 HTML 语法XML 语法 中应用,则在另一个中也可用。 当一个特性仅在两个语言之一中应用时,该标准将显式申明它不能在另一个语言中使用, 如:“可在 HTML 中使用,…… (该语法不可用于 XML)”。

该标准使用术语 文档指任何 HTML,从短小精悍的文档到长篇累牍的论文, 亦或是多媒体报告、完整的交互式应用程序。该术语同时指 Document 对象和他们的后裔 DOM 树。至于序列化的字节流, 则根据上下文使用 HTML 语法XML 语法 来表示。

在 DOM 结构的上下文中,使用的术语 HTML 文档XML 文档 定义在 DOM 标准中, 并且特指 Document 对象所处的两种不同模式。 [DOM] (这样的使用都会超链接到它们的定义)

在字节流的上下文中,术语 HTML 文档 指标记为 text/html 的资源, 术语 XML 文档 指标记为 XML MIME type 的资源。


简单起见,像 shown, displayed, 以及 visible 这样的术语可能会用来指明文档渲染给用户的方式, 这些术语并不是指应用于视觉媒介;必须考虑将它们以等价的方式应用于其他的媒介。

某个元素是visible的并不仅仅指该元素在视觉上可见,比如屏幕阅读器也应将该元素阅读给用户。

2.1.1 Parallelism

To run steps in parallel means those steps are to be run, one after another, at the same time as other logic in the standard (e.g., at the same time as the event loop). This standard does not define the precise mechanism by which this is achieved, be it time-sharing cooperative multitasking, fibers, threads, processes, using different hyperthreads, cores, CPUs, machines, etc. By contrast, an operation that is to run immediately must interrupt the currently running task, run itself, and then resume the previously running task.

To avoid race conditions between different in parallel algorithms that operate on the same data, a parallel queue can be used.

A parallel queue represents a queue of algorithm steps that must be run in series.

A parallel queue has an algorithm queue (a queue), initially empty.

To enqueue steps to a parallel queue, enqueue the algorithm steps to the parallel queue's algorithm queue.

To start a new parallel queue, run the following steps:

  1. Let parallelQueue be a new parallel queue.

  2. Run the following steps in parallel:

    1. While true:

      1. Let steps be the result of dequeueing from parallelQueue's algorithm queue.

      2. If steps is not nothing, then run steps.

      3. Assert: running steps did not throw an exception, as steps running in parallel are not allowed to throw.

      Implementations are not expected to implement this as a continuously running loop. Algorithms in standards are to be easy to understand and are not necessarily great for battery life or performance.

  3. Return parallelQueue.

Steps running in parallel can themselves run other steps in in parallel. E.g., inside a parallel queue it can be useful to run a series of steps in parallel with the queue.

Imagine a standard defined nameList (a list), along with a method to add a name to nameList, unless nameList already contains name, in which case it rejects.

The following solution suffers from race conditions:

  1. Let p be a new promise.

  2. Run the following steps in parallel:

    1. If nameList contains name, reject p with a TypeError and abort these steps.

    2. Do some potentially lengthy work.

    3. Append name to nameList.

    4. Resolve p with undefined.

  3. Return p.

Two invocations of the above could run simultaneously, meaning name isn't in nameList during step 2.1, but it might be added before step 2.3 runs, meaning name ends up in nameList twice.

Parallel queues solve this. The standard would let nameListQueue be the result of starting a new parallel queue, then:

  1. Let p be a new promise.

  2. Enqueue the following steps to nameListQueue:

    1. If nameList contains name, reject p with a TypeError and abort these steps.

    2. Do some potentially lengthy work.

    3. Append name to nameList.

    4. Resolve p with undefined.

  3. Return p.

The steps would now queue and the race is avoided.

2.1.2 资源

本标准中术语 支持 是指用户代理是否实现了对外部资源的语义的解码能力。 支持 某种格式或类型是指这一实现可以处理该格式或类型的外部资源,且处理过程不会忽略关键方面。 是否 支持 某种特定资源取决于该资源类型有哪些在用的特性。

例如,如果可以解码和渲染 PNG 图片的像素数据,就可以认为支持 PNG 图片格式。 即使这一实现不知道该图片还包含了动画数据。

如果不支持使用的压缩格式,即使实现可以从文件的元数据确定电影的尺寸,MPEG-4 视频文件也不会被视为支持的格式。

有些标准中(特别是 HTTP 标准)中称为 表示(representation) 的在本标准中称为 资源(resource)[HTTP]

资源的 关键子资源 是那些需要被正确处理的资源。 哪些资源被认为是关键的,由定义该资源格式的标准来定义。

2.1.3 XML 兼容性

为了方便从 HTML 迁移到 XML,遵循本标准的用户代理会把 HTML 中的元素放在 http://www.w3.org/1999/xhtml 命名空间, 至少是为了 DOM 和 CSS 的目的。 本标准中使用的术语 "HTML 元素",是指所有在那个命名空间中的元素, 包括 XML 文档中的。

除非另有声明,所有本标准中定义和提到的元素均位于 HTML ("http://www.w3.org/1999/xhtml"), 本标准中所有定义和提到的属性(Attribute)没有命名空间。

术语 元素类型 用于指代给定命名空间和局部名的那些元素。 例如,button 元素的元素类型为 button,意味着它们的局部名为 "button" 且(如上述定义地)命名空间为 HTML

如果属性名匹配 XML 中定义的 Name 生成式且不包含 U+003A COLON 字符(:),那么它就是 XML 兼容的 [XML]

2.1.4 DOM 树

当声明 忽略 某些元素或属性,或当作其他值处理,或当作其他东西处理时, 都是指节点在 DOM 中之后的处理。在这些情形下用户代理禁止改动 DOM。

只有内容属性的新值和原值不同时,才说内容属性的值发生了 改变; 将内容属性设置到它已有的值不会让它发生改变。

术语 用于属性值、文本 节点、或字符串时, 表示文本的长度是零(即不包含控制字符 或 U+0020 SPACE)。

插入节点 A 到节点 B 是指以 A 作为参数调用 插入步骤, 然后 A 新的父节点就是 B。类似地,从节点 B 移除节点 A 是指以 A 作为 removedNode 参数,以 B 作为 oldParent 参数调用 移除步骤

插入节点到文档 是指把它作为参数调用 插入步骤, 然后它就 在文档树中 了。类似地, 从文档中移除节点 是指把它作为参数调用 移除步骤, 然后它就不 在文档树中 了。

把节点作为参数调用 插入步骤 后, 节点就 变成已连接的。 类似地,把它作为参数调用 移除步骤 后, 节点就 变成了分离的

如果节点是 已连接的 且它的 包含 Shadow 的根浏览环境,那么它是 连接到浏览环境的。 把节点作为参数调用 插入步骤 后, 它就 连接到了浏览环境。 把节点作为参数调用移除步骤, 或者它的 包含 Shadow 的根 不再拥有 浏览环境 后, 它就 与浏览环境分离了

2.1.5 脚本

有时会用构造 "一个 Foo 对象" (其中 Foo 其实是一个接口), 来表示 "一个实现了 Foo 接口的对象"。

获取 IDL 属性的值称为 获取(例如在作者的脚本中), 将新的值赋值给 IDL 属性则称为 设置

如果 DOM 对象是 活的,该对象上的属性和方法 必须 在真正的底层数据(而不是数据快照)上进行操作。

2.1.6 插件

术语 插件 是指一些用户代理定义的内容处理程序,用户代理用它们 参与 Document 对象的渲染,但不会作为 Document子浏览环境,也不会给 Document 的 DOM 引入任何 Node 对象。

通常,这样的内容处理程序由第三方提供,尽管用户代理也可以将内置的内容处理程序指定为插件。

用户代理不得将 text/plainapplication/octet-stream 类型视为注册有 插件

插件的一个例子是当用户导航到PDF文件时在 浏览环境 中实例化的PDF查看器。 无论执行PDF查看器组件的一方是否与实现用户代理本身的方相同,这将被视为插件。 但是根据定义,与用户代理(而不是使用相同的接口)分开启动的PDF查看器应用程序不是插件。

该规范没有定义与插件交互的机制,因为插件预期就是用户代理和平台特定的。 UA 可以选择支持某种插件机制,比如 Netscape Plugin API; 也可以选择对某些类型使用远程内容转换器或提供内置支持。 实际上,本标准根本没有要求用户代理支持插件。[NPAPI]

安全 插件应该遵循 sandbox 属性的语义。

例如,在沙盒 iframe 中初始化的 安全插件应该阻止其中的内容创建弹出窗口。

在与 插件 的外部内容交互时,浏览器应该格外小心。 当第三方软件以与用户代理本身相同的权限运行时,第三方软件中的漏洞变得与用户代理中的漏洞同样危险。

因为不同的用户有不同的 插件,这提供了唯一识别用户的指纹向量, 推荐用户代理对每个用户都支持同样的 plugins(This is a fingerprinting vector.)

2.1.7 字符编码

字符编码 或着没有歧义时说的 编码,是一种字节流与 Unicode 字符串的转换, 定义在 WHATWG Encoding 标准中。编码 包括一个 编码名称 和一个或更多的 编码标签,编码的 名称标签 定义在 Encoding 标准中。 [ENCODING]

UTF-16BE 都是 UTF-16LE 都是 UTF-16 编码[ENCODING]

任何 UTF-16 编码 之外的 编码 都是 ASCII 兼容的编码[ENCODING]

因为 WHATWG Encoding 标准中没定义的编码都不允许使用, UTF-16 编码 是本标准中唯一需要处理的 不 ASCII 兼容的编码

2.1.8 符合性类别

本标准描述了 用户代理(实现者相关)和 文档 (作者和编写工具的实现者相关) 的符合性标准。

符合规范的文档 是符合所有符合性要求的文档。 为了提高可读性,有些符合性要求是对作者提出的;这些是对文档的隐性要求: 按照定义所有文档都有对应的作者。(有些情况下,作者本身可能是一个用户代理 — 这些用户代理受其他规则的约束,见下文。)

例如,如果一项要求声明 "作者 禁止使用 foobar 元素",意味着文档不允许包含名为 foobar 的元素。

文档的符合性要求与实现的符合性要求没有隐含的关系。 用户代理不能随意处理不合规范的文档;不论输入的文档是否合规,本标准中描述的处理模型都适用。

按照不同的符合性要求,用户代理分为(有重合的)几类。

Web 浏览器和其他交互式用户代理

支持 XML 语法 的 Web 浏览器必须按照本标准的描述 处理 XML 文档中 HTML 命名空间 的元素和属性, 以便用户与之交互,除非那些元素的语义已经被其他标准覆盖。

在 XML 文档中查找 script 元素时,符合规范的 Web 浏览器会执行该元素包含的脚本。然而,如果该元素处于 XSLT 变换中(假设用户代理也支持 XSLT), 那么处理器会将 script 元素作为组成这一变换的不透明元素处理。

支持 HTML 语法 的 Web 浏览器必须按照本标准的描述 处理标记为 HTML MIME 类型 的文档,以便用户与它们交互。

支持脚本的用户代理也必须一致地实现本标准中的 IDL 片段,IDL 片段定义在 Web IDL 标准中。 [WEBIDL]

除非明确声明,覆盖 HTML 元素语义的标准不覆盖对(表示这些元素的) DOM 对象的要求。 例如,上面例子中的 script 元素仍然实现 HTMLScriptElement 接口。

表示性的非交互式用户代理

处理 HTML 和 XML 文档并纯粹地渲染它们的非交互式版本的用户代理必须遵循与 Web 浏览器同样的符合性规范,除了它们可以免除用户交互的要求。

非交互式用户代理的典型例子就是打印机(静态 UA)和投影仪(动态 UA)。 多数静态的非交互式用户代理 不支持脚本

非交互式的动态 UA 仍然会执行脚本,以便动态提交表单。 但是因为没有获得焦点的概念,这些 UA 可能不需要实现焦点相关的 DOM API。

支持建议默认渲染的可视化用户代理

无论是交互式还是非交互式用户代理,都可以被指定(比如通过作为用户选项)本标准定义的建议默认渲染。

这并非强制要求,特别是即使用户代理实现了建议默认渲染,也建议为此提供设置来提升用户体验, 例如改变色彩对比度,使用不同的焦点样式,或者其他提升可访问性和可用性的方式。

如果指定了建议默认渲染,支持建议默认渲染的用户代理必须根据 渲染部分 定义的规则实现 用户代理 期望 实现的行为。

不支持脚本的用户代理

不支持脚本的实现(或者完全禁用了其脚本特性的用户代理)可以不支持本标准中提到的事件和 DOM 接口。 但对于本标准中定义的事件模型和 DOM,这些用户代理仍然必须表现地像支持事件和 DOM 一样。

脚本可能是构成应用的一部分。不支持脚本或禁用了脚本的 Web 浏览器可能无法完全表达作者的意图。

符合性检查器

符合性检查器必须验证文档是否符合 符合性检查程序必须验证文档是否符合本规范中描述的适用的一致性标准。 自动化的符合检查程序可以不必检测需要解释作者意图的错误(例如, blockquote 的内容不是引用文档就不符合标准,如果符合性检查程序在运行时没有人为判断的输入, 就不必检查 blockquote 元素是否只包含引用的内容)。

符合性检查器必须检查没有 浏览环境 (意味着没有脚本运行,并且禁用了解析器的 脚本标志 )时解析输入文档符合规范, 还应检查在会执行脚本的 浏览环境 下解析输入文档符合规范,并且脚本的执行永远不会导致不符合规范的状态(脚本执行过程中除外)出现。 (这只是一个“应该”而不是“必须”的要求,因为这已被证明是不可能的。[COMPUTABLE]

"HTML 校验器" 可以指代遵循本标准中的适用要求的符合性检查器。

XML DTD 无法表达本标准的所有符合性要求。因此 XML 校验器加 DTD 不能代替符合性检查器。 此外本标准中定义的这两种写作格式都不属于 SGML,因此 SGML 系统也不能代替符合性检查器。

换句话说,有三种符合性规则:

  1. DTD 可表达的规则。
  2. DTD 不可表达但仍然可以由机器检查的规则。
  3. 只能由人工检查的规则。

符合性检查器可以检查前面两种。简单的基于 DTD 的校验器只能检查第一类错误, 因此根据本标准,它不是一种遵循标准的符合性检查器。

数据挖掘工具

不是出于渲染文档或检查文档是否符合规范目的的,处理 HTML 和 XML 文档的应用程序和工具, 其行为应当与其处理的文档的语义保持一致。

只增加每个段落(paragraph)的嵌套层级但不增加每个章节(section)的嵌套层级的 文档大纲 生成工具是不合规范的。

只增加 <p> 的层级而不增加 <section> 的层级会破坏 DOM 原有的语义,比如让段落变成了子段落。

编写工具和标记生成器

编写工具和标记生成器必须生成 符合规范的文档。 在适当的地方,适用于作者的符合性规则也适用于编写工具。

如果编写工具还不能决定作者的意图,可以免除“只能按规定的用途使用元素”的严格要求。 但是编写工具禁止自动地错误使用元素或鼓励它们的用户这样做。

例如,将 address 元素用于任意的联系信息是不合规范的; 该元素只能用于标记文档或章节作者的联系信息。因为编写工具不能区分此意图,所以可以免除这项要求。 但这不意味着(比如)编写工具可以为了斜体字而任意地使用 address 元素; 只意味着编写工具可以在用户给章节插入联系信息时不验证它, 也不需保证用户没用它做别的事或插入别的东西。

在符合性检查方面,文本编辑器必须像符合性检查器一样输出符合规范的文档。

当使用编写工具编辑不符合规范的文档时,可以保持未编辑部分的符合性错误。 (即允许错误的内容经过编辑工具而不发生改变)。 但如果保持了错误,禁止编写工具声明其输出是符合规范的。

编写工具大致分为两类:在结构化或语义数据上进行编辑, 或者在所见即所得的(WYSIWYG)特定媒体上进行编辑。

前者是编写 HTML 工具的理想机制,因为源码信息中的结构可用于更好地选择 HTML 元素和属性。

但是 WYSIWYG 工具也是合理的。WYSIWYG 工具应该使用它们认为合适的元素, 不应该使用它们不确定是否合适的元素。这可能在特定极端情况下意味着对能够使用的流式元素做出限制, 比如 divbi,以及 span,以及使用大量的 style 属性。

不论是不是 WYSIWYG,所有编写工具都应该尽量让用户创建良构的、语义丰富的、媒体无关的内容。

为了防范诸如 DoS 攻击、内存耗尽,或解决平台相关的限制, 用户代理可能会对本来不受约束的输入强加实现相关的限制。 (This is a fingerprinting vector.)

为了兼容既有内容与标准,本标准描述了两种写作格式: 一种基于 XML, 另一种基于 SGML 启发的 自定义格式 (称为 HTML 语法)。 本标准鼓励实现同时支持以上两种格式,但至少支持其中一种。

一些符合性要求称为元素、属性、方法或对象的要求。 这些要求分为两类:描述内容模型限制的,和描述实现行为的。   前者是对文档和编写工具的要求,后者是对用户代理的要求。   类似地,另一些符合性要求称为对作者的要求;这些要求应解释为对作者产出的文档的符合性要求。 (换句话说,本标准不区分对作者和对文档的符合性要求)

2.1.9 Dependencies

This specification relies on several other underlying specifications.

Infra

The following terms are defined in the WHATWG Infra standard: [INFRA]

Unicode and Encoding

The Unicode character set is used to represent textual data, and the WHATWG Encoding standard defines requirements around character encodings. [UNICODE]

This specification introduces terminology based on the terms defined in those specifications, as described earlier.

The following terms are used as defined in the WHATWG Encoding standard: [ENCODING]

  • Getting an encoding
  • Get an output encoding
  • The generic decode algorithm which takes a byte stream and an encoding and returns a character stream
  • The UTF-8 decode algorithm which takes a byte stream and returns a character stream, additionally stripping one leading UTF-8 Byte Order Mark (BOM), if any
  • The UTF-8 decode without BOM algorithm which is identical to UTF-8 decode except that it does not strip one leading UTF-8 Byte Order Mark (BOM)
  • The encode algorithm which takes a character stream and an encoding and returns a byte stream
  • The UTF-8 encode algorithm which takes a character stream and returns a byte stream
XML and related specifications

Implementations that support the XML syntax for HTML must support some version of XML, as well as its corresponding namespaces specification, because that syntax uses an XML serialization with namespaces. [XML] [XMLNS]

Data mining tools and other user agents that perform operations on content without running scripts, evaluating CSS or XPath expressions, or otherwise exposing the resulting DOM to arbitrary content, may "support namespaces" by just asserting that their DOM node analogues are in certain namespaces, without actually exposing the namespace strings.

In the HTML syntax, namespace prefixes and namespace declarations do not have the same effect as in XML. For instance, the colon has no special meaning in HTML element names.


The attribute with the tag name xml:space in the XML namespace is defined by the XML specification. [XML]

The Name production is defined in the XML specification. [XML]

This specification also references the <?xml-stylesheet?> processing instruction, defined in the Associating Style Sheets with XML documents specification. [XMLSSPI]

This specification also non-normatively mentions the XSLTProcessor interface and its transformToFragment() and transformToDocument() methods. [XSLTP]

URLs

The following terms are defined in the WHATWG URL standard: [URL]

A number of schemes and protocols are referenced by this specification also:

Media fragment syntax is defined in the Media Fragments URI specification. [MEDIAFRAG]

HTTP and related specifications

The following terms are defined in the HTTP specifications: [HTTP]

The following terms are defined in the Cookie specification: [COOKIES]

  • cookie-string
  • receives a set-cookie-string
  • `Cookie` header

The following term is defined in the Web Linking specification: [WEBLINK]

The following terms are defined in the WHATWG MIME Sniffing standard: [MIMESNIFF]

Fetch

The following terms are defined in the WHATWG Fetch standard: [FETCH]

The following terms are defined in Referrer Policy: [REFERRERPOLICY]

The following terms are defined in Mixed Content: [MIX]

Web IDL

The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in the Web IDL specification. [WEBIDL]

The following terms are defined in the Web IDL specification:

The Web IDL specification also defines the following types that are used in Web IDL fragments in this specification:

The term throw in this specification is used as defined in the Web IDL specification. The DOMException type and the following exception names are defined by Web IDL and used by this specification:

When this specification requires a user agent to create a Date object representing a particular time (which could be the special value Not-a-Number), the milliseconds component of that time, if any, must be truncated to an integer, and the time value of the newly created Date object must represent the resulting truncated time.

For instance, given the time 23045 millionths of a second after 01:00 UTC on January 1st 2000, i.e. the time 2000-01-01T00:00:00.023045Z, then the Date object created representing that time would represent the same time as that created representing the time 2000-01-01T00:00:00.023Z, 45 millionths earlier. If the given time is NaN, then the result is a Date object that represents a time value NaN (indicating that the object does not represent a specific instant of time).

JavaScript

Some parts of the language described by this specification only support JavaScript as the underlying scripting language. [JAVASCRIPT]

Users agents that support JavaScript must also implement the ECMAScript Internationalization API Specification. [JSINTL]

The term "JavaScript" is used to refer to ECMA-262, rather than the official term ECMAScript, since the term JavaScript is more widely known. Similarly, the MIME type used to refer to JavaScript in this specification is text/javascript, since that is the most commonly used type, despite it being an officially obsoleted type according to RFC 4329. [RFC4329]

The following terms are defined in the JavaScript specification and used in this specification:

User agents that support JavaScript must also implement the import() proposal. The following terms are defined there, and used in this specification: [JSIMPORT]

User agents that support JavaScript must also implement the import.meta proposal. The following term is defined there, and used in this specification: [JSIMPORTMETA]

User agents that support JavaScript must also implement the BigInt proposal. [JSBIGINT]

DOM

The Document Object Model (DOM) is a representation — a model — of a document and its content. The DOM is not just an API; the conformance criteria of HTML implementations are defined, in this specification, in terms of operations on the DOM. [DOM]

Implementations must support DOM and the events defined in UI Events, because this specification is defined in terms of the DOM, and some of the features are defined as extensions to the DOM interfaces. [DOM] [UIEVENTS]

In particular, the following features are defined in the WHATWG DOM standard: [DOM]

The following features are defined in the UI Events specification: [UIEVENTS]

The following features are defined in the Touch Events specification: [TOUCH]

The following features are defined in the Pointer Events specification: [POINTEREVENTS]

This specification sometimes uses the term name to refer to the event's type; as in, "an event named click" or "if the event name is keypress". The terms "name" and "type" for events are synonymous.

The following features are defined in the DOM Parsing and Serialization specification: [DOMPARSING]

The Selection interface is defined in the Selection API specification. [SELECTION]

User agents are encouraged to implement the features described in the execCommand specification. [EXECCOMMAND]

The following parts of the WHATWG Fullscreen API standard are referenced from this specification, in part to define the rendering of dialog elements, and also to define how the Fullscreen API interacts with HTML: [FULLSCREEN]

The High Resolution Time specification provides the current high resolution time and the DOMHighResTimeStamp typedef. [HRT]

File API

This specification uses the following features defined in the File API specification: [FILEAPI]

Indexed Database API

This specification uses cleanup Indexed Database transactions defined by the Indexed Database API specification. [INDEXEDDB]

Media Source Extensions

The following terms are defined in the Media Source Extensions specification: [MEDIASOURCE]

Media Capture and Streams

The following terms are defined in the Media Capture and Streams specification: [MEDIASTREAM]

XMLHttpRequest

The following features and terms are defined in the XMLHttpRequest specification: [XHR]

Battery Status

The following features are defined in the Battery Status API specification: [BATTERY]

Media Queries

Implementations must support Media Queries. The <media-condition> feature is defined therein. [MQ]

CSS modules

While support for CSS as a whole is not required of implementations of this specification (though it is encouraged, at least for Web browsers), some features are defined in terms of specific CSS requirements.

When this specification requires that something be parsed according to a particular CSS grammar, the relevant algorithm in the CSS Syntax specification must be followed, including error handling rules. [CSSSYNTAX]

For example, user agents are required to close all open constructs upon finding the end of a style sheet unexpectedly. Thus, when parsing the string "rgb(0,0,0" (with a missing close-parenthesis) for a color value, the close parenthesis is implied by this error handling rule, and a value is obtained (the color 'black'). However, the similar construct "rgb(0,0," (with both a missing parenthesis and a missing "blue" value) cannot be parsed, as closing the open construct does not result in a viable value.

To parse a CSS <color> value, given a string input with an optional element element, run these steps:

  1. Let color be the result of parsing input as a CSS <color>. [CSSCOLOR]

  2. If color is failure, then return failure.

  3. If color is 'currentcolor', then:

    1. If element is not given, then set color to opaque black.

    2. Otherwise, set color to the computed value of the 'color' property of element.

  4. Return color.

The following terms and features are defined in the CSS specification: [CSS]

The CSS specification also defines the following border properties: [CSS]

Border properties
Top Bottom Left Right
Width 'border-top-width' 'border-bottom-width' 'border-left-width' 'border-right-width'
Style 'border-top-style' 'border-bottom-style' 'border-left-style' 'border-right-style'
Color 'border-top-color' 'border-bottom-color' 'border-left-color' 'border-right-color'

The terms intrinsic width and intrinsic height refer to the width dimension and the height dimension, respectively, of intrinsic dimensions.

The basic version of the 'display' property is defined in the CSS specification, and the property is extended by other CSS modules. [CSS] [CSSRUBY] [CSSTABLE]

The following terms and features are defined in the CSS Logical Properties specification: [CSSLOGICAL]

The following terms and features are defined in the CSS Color specification: [CSSCOLOR]

The term paint source is used as defined in the CSS Image Values and Replaced Content specification to define the interaction of certain HTML elements with the CSS 'element()' function. [CSSIMAGES]

The term default object size and the 'object-fit' property are also defined in the CSS Image Values and Replaced Content specification. [CSSIMAGES]

The following features are defined in the CSS Backgrounds and Borders specification: [CSSBG]

The term block-level is defined in the CSS Display specification. [CSSDISPLAY]

The following features are defined in the CSS Fonts specification: [CSSFONTS]

The 'list-style-type' property is defined in the CSS Lists and Counters specification. [CSSLISTS]

The 'overflow' property and its 'hidden' value are defined in the CSS Overflow specification. [CSSOVERFLOW]

The following features are defined in the CSS Positioned Layout specification: [CSSPOSITION]

The 'ruby-base' value of the 'display' property is defined in the CSS Ruby Layout specification. [CSSRUBY]

The following features are defined in the CSS Table specification: [CSSTABLE]

The following features are defined in the CSS Text specification: [CSSTEXT]

The following features are defined in the CSS Writing Modes specification: [CSSWM]

The following features are defined in the CSS Basic User Interface specification: [CSSUI]

The algorithm to update animations and send events is defined in the Web Animations specification. [WEBANIMATIONS].

Implementations that support scripting must support the CSS Object Model. The following features and terms are defined in the CSSOM specifications: [CSSOM] [CSSOMVIEW]

The following features and terms are defined in the CSS Syntax specifications: [CSSSYNTAX]

The following terms are defined in the Selectors specification: [SELECTORS]

The following features are defined in the CSS Values and Units specification: [CSSVALUES]

The term style attribute is defined in the CSS Style Attributes specification. [CSSATTR]

The following terms are defined in the CSS Cascading and Inheritance specification: [CSSCASCADE]

The CanvasRenderingContext2D object's use of fonts depends on the features described in the CSS Fonts and Font Loading specifications, including in particular FontFace objects and the font source concept. [CSSFONTS] [CSSFONTLOAD]

The following interfaces and terms are defined in the Geometry Interfaces Module specification: [GEOMETRY]

Intersection Observer

The following term is defined in the Intersection Observer specification: [INTERSECTIONOBSERVER]

WebGL

The following interface is defined in the WebGL specification: [WEBGL]

WebVTT

Implementations may support WebVTT as a text track format for subtitles, captions, metadata, etc., for media resources. [WEBVTT]

The following terms, used in this specification, are defined in the WebVTT specification:

The WebSocket protocol

The following terms are defined in the WHATWG Fetch standard: [FETCH]

The following terms are defined in the WebSocket protocol specification: [WSP]

  • the WebSocket connection is established
  • extensions in use
  • subprotocol in use
  • a WebSocket message has been received
  • send a WebSocket Message
  • fail the WebSocket connection
  • close the WebSocket connection
  • start the WebSocket closing handshake
  • the WebSocket closing handshake is started
  • the WebSocket connection is closed (possibly cleanly)
  • the WebSocket connection close code
  • the WebSocket connection close reason
  • Sec-WebSocket-Protocol field
ARIA

The role attribute is defined in the ARIA specification, as are the following roles: [ARIA]

In addition, the following aria-* content attributes are defined in the ARIA specification: [ARIA]

Finally, the following terms are defined in the ARIA specification: [ARIA]

Content Security Policy

The following terms are defined in Content Security Policy: [CSP]

Service Workers

The following terms are defined in Service Workers: [SW]

Secure Contexts

The following algorithm is defined in Secure Contexts: [SECURE-CONTEXTS]

Feature Policy

The following terms are defined in Feature Policy: [FEATUREPOLICY]

Payment Request API

The following feature is defined in the Payment Request API specification: [PAYMENTREQUEST]

MathML

While support for MathML as a whole is not required by this specification (though it is encouraged, at least for Web browsers), certain features depend upon small parts of MathML being implemented. [MATHML]

The following features are defined in the MathML specification:

SVG

While support for SVG as a whole is not required by this specification (though it is encouraged, at least for Web browsers), certain features depend upon parts of SVG being implemented.

User agents that implement SVG must implement the SVG 2 specification, and not any earlier revisions.

The following features are defined in the SVG 2 specification: [SVG]

Filter Effects

The following feature is defined in the Filter Effects specification: [FILTERS]

Worklets

The following feature is defined in the Worklets specification: [WORKLETS]


This specification does not require support of any particular network protocol, style sheet language, scripting language, or any of the DOM specifications beyond those required in the list above. However, the language described by this specification is biased towards CSS as the styling language, JavaScript as the scripting language, and HTTP as the network protocol, and several features assume that those languages and protocols are in use.

A user agent that implements the HTTP protocol must implement HTTP State Management Mechanism (Cookies) as well. [HTTP] [COOKIES]

This specification might have certain additional requirements on character encodings, image formats, audio formats, and video formats in the respective sections.

2.1.10 可扩展性

强烈不鼓励本规范的厂商专有的用户代理扩展。 文档不能使用这样的扩展,因为这样做减少了互操作性并且分割了用户群,只允许特定用户代理的用户访问相关内容。

所有扩展的定义必须使得,扩展的使用既不会违反本标准,也不会导致本标准定义的功能的不一致。

例如(强烈不鼓励这样做)实现上可以为控件添加一个新的 IDL 属性 "typeTime" 返回(比如)用户选择控件的当前值所花费的时间。 另一方面,在表单的 elements 数组中定义一个新的控件也会违反上述要求, 因为它将违反本标准给出的 elements 定义。


当本标准需要厂商中立的扩展时,或者相应地更新本标准,或者编写一个扩展标准并重写本标准中的要求。 如果有人在他的活动中使用了本标准,并决定识别该扩展标准的要求,这一标准就变成了本标准中符合性要求的 适用规范

有人可能会编写一个规范来定义任意的字节流为合规的,然后声明他的随机产生的垃圾为符合规范的。 但是这并不意味着他的随机垃圾符合所有人的目的:如果有人认为该标准不适用于他的工作, 他就可以很合理地说上述随机垃圾就是垃圾,根本不符合规范。 就符合性而言,(某一特定)社区内 同意 适用才是最重要的。


用户代理必须将它们不理解的原始和属性当作语义中立的来处理; (DOM 处理器)把它们留在 DOM 中,(CSS 处理器)根据 CSS 设置它们的样式, 但不要推测它们的语义。

当功能的支持被禁用时(例如作为减轻安全问题的紧急措施或协助开发或出于性能原因), 用户代理的表现必须像不支持该功能一样,像本标准没提到该功能一样。 例如,如果某个特性是通过 Web IDL 接口的属性来访问的,实现该接口的对象将会忽略掉这个属性 — 把属性留在对象上,让它返回 null 或抛出异常是不够的。

2.1.11 与 XPath 和 XSLT 交互

Spec bugs: 18460

操作以本标准的方式解析或创建的 HTML 文档 (例如作为 document.evaluate() API 的一部分) 的 XPath 1.0 的实现必须在 XPath 1.0 标准的基础上遵循以下改动。

首先,移除这一段话:

节点测试中的 QName 使用表达式上下文的命名空间声明展开为 expanded-name, 展开的方式与开始和结束标签的元素类型名称一样,但是不使用以 xmlns 声明的默认命名空间:如果 QName 没有前缀,那么命名空间 URI 就是 null (这与属性名的展开方式相同)。 如果 QName 的命名空间前缀 在表达式上下文中没有声明将会引发错误。

然后,在同样的位置插入下面一段:

节点测试中的 QName 使用表达式上下文的命名空间声明展开为 expanded-name。 如果 QName 有前缀,则该前缀必须在表达式上下文中有一个 URI 与之关联的命名空间声明, 且相应的。 如果 QName 的命名空间前缀 在表达式上下文中没有声明将会引发错误。

如果 QName 没有前缀且轴的主节点类型为元素,那么使用默认的元素命名空间。 否则,如果 QName 没有前缀,命名空间 URI 就是 null。 默认的元素命名空间是 XPath 表达式的上下文中的成员。 按照 DOM3 XPath API 执行 XPath 表达式时,默认的元素命名空间的值由以下方式决定:

  1. 如果上下文节点来自 HTML DOM,默认元素命名空间是 "http://www.w3.org/1999/xhtml"。
  2. 否则,默认元素命名空间 URI is null。

这相当于将 XPath 2.0 的默认元素命名空间特性添加到 XPath 1.0, 并将 HTML 命名空间用作 HTML 文档的默认元素命名空间。这样做是希望实现兼容于遗留的 HTML 内容的同时, 支持本标准在 HTML 元素命名空间方面引入的变更,以及希望使用 XPath 1.0 而不是 XPath 2.0。

这一变更的 有意的违反 XPath 1.0 标准, 这样做是希望实现兼容于遗留内容的同时支持本标准在 HTML 元素命名空间方面引入的变更。 [XPATH10]


当输出方法为 "html" 时(显式地设置或采用了 XSLT 1.0 的默认规则), XSLT 1.0 处理器的 DOM 输出受一下规则的影响:

如果转换程序输出没有命名空间的元素, 处理器必须在构造相应的 DOM 元素节点之前将元素的命名空间更改为 HTML 命名空间, 将局部名称 改为 ASCII 小写, 并且把元素上无命名空间的属性名 改为 ASCII 小写

本要求是 XSLT 1.0 标准的 故意违反, 本标准为了兼容基于 DOM 的 XSLT 转换,而改变了 HTML 的命名空间和大小写敏感性规则。 (不影响序列化该输出的处理器) [XSLT10]


本标准不指定 XSLT 处理具体如何与 HTML 解析器 基础设施交互 (例如,XSLT 处理器是否将所有元素放到 打开元素栈 中)。 但是当成功地完成后,XSLT 处理器必须 停止解析, 也必须首先将 当前文档就绪状态 设置为 "interactive",在退出后再设置为 "complete"。


本标准不指定 XSLT 如何与 导航 算法进行交互, 如何与 事件循环 相匹配, 也不指定错误页面如何处理(例如 XSLT 错误是替代 XSLT 增量输出,还是内联呈现等等)。

script 元素部分,有一些关于 XSLT 与 HTML 之间交互的非规范性注释, template 元素部分 有一些关于 XSLT,XPath,和 HTML 之间交互的非规范性注释。

2.2 区分大小写和字符串比较

使用case-sensitive的方式来比较两个字符串意味着逐代码点、精确地比较它们。

除非特殊申明,字符串比较必须case-sensitive(区分大小写)。

当字符串 s 不长于字符串 pattern 时,将字符串 s 截断到 pattern 的长度时,两个字符串彼此匹配。这被称为prefix match(前缀匹配)。

2.3 公共微语法

HTML 中有很多地方接受特定的数据类型,比如日期和数字。 这一部分描述了那些类型的内容应符合的标准,以及如何解析它们。

强烈要求实现者仔细地检查考虑用来实现如下语法解析的第三方库。 例如,日期库实现的错误处理行为可能与本标准所要求的不同。 因为在描述类似本标准使用的日期语法的其他标准中,通常没有给出错误处理行为, 所以实现的错误处理可能很不一样。

2.3.1 常见的解析器风格

空格字符 是 在 Unicode PropList.txt 数据文件中 Unicode 属性为 "White_Space" 的字符。[UNICODE]

不要与 Unicode.txt 数据文件中 "Bidi_Class" 属性的 "White_Space" 值(缩写为 "WS")相混淆。

有些下面描述的微解析器遵循这样的模式:维护一个 input 变量保存待解析字符串,以及一个 position 变量指向 input 中下一个要解析的字符。

2.3.2 布尔属性

有些属性是 布尔属性。 布尔属性出现在元素上表示值为 true,不出现表示表示值为 false。

如果该属性出现,它的值必须为空字符串或者匹配属性的标准名称的 ASCII 大小写不敏感 字符串, 并且前后没有空格。

布尔属性上不允许 "true" 和 "false" 值。 为了表示 false 值,应该一并忽略该属性。

这里有一个例子,表示复选框被选中和禁用。 checkeddisabled 属性就是布尔属性。

<label><input type=checkbox checked name=cheese disabled> Cheese</label>

这可以等价地写成:

<label><input type=checkbox checked=checked name=cheese disabled=disabled> Cheese</label>

你也可以混合两种风格;下面的写法仍然是等价的:

<label><input type='checkbox' checked name=cheese disabled=""> Cheese</label>

2.3.3 关键字和枚举属性

有些属性定义为取值只能是有限的关键字集合中的一个。 这样的属性称为 枚举属性。 这些关键字都定义为映射到特定的状态 state (可能多个关键字映射到同一个状态, 此时这些关键字互为同义词;此外有些关键字其实是不合规范的,它们在还在这里完全是历史原因)。 除此之外可以给出两个默认状态:第一个是 非法值的默认状态, 第二个是 缺失值的默认状态

如果指定了枚举属性,属性值必须是一个匹配其中一个关键字(不包括不合规范)的 ASCII 大小写不敏感 字符串,并且前后没有空格。

指定属性时,如果它的值是匹配其中一个关键字的 ASCII 大小写不敏感 字符串 那么该属性表示的状态就是该关键字的状态。如果属性值不匹配任何给定的关键字,但该属性有一个 非法值的默认状态,那么该属性表示那个状态。 否则如果该属性的值不匹配任何关键字但定义有一个 缺失值的默认状态, 那么该属性表示的状态就是 那个状态。否则,没有默认状态的情况, 非法值不表示任何状态。

没有 指定属性时,如果定义有 缺失值的默认状态, 那么这个(缺失)属性表示的状态就是这个状态。否则, 缺失的属性不表示任何状态。

空字符串可以是一个合法的关键字。

2.3.4 数字

2.3.4.1 有符号整数

由一个或更多 ASCII 数字 组成的字符串就是 合法的整数。 可以有一个 U+002D HYPHEN-MINUS 字符 (-) 作为前缀。

没有 U+002D HYPHEN-MINUS 字符 (-) 作为前缀的 合法整数 表示 该数字字符串以 10 为基所表示的数字。 有着 U+002D HYPHEN-MINUS 字符 (-) 作为前缀的 合法的整数 表示零减去该字符串以 10 为基所表示的数字。

解析整数的规则 由下列算法给出。 被调用时,必须以给定的步骤执行,在第一个有返回值的步骤中止。该算法会返回一个整数或者一个错误。

  1. input 为被解析的字符串。

  2. positioninput 里面的指针,初始指向字符串的开始。

  3. sign 拥有值 "positive"。

  4. 跳过 input 中的 ASCII 空格,得到 position

  5. 如果 position 越过了 input 的末尾,返回一个错误。

  6. 如果 position 处的(第一个)字符是一个 U+002D HYPHEN-MINUS 字符 (-):

    1. sign 为 "negative"。
    2. position 前进到下一个字符。
    3. 如果 position 越过了 input 的末尾,返回一个错误。

    否则,如果 position 处的(第一个)字符是一个 U+002B PLUS SIGN 字符 (+):

    1. position 前进到下一个字符。 (虽然 "+" 会被忽略但并不符合规范。)
    2. 如果 position 越过了 input 的末尾,返回一个错误。
  7. 如果 position 处的字符不是 ASCII 数字,则返回一个错误。

  8. input 的给定 position 收集ASCII 数字 的代码点序列,将得到的序列解释为以10为基的整数。 令 value 为该整数。

  9. 如果 sign 为 "positive",返回 value,否则返回0减去 value 的结果。

2.3.4.2 非负整数

由一个或更多 ASCII 数字 组成的字符串就是 合法的非负整数

合法的非负整数 表示该数字字符串以10为基所表示的数字。

解析非负整数的规则 由以下算法给出,被调用时该算法必须按顺序执行以下步骤,在第一个有返回值的步骤中止。 该算法将返回 0,正整数或者错误。

  1. input 为被解析的字符串。

  2. value 为使用 解析整数的规则 解析 input 的结果。

  3. 如果 value 是一个错误, 返回一个错误。

  4. 如果 value 小于零, 返回一个错误。

  5. 返回 value

2.3.4.3 浮点数

合法的浮点数 这样构成:

  1. 一个可选的 U+002D HYPHEN-MINUS 字符(-)。
  2. 下面的其中一个或者依次的两个:
    1. 一个或更多 ASCII 数字 组成的序列。
    2. 依次出现:
      1. 单个 U+002E FULL STOP 字符(.)。
      2. 一个或更多 ASCII 数字 组成的序列。
  3. 可选地:
    1. 一个 U+0065 LATIN SMALL LETTER E 字符(e)或 U+0045 LATIN CAPITAL LETTER E 字符(E)。
    2. 可选地,一个 U+002D HYPHEN-MINUS 字符(-) 或 U+002B PLUS SIGN 字符 (+)。
    3. 一个或更多 ASCII 数字 组成的序列。

合法的浮点数 表示将有效数乘以10的指数。 其中有效数是第一个数字,按十进制解析(包括小数点和小数点后的数字,如果后面有的话) 如果整个字符串以 U+002D HYPHEN-MINUS character (-)字符开始且该数字不为零的话, 将有效数解析为负数。 其中指数是 E 后面的数字(如果有的话),如果在 E 和该数字之间有一个 U+002D HYPHEN-MINUS 字符(-) 且该数字不为零的话,解析为负数,如果在 E 和该数字之间有一个 U+002B PLUS SIGN 字符(+)的话忽略该字符。 如果没有 E,指数当做零来处理。

Infinity 和 Not-a-Number (NaN)值不是 合法的浮点数

典型地, 合法的浮点数 的概念只用于限制作者,对用户代理的要求采用下面的 解析浮点数值的规则 (例如,progress 元素的 max 属性)。 然而,在某些情况下要求用户代理检查字符串是否是 合法的浮点数(例如, Number 状态的 input 元素的 值清理算法,或者 解析 srcset 属性 算法)。

浮点数的最佳表示 n 是 运行 ToStringn)得到的字符串。 ToString 抽象方法不是唯一确定的。如果在特定的值上运行 ToString 可能得到多个字符串,用户代理必须对那个值总是返回同样的字符串 (虽然它可能和其他用户代理使用的值不同)。

解析浮点数值的规则 由以下算法给出。 该算法必须在第一个有返回值的步骤中止。 该算法将会返回一个数字或者错误。

  1. input 为被解析的字符串。

  2. positioninput 内的指针,初始指向字符串的开始。

  3. value 的值为 1。

  4. divisor 的值为 1。

  5. exponent 的值为 1。

  6. 跳过 input 中的 ASCII 空格,得到 position

  7. 如果 position 越过了 input 的末尾,返回一个错误。

  8. 如果 position 处的(第一个)字符是一个 U+002D HYPHEN-MINUS 字符 (-):

    1. valuedivisor 改为 −1。
    2. position 前进到下一个字符。
    3. 如果 position 越过了 input 的末尾,返回一个错误。

    否则,如果 position 处的(第一个)字符是一个 U+002B PLUS SIGN 字符 (+):

    1. position 前进到下一个字符。 (虽然 "+" 会被忽略但并不符合规范。)
    2. 如果 position 越过了 input 的末尾,返回一个错误。
  9. 如果 position 处的字符是 U+002E FULL STOP (.),且不是 input 的最后一个字符, 而且 position 表示的字符的后一个字符是 ASCII 数字, 则将 value 设置为零并跳到 fraction 标记的步骤。

  10. 如果 position 处的数字不是 ASCII 数字, 则返回一个错误。

  11. input 的给定 position 收集ASCII 数字 的代码点序列,将得到的序列解释为以10为基的整数。 将 value 乘以该整数。

  12. 如果 position 越过了 input 的末尾,跳到标记为 conversion 的步骤。
  13. Fraction:如果 position 处的数字是 U+002E FULL STOP (.),运行以下子步骤:

    1. position 前进到下一个字符。

    2. 如果 position 越过了 input 的末尾或者不是 ASCII 数字、 U+0065 LATIN SMALL LETTER E (e),或 U+0045 LATIN CAPITAL LETTER E (E), 跳到 conversion 标记的步骤。

    3. 如果 position 处的字符是 U+0065 LATIN SMALL LETTER E character (e)或 U+0045 LATIN CAPITAL LETTER E 字符(E),跳过下面的子步骤。

    4. Fraction loop: 将 divisor 乘以 10。

    5. 按照十进制(0..9)解释 position 处的字符,除以 divisor, 加到 value 上。
    6. position 前进到下一个字符。

    7. 如果 position 越过了 input 的末尾, 跳到 conversion 标记的步骤。

    8. 如果 position 处的字符是 ASCII 数字, 跳回到 fraction loop 标记的子步骤。

  14. 如果 position 处的字符是 U+0065 (e)或 U+0045 (E),则:

    1. position 前进到下一个字符。

    2. 如果 position 越过了 input 的末尾,跳到标记为 conversion 的步骤。

    3. 如果 position 处的字符是 U+002D HYPHEN-MINUS 字符(-):

      1. exponent 设置为 −1。
      2. position 前进到下一个字符。
      3. 如果 position 越过了 input 的末尾,跳到标记为 conversion 的步骤。

      否则,如果 position 处的字符是 U+002B PLUS SIGN 字符(+):

      1. position 前进到下一个字符。
      2. 如果 position 越过了 input 的末尾,跳到标记为 conversion 的步骤。

    4. 如果 position 处的字符不是 ASCII 数字,则跳到标记为 conversion 的步骤。

    5. input 的给定 position 收集ASCII 数字 的代码点序列,将得到的序列解释为以 10 为基的整数。 将 exponent 乘以该整数。

    6. value 乘以 10 的 exponent 指数。

  15. Conversion: 令S 为 IEEE 754 双精度浮点数值的有限集, −0 除外,但新增 21024 和 −21024 两个值。

  16. rounded-valueS 最接近 value 的数字, 如果有两个同样接近的数值,则选择有效数为奇数的数字。 (在这个处理中,21024 和 −21024 这两个特殊值应视为有奇数的有效数。)

  17. 如果 rounded-value 是 21024 或 −21024,返回错误。

  18. 返回 rounded-value

2.3.4.4 百分数和长度

解析维度值的规则 由下面算法给出。被调用时必须按给定顺序执行这些步骤,并在第一个有返回值的步骤中止。 本算法将会返回一个大于等于 0.0 的数字,或者一个错误;如果返回了数字, 那么它可能是百分数或者长度。

  1. input 为被解析的字符串。

  2. positioninput 中的指针,初始指向字符串的开始。

  3. 跳过 input 中的 ASCII 空格,得到 position

  4. 如果 position 越过了 input 的末尾,返回一个错误。

  5. 如果 position 处的字符是一个 U+002B PLUS SIGN 字符 (+), 将 position 前进到下一个字符

  6. 如果 position 越过了 input 的末尾,返回一个错误。

  7. 如果 position 处的字符不是 ASCII 数字,则返回一个错误。

  8. input 的给定 position 收集ASCII 数字 的代码点序列,将得到的序列解释为以 10 为基的整数。 令 value 为该整数。

  9. 如果 position 越过了 input 的末尾,将 value 作为长度返回。

  10. 如果 position 处的字符是 U+002E FULL STOP character (.):

    1. position 前进到下一个字符。

    2. 如果 position 越过了 input 的末尾,或者 position 处的字符不是 ASCII 数字,则将 value 作为长度返回。

    3. divisor 值为 1。

    4. Fraction loop:将 divisor 乘以 10。

    5. 按照十进制(0..9)解释 position 处的字符,除以 divisor, 加到 value 上。
    6. position 前进到下一个字符。

    7. 如果 position 越过了 input 的末尾,则将 value 作为长度返回。

    8. 如果 position 处的字符是一个 ASCII 数字, 返回到标记为 fraction loop 的子步骤。

  11. 如果 position 越过了 input 的末尾,则将 value 作为长度返回。

  12. 如果 position 处的字符是 U+0025 PERCENT SIGN character(%), 将 value 作为百分数返回。

  13. value 作为长度返回。

2.3.4.5 非零百分数和长度

解析非零维度值的规则 由下列算法给出。被调用时必须按给定顺序执行这些步骤,并在第一个有返回值的步骤中止。 本算法将会返回一个大于 0.0 的数字或者一个错误;如果返回了数字, 那么它可能是百分数或者长度。

  1. input 为被解析的字符串。

  2. value 为使用 解析维度值的规则 解析 input 的结果。

  3. 如果 value 是一个错误,返回一个错误。

  4. 如果 value 为 0,返回一个错误。

  5. 如果 value 为百分数,将 value 作为百分数返回。

  6. value 作为长度返回。

2.3.4.6 浮点数列表

合法的浮点数列表 是以 U+002C COMMA 字符分隔的 合法浮点数 , 且没有其他字符(比如 ASCII 空格)。 此外,可能会有浮点数个数限制,或者取值范围限制。

解析浮点数列表的规则 如下:

  1. input 为被解析的字符串。

  2. positioninput 中的指针,初始指向字符串的开始。

  3. numbers 为空的浮点数列表。该列表将会是本算法的结果。

  4. input 的给定 position 收集ASCII 空格, U+002C COMMA,或者 U+003B SEMICOLON 字符的代码点序列。 本步骤跳过了所有前导分隔符。

  5. position 没有越过 input 的末尾时:

    1. input 的给定 position 收集 不是 ASCII 空格, U+002C COMMA,U+003B SEMICOLON, ASCII 数字, U+002E FULL STOP, 或 U+002D HYPHEN-MINUS 字符的代码点序列。 本步骤跳过了前导的无用字符。

    2. input 的给定 position 收集 不是 ASCII 空格, U+002C COMMA,或者 U+003B SEMICOLON 字符的代码点序列,令 unparsed number 为收集的结果。

    3. number 为使用 解析浮点数值的规则 解析 unparsed number 的结果。

    4. 如果 number 是一个错误,将 number 设置为 0。

    5. number 添加到 numbers

    6. input 的给定 position 收集ASCII 空格, U+002C COMMA,或者 U+003B SEMICOLON 字符的代码点序列。 本步骤跳过了分隔符。

  6. 返回 numbers

2.3.4.7 维度值列表

解析维度值列表的规则 如下。 这些规则返回一个由数字或单位组成的偶对列表,包含0个或更多偶对。 其中的单位是 percentage, relative,和 absolute 之一。

  1. raw input 为被解析的字符串。

  2. 如果 raw input 的最后一个字符是 U+002C COMMA character(,), 则从 raw input 中移除该字符。

  3. 用逗号分割 raw input 字符串。 令raw tokens 为得到的标记列表。

  4. result 为 number/unit 偶对的空列表。

  5. raw tokens 中的每一个标记,运行以下子步骤:

    1. input 为该标记。

    2. positioninput 中的指针,初始指向字符串的开始。

    3. value 为数字 0。

    4. unitabsolute

    5. 如果 position 越过了 input 的末尾,将 unit 设为 relative 并跳到最后一个子步骤。

    6. 如果 position 处的字符是 ASCII 数字, 从 input 的给定 position 收集ASCII 数字 的代码点序列,将得到的序列解释为以10为基的整数, 将 value 递增这个整数。

    7. 如果在 position 处的字符是 U+002E(.),则:

      1. input 的给定 position 收集ASCII 空格ASCII 数字 的代码点序列, 令 s 为得到的结果序列。

      2. 移除 s 中所有的 ASCII 空格

      3. 如果 s 不是空字符串,则:

        1. lengths 中(移除空格后的)字符数。

        2. fraction 为将 s 解释为以10为基的整数后的结果, 将这个数字除以 10length

        3. value 递增 fraction

    8. 从给定的 position 跳过 input 中的 ASCII 空白字符

    9. 如果 position 处的字符是 U+0025 PERCENT SIGN 字符(%), 将 unit 设为 percentage

      否则,如果 position 处的字符是 U+002A ASTERISK 字符(*), 则将 unit 设为 relative

    10. result 中增加一项,包含由 value 给定的数字, 以及由 unit 给定的单位。

  6. 返回 result 列表。

2.3.5 日期和时间

在下面的算法中, yearmonth 月的天数 是: 这考虑了格里历(现行公历)的闰年。[GREGORIAN]

当本部分定义的日期与时间语法中使用了 ASCII 数字 时, 这些数字表示10进制数。

虽然这里描述的格式旨在成为相应的 ISO8601 格式的子集,但是本规范比 ISO8601 更详细地定义了解析规则。因此,在使用实现者之前,请仔细检查任何日期解析库,然后再使用它们来实现下面描述的解析规则; ISO8601 库可能不会以完全相同的方式解析日期和时间。[ISO8601]

本标准中的 外推格里历 是指现代格里历向前外推到第 1 年。 外推格里历 中的日期 (有时直接称 外推格里历日期), 的指用外推格里历描述的日期,即使当时还没有颁布格里历。 [GREGORIAN]

格里历在本标准中作为连线协议使用并非出于决策者的文化偏好。参考: 对表单中的 date,time,和 number 格式 的讨论 (对作者而言), 关于表单控件本地化的实现说明,, 以及 time 元素。

2.3.5.1 月份

月份 由特定的 外推格里历日期 组成, 不包含时区信息,也不包含年和月以上的日的信息。[GREGORIAN]

表示 yearmonth 月的 合法的月字符串 包含下列部分(有序):

  1. 表示 year 年的 4 个或更多 ASCII 数字, 其中 year > 0
  2. 一个 U+002D HYPHEN-MINUS 字符(-)
  3. 表示 month 月的两个 ASCII 数字,在范围 1 ≤ month ≤ 12 之内

解析月字符串 的规则如下。将返回年和月,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析月的部分 来获得 yearmonth。 如果它没有返回,则失败。

  4. 如果 position 没有 超出 input 的结尾,则失败。

  5. 返回 yearmonth

给定 input 字符串和位置 position解析月的部分 的规则如下。 将返回年和月,或者什么都不返回。 如果算法的任何一个步说它 "失败了",这意味着它在那一步退出并什么都不返回。

  1. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不够 4 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 year

  2. 如果 year 不是大于0的数字则失败。。

  3. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+002D HYPHEN-MINUS 字符,则失败。 否则将 position 前进一个字符。

  4. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 month

  5. 如果 month 不是 1 ≤ month ≤ 12 范围内的数字就失败。

  6. 返回 yearmonth

2.3.5.2 日期

日期 由特定的 外推格里历日期 组成, 不包含时区信息,由年、月、日组成。[GREGORIAN]

表示 year 年,month 月,day 日的 合法的日期字符串 由下列几个有序的组成部分:

  1. 表示 yearmonth合法的月字符串
  2. 一个 U+002D HYPHEN-MINUS 字符(-)
  3. 表示 day 的两个 ASCII 数字, 处于范围 1 ≤ day ≤ maxday 内,其中 maxdayyearmonth 月的天数

解析日期字符串 的规则如下。将会返回一个日期或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析日期部分 来获得 yearmonthday。 如果它没有返回,则失败。

  4. 如果 position 没有 超出 input 的结尾,则失败。

  5. date 的年月日分别为 yearmonthday

  6. 返回 date

给定 input 字符串和位置 position解析日期部分 的规则如下。 将返回年、月、日,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. 解析月的部分 来获得 yearmonth 如果它没有返回,则失败。

  2. maxdayyearmonth 月的天数

  3. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+002D HYPHEN-MINUS 字符,则失败。 否则将 position 前进一个字符。

  4. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 day

  5. 如果 day 不是 1 ≤ day ≤ maxday 范围内的数字就失败。

  6. 返回 yearmonthday

2.3.5.3 无年的日期

一个 无年的日期 由一个格里历月和该月内的一天组成,但没有关联的年份。[GREGORIAN]

表示 monthday 日的 合法的无年日期 包含如下有序的部分:

  1. 可选地,两个 U+002D HYPHEN-MINUS 字符 (-)
  2. 表示 month 月的两个 ASCII 数字,在范围 1 ≤ month ≤ 12 之内
  3. 一个 U+002D HYPHEN-MINUS 字符 (-)
  4. 表示 day 的两个 ASCII 数字, 处于范围 1 ≤ day ≤ maxday 内,其中 maxday 任意闰年(例如 4 或 2000)的 month 月的天数

换句话说,如果 month 为 "02"(二月), 那么可以是 29 日,把这一年当做闰年。

解析无年的日期字符串 的规则如下。 将会返回月和日,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析无年的日期部分 来获得 monthday。 如果它没有返回,则失败。

  4. 如果 position 没有 超出 input 的结尾,则失败。

  5. 返回 monthday

给定 input 字符串和位置 position解析无年的日期部分 的规则如下。 将返回月和日,或者什么都不返回。 如果算法的任何一个步说它 "失败了",这意味着它在那一步退出并什么都不返回。

  1. input 中给定的位置 position 收集 U+002D HYPHEN-MINUS 字符 (-)组成的代码点序列。 如果收集到的序列长度不是 0 或 2,就失败。

  2. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列长度不是 2 就失败。 否则将结果序列解释为 10 进制整数。令那个数为 month

  3. 如果 month 不是 1 ≤ month ≤ 12 范围内的数字就失败。

  4. maxday 任意闰年(例如 4 或 2000)的 month 月的天数

  5. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+002D HYPHEN-MINUS 字符,则失败。 否则将 position 前进一个字符。

  6. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 day

  7. 如果 day 不是 1 ≤ day ≤ maxday 范围内的数字就失败。

  8. 返回 monthday

2.3.5.4 时间

时间 由一个没有时区信息的特定时间组成。 包含小时、分钟、秒,以及秒的小数。

hourminutesecond 秒的 合法的时间字符串 由以下有序的几部分组成:

  1. 表示 hour 的两个 ASCII 数字, 在 0 ≤ hour ≤ 23 范围内
  2. 一个 U+003A COLON 字符 (:)
  3. 表示 minute 的两个 ASCII 数字, 在 0 ≤ minute ≤ 59 范围内
  4. 如果 second 不是零(是零也合法):
    1. 一个 U+003A COLON 字符(:)
    2. 表示 second 的两个 ASCII 数字, 在 0 ≤ second ≤ 59 范围内
    3. 如果 second 不是整数(是整数也合法):
      1. 一个 U+002E FULL STOP 字符(.)
      2. 表示 second 的一到三个 ASCII 数字

second 部分不可以是 60 或 61;闰秒无法表示。

解析时间字符串 的规则如下。将会返回一个时间或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析时间部分 来获得 hourminutesecond。 如果它没有返回,则失败。

  4. 如果 position 没有 超出 input 的结尾,则失败。

  5. time 的时分秒分别为 hourminutesecond

  6. 返回 time

给定 input 字符串和位置 position解析时间部分 的规则如下。 将返回时、分、秒,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 hour

  2. 如果 hour 不是 0 ≤ hour ≤ 23 范围内的数字就失败。

  3. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+003A COLON 字符,则失败。 否则将 position 前进一个字符。

  4. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 minute

  5. 如果 minute 不是 0 ≤ minute ≤ 59 范围内的数字就失败。

  6. second 为 0。

  7. 如果 position 没有超出 input 的末尾并且 position 处的字符是 U+003A(:),则:

    1. position 前进一个字符。

    2. 如果 position 恰好位于或者超出了 input 的末尾, 或者 input 中从 position 开始的 两个 字符不都是 ASCII 数字,则失败。

    3. input 中给定的位置 position 收集 ASCII 数字 或 U+002E FULL STOP 字符 组成的代码点序列。 如果收集到的序列长度为 3, 或者长度大于 3 且第 3 个字符不是 U+002E FULL STOP 字符, 或者有多于一个的 U+002E FULL STOP 字符,则失败。 否则将结果序列解释为 10 进制数(可能有小数部分)。 将 second 设置为那个数字。

    4. 如果 second 不是 0 ≤ second < 60 范围内的数字就失败。

  8. 返回 hourminutesecond

2.3.5.5 本地日期和时间

本地日期和时间 由一个特定的 外推格里历日期(包含年、月、日) 和时间(包含时、分、秒,以及秒的小数),但没有时区。[GREGORIAN]

表示日期和时间的 合法的本地日期和时间字符串 由以下有序的部分组成:

  1. 表示日期的 合法的日期字符串
  2. 一个 U+0054 LATIN CAPITAL LETTER T 字符(T)或者 U+0020 SPACE 字符
  3. 表示时间的 合法的时间字符串

表示日期和时间的 合法的正则化的本地日期和时间字符串 由以下有序的几部分组成:

  1. 表示日期的 合法的日期字符串
  2. 一个 U+0054 LATIN CAPITAL LETTER T 字符 (T)
  3. 表示时间的 合法的时间字符串, 按给定时间的最短可能的字符串表示。(例如如果秒是 0 的话忽略秒的部分)

解析本地日期和时间字符串 的规则如下。 将会返回一个日期或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析日期部分 来获得 yearmonthday。 如果它没有返回,则失败。

  4. 如果 position 超出了 input 的末尾或者 position 处的字符是 U+0054 LATIN CAPITAL LETTER T 字符(T) 或 U+0020 SPACE 字符,则失败。否则将 position 前进一个字符。

  5. 解析时间部分 来获得 hourminutesecond。 如果它没有返回,则失败。

  6. 如果 position 没有 超出 input 的结尾,则失败。

  7. date 的年月日分别为 yearmonthday

  8. time 的时分秒分别为 hourminutesecond

  9. 返回 datetime

2.3.5.6 时区

时区 由一个小时和分钟的有符号数字组成。

表示时区的 合法的时区字符串 包含下列之一:

此格式允许从-23:59到+23:59的时区偏移。 现在,实际时区的偏移范围是-12:00到+14:00,分钟分量始终是 00,30 或 45。 但不能保证情况永远是这样的,因为时区被用作政治足球,受到异想天开的政策的支配。

另请参阅下面的 全球日期和时间 部分的使用说明和示例,具体了解如何在正式的时区形成之前的历史时间上使用时区偏移。

解析时区偏移字符串 的规则如下。 将会返回一个时区偏移或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析时区偏移部分 来获得 timezonehourstimezoneminutes。 如果它没有返回,则失败。

  4. 如果 position 没有 超出 input 的结尾,则失败。

  5. 返回距离 UTC timezonehours 小时 timezoneminutes 分钟的时区偏移。

给定 input 字符串和位置 position解析时区偏移部分 的规则如下。 将会返回一个时区偏移的小时和分钟,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. 如果 position 处的字符是一个 U+005A LATIN CAPITAL LETTER Z 字符(Z),则:

    1. timezonehours 为 0。

    2. timezoneminutes 为 0。

    3. position 前进到 input 的下一个字符。

    否则,如果 position 是 U+002B PLUS SIGN (+)或 U+002D HYPHEN-MINUS (-),则:

    1. 如果 position 处的字符是一个 U+002B PLUS SIGN (+),令 sign 为 "正"。 如果它是一个 U+002D HYPHEN-MINUS (-),则令 sign 为 "负"。

    2. position 前进到 input 的下一个字符。

    3. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。令 s 为收集到的序列。

    4. 如果 s 恰好是两个字符长度,则:

      1. s 解释为10进制整数,并赋值给 timezonehours

      2. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+003A COLON 则失败。 否则将 position 前进一个字符。

      3. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符则失败。 否则将结果序列解释为 10 进制整数。令那个数为 timezoneminutes

      如果 s 恰好是 4 个字符长度,则:

      1. s 的前两个字解释为 10 进制整数,并赋值给 timezonehours

      2. s 的后两个字解释为 10 进制整数,并赋值给 timezoneminutes

      其他情况失败。

    5. 如果 timezonehours 不在 0 ≤ timezonehours ≤ 23 范围内则失败。
    6. 如果 sign 为 "负",则对 timezonehours 求反。
    7. 如果 timezoneminutes 不在 0 ≤ timezoneminutes ≤ 59 范围内则失败。
    8. 如果 sign 为 "负",则对 timezoneminutes 求反。

    其他情况失败。

  2. 返回 timezonehourstimezoneminutes

2.3.5.7 全球日期和时间

全球日期和时间 由一个特定的 外推格里历日期(包含年、月、日) 和时间(包含时、分、秒,以及秒的小数),以及附加的时区信息,一个包括小时和分钟的有符号数。[GREGORIAN]

表示日期、时间和时区的的 合法的全球日期和时间字符串 由以下有序的部分组成:

  1. 表示日期的 合法的日期字符串
  2. 一个 U+0054 LATIN CAPITAL LETTER T 字符(T)或者 U+0020 SPACE 字符
  3. 表示时间的 合法的时间字符串
  4. 表示时区的 合法的时区偏移字符串

在 20 世纪中叶 UTC 形成之前的时间必须按照 UT1(0° 经度处的太阳时)而不是 UTC( UT1 的近似,按照 SI 制秒增长)表示和解析。时区形成前的时间必须按照 UT1 时间表示和解析, 且带有明确的时区信息,以此来近似适当的本地时间和伦敦格林尼治观测到的时间差。

下面是按照 合法的全球日期和时间字符串 编写的日期示例。

"0037-12-13 00:00Z"
使用伦敦时间的地区的午夜,罗马皇帝 Nero 的生日。关于实际对应的日期见下文的进一步讨论。
"1979-10-14T12:00:00.001-04:00"
美国东海岸夏令时的 1979 年 10 月 14 日正午之后的一毫秒。
"8592-01-01T02:09+02:09"
UTC 时间 8592 年 1 月 1 日午夜。其时区是快于 UTC 的 2 小时 9 分钟, 目前还没有这个时区,尽管如此,它是允许的。

关于这些日期,值得一提的是:

解析全球日期和时间字符串 的规则如下。 将会返回一个带有时区信息(为了能够往返转换或显示等用途)的 UTC 时间,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. 解析日期部分 来获得 yearmonthday。 如果它没有返回,则失败。

  4. 如果 position 超出了 input 的末尾或者 position 处的字符是 U+0054 LATIN CAPITAL LETTER T 字符(T) 或 U+0020 SPACE 字符,则失败。否则将 position 前进一个字符。

  5. 解析时间部分 来获得 hourminutesecond。 如果它没有返回,则失败。

  6. 如果 position 超出了 input 的结尾,则失败。

  7. 解析时区偏移部分 来获得 timezonehourstimezoneminutes。 如果它没有返回,则失败。

  8. 如果 position 没有 越过 input 的结尾,则失败。

  9. 令时刻 time 的年月日时分秒分别为 yearmonthdayhourminutesecond,减去 timezonehours 小时 timezoneminutes 分钟。 该时刻的时区为 UTC 时区。

  10. timezone 为距 UTC timezonehours 小时 timezoneminutes 分钟的时区偏移。

  11. 返回 timetimezone

2.3.5.8 星期

星期 由一个表示年的数字(星期年)和一个表示星期的数字(周号)组成,表示从周一开始的 7 天时间段。 在这个日历系统中,每个星期年有 52 或 53 个这样的 7 天,定义如下。这样的 7 天周期从格里历 1969 年 12 月 29 日(1969-12-29)开始, 这一周被定义为 1970 年的第 1 周。后续的星期都依次进行编号。一个星期年的第一周之前是上一个星期年的最后一周,反之亦反。 [GREGORIAN]

如果编号为 year 的星期年对应的 外推格里历year 第一天(1月1日)是周二,或者这一天是周三且 year 可被 400 整除或可被 4 整除但不可被 100 整除, 那么这一星期年有 53 周。其他所有星期年都有 52 周。

有 53 周的星期年的 最后一天的周号 是 53; 有 52 周的星期年的最后一天的周号是 52。

特定日期的星期年的编号可能与包含这一天的 外推格里历 年不同。 星期年 y 的第一周为包含第一个周二的格里历年 y

为了现代目的,这里定义的 星期 等价于定义在 ISO 8601 中的 ISO 星期。 [ISO8601]

表示星期年 year 和周号 week合法的星期字符串 有下列几个有序的组成部分:

  1. 表示 year 的 4 个或更多 ASCII 数字,其中 year > 0
  2. 一个 U+002D HYPHEN-MINUS 字符 (-)
  3. 一个 U+0057 LATIN CAPITAL LETTER W 字符 (W)
  4. 表示周号 week 的两个 ASCII 数字,其中 1 ≤ week ≤ maxweekmaxweek 为星期年 year 最后一天的周号

解析星期字符串 的规则如下。将会返回星期年和周号两个数字,或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列长度小于 4 个字符长度则失败。 否则将结果序列解释为 10 进制整数。令那个数为 year

  4. 如果 year 小于等于零则失败。

  5. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+002D HYPHEN-MINUS 字符则失败。 否则将 position 前进一个字符。

  6. 如果 position 超出了 input 的末尾或者 position 处的字符不是 U+0057 LATIN CAPITAL LETTER W 字符(W)则失败。 否则将 position 前进一个字符。

  7. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。 如果收集到的序列不是恰好 2 个字符长度则失败。 否则将结果序列解释为 10 进制整数。令那个数为 week

  8. maxweekyear最后一天的周号

  9. 如果 week 不是在 1 ≤ week ≤ maxweek 范围内的数字就失败。

  10. 如果 position 没有 超出 input 末尾,则失败。

  11. 返回星期年 year 和周号 week

2.3.5.9 时间间隔

时间间隔 由 秒数构成。

由于月和秒是不可比较的(一月没有精确的秒数, 它的长度取决于究竟从哪天算起),本标准中定义的 时间间隔 不允许包含 月(或者年,它等于12个月)。 时间间隔只能描述秒数。

表示 时间间隔 t合法的时间间隔字符串 的组成方式可以是下列任何一种:

解析时间间隔字符串 的规则如下。将会返回一个 时间间隔 或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. monthsseconds,和 component count 均为零。

  4. M-disambiguatorminutes

    该标志的另一个值是 months。它用来消除 ISO8601 时间间隔中 "M" 单位的歧义, 在 ISO8601 中月和分钟都使用这个单位。虽然月是不允许的,但为了向前兼容, 以及避免误解 ISO8601 时间间隔(在其他上下文中仍然是合法的), 仍然对月进行了解析。

  5. position 开始 跳过 input 中的 ASCII 空格。

  6. 如果 position 越过了 input 的结尾,则失败。

  7. 如果 position 处的字符是一个 U+0050 LATIN CAPITAL LETTER P 字符, 则将 position 前进一个字符。将 M-disambiguator 设置为 months, 并从 position 开始 跳过 input 中的 ASCII 空格。

  8. while true:

    1. units 为 undefined。它的值可能是: yearsmonthsweeksdayshoursminutes,或 seconds

    2. next character 为 undefined。用来从 input 中处理字符。

    3. 如果 position 越过了 input 的结尾,则 break。

    4. 如果 position 处的字符是一个 U+0050 LATIN CAPITAL LETTER T 字符, 则将 position 前进一个字符。将 M-disambiguator 设置为 minutes, 并从 position 开始 跳过 input 中的 ASCII 空格。

    5. next character 设置为 inputposition 处的字符。

    6. 如果 next character 为一个 U+002E FULL STOP 字符 (.),则令 N 等于 0。 (不要前进 position。下面会处理它。)

      否则,如果 next character 是一个 ASCII 数字,则从 input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。将结果序列解释为 10 进制整数。令 N 为那个数字。

      否则如果 next character 不是数字,则失败。

    7. 如果 position 越过了 input 的结尾,则 break。

    8. next character 设置为 inputposition 处的字符, 这次将 position 前进到下一字符。 (如果 next character 刚才是一个 U+002E FULL STOP 字符(.),它将仍然是那个字符。)

    9. 如果 next character 是 U+002E (.),则:

      1. input 中给定的位置 position 收集 ASCII 数字 组成的代码点序列。令 day 为结果序列。

      2. 如果 s 是空字符串则失败。

      3. lengths 中的字符数。

      4. fraction 为将 s 解释为10进制数的结果, 把这个数除以 10length

      5. N 增加 fraction

      6. position 开始 跳过 input 中的 ASCII 空格。

      7. 如果 position 越过了 input 的结尾,则失败。

      8. next character 设为 inputposition 指向的字符, 并将 position 前进到下一字符。

      9. 如果 next character 既不是 U+0053 LATIN CAPITAL LETTER S 字符也不是 U+0073 LATIN SMALL LETTER S 字符,则失败。

      10. units 设为 seconds

      否则:

      1. 如果 next characterASCII 空格, 那么从 position 开始 跳过 input 中的 ASCII 空格。 将 next character 设为 inputposition 指向的字符, 并将 position 前进到下一字符。

      2. 如果 next character 是一个 U+0059 LATIN CAPITAL LETTER Y 字符或 U+0079 LATIN SMALL LETTER Y 字符,将 units 设置为 years 并将 M-disambiguator 设置为 months

        如果 next character 是一个 U+004D LATIN CAPITAL LETTER M 字符或 U+006D LATIN SMALL LETTER M 字符,且 M-disambiguatormonths,则将 units 设置为 months

        如果 next character 是一个 U+0057 LATIN CAPITAL LETTER W 或 U+0077 LATIN SMALL LETTER W 字符,将 units 设置为 weeks 并将 M-disambiguator 设置为 minutes

        如果 next character 是一个 U+0044 LATIN CAPITAL LETTER D 或 U+0064 LATIN SMALL LETTER D 字符,将 units 设置为 days 并将 M-disambiguator 设置为 minutes

        如果 next character 是一个 U+0048 LATIN CAPITAL LETTER H 或 U+0068 LATIN SMALL LETTER H 字符,将 units 设置为 hours 并将 M-disambiguator 设置为 minutes

        如果 next character 是一个 U+004D LATIN CAPITAL LETTER M 字符或 U+006D LATIN SMALL LETTER M 字符,且 M-disambiguatorminutes,则将 units 设置为 minutes

        如果 next character 是一个 U+0053 LATIN CAPITAL LETTER S 或 U+0073 LATIN SMALL LETTER S 字符,将 units 设置为 seconds 并将 M-disambiguator 设置为 minutes

        否则如果 next character 不是上述任何字符,则失败。

    10. 递增 component count

    11. multiplier 为 1。

    12. 如果 unitsyears,将 multiplier 乘以 12 并设置 unitsmonths

    13. 如果 unitsmonths,把 Nmultiplier 的乘积加到 months 上。

      否则:

      1. 如果 unitsweeks,将 multiplier 乘以 7 并设置 unitsdays

      2. 如果 unitsdays,将 multiplier 乘以 24 并设置 unitshours

      3. 如果 unitshours,将 multiplier 乘以 60 并设置 unitsminutes

      4. 如果 unitsminutes,将 multiplier 乘以 60 并设置 unitsseconds

      5. 否则 units 只能是 seconds 了。 将 Nmultiplier 的乘积加到 seconds 上。

    14. position 开始 跳过 input 中的 ASCII 空格。

  9. 如果 component count 为零,则失败。

  10. 如果 months 不为零,则失败。

  11. 返回包含 seconds 秒的 时间间隔

2.3.5.10 模糊的时间

合法的可选时间的日期字符串 是下列中的一种:


解析日期或时间字符串 的规则如下。 该算法将会返回一个 datetime,或 全球日期和时间 或者什么都不返回。 如果算法的任何一个点说它 "失败了",这意味着它在那一点退出并什么都不返回。

  1. input 为待解析字符串。

  2. positioninput 内的指针初始指向字符串开始。

  3. start position 设置为 position

  4. date presenttime present 标志设置为 true。

  5. 解析日期部分 来获得 yearmonthday。 如果它没有返回,设置 date present 为 false。

  6. 如果 date present 为 true,且 position 没有越过 input 的末尾, 且 position 处的字符是 U+0054 LATIN CAPITAL LETTER T 字符 (T)或 U+0020 SPACE 字符, 将 position 前进到 input 的下一个字符。

    否则,如果 date present 为 true,并且 position 越过了 input 的末尾或 position 处的字符既不是 U+0054 LATIN CAPITAL LETTER T 字符 (T)也不是 U+0020 SPACE 字符, 则设置 time present 为 false。

    否则,如果 date present 为 false,将 position 设置回 start position

  7. 如果 time present 为 true,则 解析时间部分 来获得 hourminutesecond。 如果它没有返回,则失败。

  8. 如果 date presenttime present 标志都是 true, 但 position 越过了 input 的末尾,则失败。

  9. 如果 date presenttime present 标志都是 true, 解析时区偏移部分 来获得 timezonehourstimezoneminutes。如果它没有返回则失败。

  10. 如果 position 没有 越过 input 的结尾,则失败。

  11. 如果 date present 标志为 true 且 time present 标志为 false, 则令 date 为年与日分别为 yearmonthday 的日期并返回 date

    否则,如果 time present 标志为 true 且 date present 标志为 false, 则令 time 为时分秒分别为 hourminutesecond 的时间并返回 time

    否则,令 timeyearmonthdayhour 时mminutesecond 秒, 减去 timezonehours 小时 timezoneminutes分钟,这一时刻是 UTC 时区的时间; 令 timezone 距离 UTC timezonehours 小时 timezoneminutes 分钟; 返回 timetimezone

2.3.6 颜色

简单颜色 由三个在 0..255 范围的 8 位数字组成。 分别表示 sRGB 色彩空间的颜色的红、绿、蓝分量。 [SRGB]

合法的简单颜色 字符串应恰好包含 7 个字符长度, 第一个字符是 U+0023 NUMBER SIGN 字符(#),剩下的 6 个都是 ASCII 十六进制数, 其中前两个表示红色分量,中间两个表示绿色分量,最后两个表示蓝色分量,均为 16 进制。

合法的小写简单颜色 字符串是 不使用任何 U+0041 LATIN CAPITAL LETTER A 到 U+0046 LATIN CAPITAL LETTER F 字符的 合法的简单颜色

解析简单色值的规则 由下列算法给出。 被调用时必须依次执行这些步骤,在第一个有返回值的步骤中止。该算法将会返回一个 简单颜色 或者错误。

  1. input 为待解析字符串。

  2. 如果 input 不是恰好 7 个字符则返回一个错误。

  3. 如果 input 的首字符不是 U+0023 NUMBER SIGN 字符(#),则返回一个错误。

  4. 如果 input 的后面 6 个字符不都是 ASCII 十六进制数字,则返回一个错误。

  5. result 为一个 简单颜色

  6. 将第2、3个字符解释为 16 进制数,令该结果为 result 的红色分量。

  7. 将第4、5个字符解释为 16 进制数,令该结果为 result 的绿色分量。

  8. 将第6、7个字符解释为 16 进制数,令该结果为 result 的蓝色分量。

  9. 返回 result

给定 简单颜色 序列化简单色值的规则 在下列算法中给出:

  1. result 为包含一个 U+0023 NUMBER SIGN 字符(#)的字符串。

  2. 将红、绿、蓝分量依次转换为两位 16 进制数字,并使用 ASCII 小写十六进制数字, 需要的话填充零。将这些数字按照红绿蓝的顺序追加到 result

  3. 返回 result,它将是一个 合法的小写简单颜色


有些废弃的遗留属性以更复杂的方式解析颜色,它们使用 解析遗留色值的规则,由以下算法给出。 被调用时必须依次执行这些步骤,在第一个有返回值的步骤中止。该算法将会返回一个 简单颜色 或者错误。

  1. input 为待解析字符串。

  2. 如果 input 位空字符串则返回一个错误。

  3. input移除前后的 ASCII 空白

  4. 如果 input ASCII 大小写不敏感地 匹配 字符串 "transparent",则返回一个错误。

  5. 如果 input ASCII 大小写不敏感地 匹配 命名颜色,则返回该关键字对应的 简单颜色[CSSCOLOR]

    没有识别 CSS2 System Colors

  6. 如果 input 是 4 个字符长度,且 input 的第一个字符是 U+0023(#), 且 input 后面的 3 个字符都是 ASCII 十六进制数字,则:

    1. result 为一个 简单颜色

    2. input 第二个字符解释为十六进制数字;令 result 的红色分量为得到的数字乘以 17。

    3. input 第三个字符解释为十六进制数字;令 result 的绿色分量为得到的数字乘以 17。

    4. input 第四个字符解释为十六进制数字;令 result 的蓝色分量为得到的数字乘以 17。

    5. 返回 result

  7. input 中任何代码点大于 U+FFFF 的字符(即任何不在基本多文种平面的字符)替换为两个字符的字符串 "00"。

  8. 如果 input 字符长度大于 128,把 input 截断到只有 128 个字符。

  9. 如果 input 中第一个字符是 U+0023 NUMBER SIGN 字符(#),移除它。

  10. input 中任何非 ASCII 十六进制数字 的字符替换为 U+0030 DIGIT ZERO(0)。

  11. While input 长度为零或者不是 3 的倍数,添加一个 U+0030 DIGIT ZERO (0)字符到 input

  12. input 分割成三个等长字符来获得三个分量。 令length 为这三个分量的长度(input 长度的三分之一)。

  13. 如果 length 大于 8,移除每个分量中前面的 length-8 个字符,并且令 length 为 8。

  14. While length 大于 2 并且每个分量的第一个字符是 U+0030 DIGIT ZERO (0)字符,移除该字符并将 length 减一。

  15. 如果 length 仍然 大于 2,截断每个分量,分别只保留前两个字符。

  16. result 为一个 简单颜色

  17. 将第一个分量解释为十六进制数字;令 result 的红色分量为得到的数字。

  18. 将第二个分量解释为十六进制数字;令 result 的绿色分量为得到的数字。

  19. 将第三个分量解释为十六进制数字;令 result 的蓝色分量为得到的数字。

  20. 返回 result


2D 图形上下文 有单独的颜色语法,还处理了不透明度。

2.3.7 空格分隔的令牌

空格分隔的令牌集合 是包含零个或更多词(称为令牌)的字符串,它们以一个或更多 ASCII 空白 分隔, 其中的词是由一个或更多的除 ASCII 空白 之外的字符组成的任何字符串。

包含 空格分隔的令牌集合 的字符串前后都可能有 ASCII 空白

空格分隔的无序不重复令牌集合 是一个没有令牌重复的 空格分隔的令牌集合

空格分隔的有序不重复令牌集合 是一个没有令牌重复但令牌顺序有意义的 空格分隔的令牌集合

空格分隔的令牌集合 有时定义有允许值的集合。 当定义了允许值的集合时,集合中的令牌必须都从那个允许的列表中来;其他值是不合规范的。 如果没有提供允许值的集合,那么所有值都是符合规范的。

set of space-separated tokens 中的令牌如何进行比较 (例如是否大小写敏感) 由各自集合定义。

2.3.8 逗号分隔的令牌

逗号分隔的令牌集合 is a string containing zero or more tokens each separated from the next by a single U+002C COMMA character (,), where tokens consist of any string of zero or more characters, neither beginning nor ending with ASCII whitespace, nor containing any U+002C COMMA characters (,), and optionally surrounded by ASCII whitespace.

是包含零个或更多令牌的字符串,它们以一个 U+002C COMMA 字符(,)分隔, 其中的令牌是由一个或更多的字符组成的任意字符串, 首尾不包括 ASCII 空白 也不能包含 U+002C COMMA 字符(,),但前后可以有 ASCII 空白

例如字符串 " a ,b,,d d " 由四个令牌组成:"a", "b", 空字符串和 "d d"。每个令牌的前后空白不计入令牌,空字符串可以是一个令牌。

有时 逗号分隔的令牌集合 对合法令牌的构成还有额外限制。 如果定义了那些限制,令牌就必须完全遵守;其他值都是不符合规范的。 如果没定义其他限制,所有值都是符合规范的。

2.3.9 引用

type 类型的元素的 合法的哈希名引用 字符串由一个 U+0023 NUMBER SIGN 字符(#)和完全匹配 同一个 中的 type 元素的 name 属性的字符串构成。

给定上下文节点 scope解析对 type 类型的元素的哈希名引用的规则 如下:

  1. 如果被解析字符串不包含 U+0023 NUMBER SIGN 字符,或者第一个这样的字符是字符串的最后一个字符, 则返回 null 并中止这些步骤。

  2. s 为从紧接着第一个 U+0023 NUMBER SIGN 字符之后的字符开始,直到待解析字符串结尾的字符串。

  3. 返回 scope 中,按照 树序 的第一个 idname 属性的值是 s 的类型为 type 的元素。如果没有这样的元素就返回 null。

    虽然解析时用到了 id 属性, 但它不用于决定一个值是否是 合法的 哈希名引用。 也就是说,一个基于 id 引用元素的哈希名引用是符合性错误。 (除非那个元素也有一个具有相同值的 name 属性)。

2.3.10 媒体查询

合法的媒体查询列表 是一个匹配 Media Queries 标准中的 <media-query-list> 生成式的字符串。[MQ]

匹配用户环境 的字符串可以是空字符串、只包含 ASCII 空白 的字符串, 或者根据 Media Queries 标准给出的定义匹配用户环境的媒体查询列表。[MQ]

2.4 URL

2.4.1 术语

一个字符串如果是合法 URL 字符串,同时是非空字符串, 那么它就是 合法的非空 URL

如果 去掉前后 ASCII 空白 后是一个 合法 URL 字符串, 那么它就是一个 可能由空格包裹的合法 URL

如果 去掉前后 ASCII 空白 后是一个 合法的非空 URL, 那么它就是一个 可能由空格包裹的合法的非空 URL

本标准将 about:legacy-compat 定义为保留 URL。 因为 about: URL 不可解析,当需要兼容 XML 工具时, 用在 HTML 文档DOCTYPE 中。[ABOUT]

本标准将 about:html-kind 定义为保留 URL。 因为 about: URL 不可解析,可用于媒体轨道的类型标识。[ABOUT]

本标准将 about:srcdoc 定义为保留 URL。 因为 about: URL 不可解析, 被用于 iframe srcdoc 文档URL [ABOUT]

Document 对象 document后备基 URL 是通过执行这些步骤获得的 URL 记录

  1. 如果 document iframe srcdoc 文档, 则返回 document浏览环境浏览环境容器节点文档文档基 URL

  2. 如果 documentURLabout:blank, 且 document浏览环境 有一个 创建者浏览环境,那么返回该 创建者的基 URL

  3. 返回 documentURL

Document 对象的 文档基 URL 是通过执行这些步骤获得的 绝对 URL

  1. 如果 Document 中不存在拥有 href 属性的 base 元素,那么 文档基 URLDocument后备基 URL;中止这些步骤。

  2. 否则,文档基 URLDocument 中按照 树序 的 第一个有 href 属性的 base 元素的 冻结的基 URL

2.4.2 解析 URL

解析 URL 是从字符串中获取它表示的 URL 记录 的过程。 虽然这一过程定义在 WHATWG URL 标准中,但方便起见 HTML 标准也定义了一个包装过的版本。 [URL]

这一包装只用于出于历史原因当 URL 解析器的字符编码必须匹配文档或环境设置对象时。 除此之外可以直接使用 URL 解析器

相对于一个 documentenvironment settings object 解析 URL url, 用户代理必须使用下列步骤。 解析 URL 的结果可能是失败,也可能是 结果 URL 字符串结果 URL 记录

  1. 如果指定了 document, 令 encodingdocument字符编码, 否则令它为 environment settings objectAPI URL 字符编码

  2. 如果指定了 document, 令 baseURLdocument基 URL, 否则令它为 environment settings objectAPI 基 URL

  3. urlRecord 为 使用 baseURLencoding,在 url 上应用 URL 解析器 的结果。

  4. 如果 urlRecord 解析失败,中止这些步骤并产生一个错误。

  5. urlString 为在 urlRecord 上应用 URL 序列化 的结果。

  6. urlString 作为 结果 URL 字符串urlRecord 作为 结果 URL 记录 返回。

2.4.3 基 URL 的动态变化

当一个文档的 文档基 URL 变化时,该文档中所有元素多 受基 URL 变化的影响

当一个元素 受基 URL 变化影响 时执行下面的 基 URL 变化步骤(定义在 DOM 标准中):

如果该元素创建了 超链接

如果该超链接标识的 URL 正在展现给用户, 或任何从该 URL 来的数据正在影响显示,那么应该相对于该元素的 节点文档 重新解析 href 属性并适当地更新 UI。

例如 CSS :link/:visited 伪类 可能不受影响。

如果该超链接有 ping 属性 且它的 URL 正在展现给用户,那么应该相对于该元素的 节点文档 重新解析 ping 属性的令牌并适当地更新 UI。

如果该属性是有 cite 属性的 qblockquoteins,或 del 元素

如果 cite 属性标识的 URL 正在展现给用户, 或任何从该 URL 来的数据正在影响显示,那么应该相对于该元素的 节点文档 重新解析 href 属性并适当地更新 UI。

否则

该元素不直接受影响。

例如更改基 URL 不影响 img 元素显示的图片, 尽管脚本中后续对 src IDL 属性的访问将返回新的 绝对 URL,可能不再对应于正在显示的图片。

2.5 获取资源

Spec bugs: 11235

2.5.1 术语

类型 为 "basic", "cors",或 "default" 的 响应 称为 CORS-same-origin[FETCH]

类型 为 "opaque" 或 "opaqueredirect" 的 响应 称为 CORS-cross-origin

响应不安全响应 是它的 内部响应(如果有的话),否则就是 响应 自己。

给定 urldestinationcorsAttributeState,以及可能有的 same-origin fallback 标志创建一个可能 CORS 的请求 应该执行以下步骤:

  1. 如果 corsAttributeStateNo CORS, 令 mode 为 "no-cors" ,否则令 mode 为 "cors"。

  2. 如果设置了 same-origin fallback 标志mode 为 "no-cors",则将 mode 设置为 "same-origin"。

  3. credentialsMode 为 "include"。

  4. 如果 corsAttributeStateAnonymous, 将 credentialsMode 设为 "same-origin"。

  5. request 为一个新的 request, 其 urlurl目标地址destination模式modecredentials 模式credentialsMode, 且设置了 use-URL-credentials 标志

2.5.2 确定响应类型

必须获取响应的 Content-Type 元数据 并按照 WHATWG MIME Sniffing 标准的要求解释。[MIMESNIFF]

必须按照 WHATWG MIME Sniffing 标准的要求找到资源的 计算后的 MIME 类型[MIMESNIFF]

嗅探图片 Content-Type 的规则 区分资源是文本还是二进制的规则,以及 嗅探音频和视频的规则 也定义在 WHATWG MIME Sniffing 标准中。 这些规则返回的结果是一个 MIME 类型[MIMESNIFF]

WHATWG MIME Sniffing 标准中的规则必须严格遵守。 当用户代理使用与服务器所期望的内容类型检测不同的启发式方法时,可能会发生安全问题。 有关更多详细信息,请参阅 WHATWG MIME Sniffing 标准。 [MIMESNIFF]

2.5.3meta 元素提取字符编码

给定字符串 s 从一个 meta 元素提起字符编码的算法 如下。 它或者返回一个字符编码,或者什么都不返回。

  1. positions 中的指针初始指向字符串开始。

  2. Loop:在 s 中找到 position 后面 ASCII 大小写不敏感地 匹配 "charset" 的前 7 个字符。 如果没有找到这样的匹配,什么都不返回并中止这些步骤。

  3. 跳过所有紧接着 "charset" 后面的 ASCII 空白(也可能没有)。

  4. 如果下一个字符不是 U+003D EQUALS SIGN (=),让 position 指向下一个字符之前, 跳回到标记为 loop 的步骤。

  5. 跳过所有紧接着等号后面的 ASCII 空白(也可能没有)。

  6. 处理下一个字符:

    如果它是一个 U+0022 QUOTATION MARK 字符(")且 s 中后面还有一个 U+0022 QUOTATION MARK 字符 (")
    如果它是一个 U+0027 APOSTROPHE 字符 (')且 s 中后面还有一个 U+0027 APOSTROPHE 字符 (')
    返回从当前字符到当前字符的下一次出现的子字符串 获取编码 的结果。
    如果它是一个没有闭合的 U+0022 QUOTATION MARK 字符 (")
    如果它是一个没有闭合的 U+0027 APOSTROPHE 字符 (')
    如果没有下一个字符
    什么都不返回。
    否则
    返回从当前字符到(不包含)第一个 ASCII 空白 或 U+003B SEMICOLON 字符(;) 或 s 的末尾(取决于哪一个先出现) 构成的子字符串中 获取编码 的结果。

该算法与 HTTP 规范中的算法不同 (例如,HTTP 不允许使用单引号,并且需要支持该算法不支持的反斜线转义机制)。 虽然在历史上本算法用于 HTTP 相关的上下文,但不同的实现支持的语法前段时间就不一样了。[HTTP]

2.5.4 CORS 设置属性

CORS 设置属性 是一个 枚举属性。下表列出了关键字以及属性状态 — 左侧一列的关键字对应第二列同一行中的状态。

关键字 状态 简要介绍
anonymous 匿名 该元素的 请求 会把 模式 设置为 "cors" 把 credentials 模式 设置为 "same-origin"。
use-credentials 使用 Credentials 该元素的 请求 会把 模式 设置为 "cors" 把 credentials 模式 设置为 "include"。

空字符串也是合法的关键字,对应 匿名 状态。 该属性的 非法值的默认匿名 状态。 为了 反映 的目的, 匿名 状态的正规的 关键字是 anonymous缺失值的默认(当属性被省略时使用)是 No CORS 状态。

The majority of fetches governed by CORS settings attributes will be done via the create a potential-CORS request algorithm.

For module scripts, certain CORS settings attributes have been repurposed to have a slightly different meaning, wherein they only impact the request's credentials mode (since the mode is always "cors"). To perform this translation, we define the module script credentials mode for a given CORS settings attribute to be determined by switching on the attribute's state:

No CORS
"omit"
Anonymous
"same-origin"
Use Credentials
"include"

2.5.5 引荐来源策略属性

引荐来源策略属性 是一个 枚举属性。 每个 引荐来源策略包括空字符串都是该属性的关键字, 都映射到一个同名的状态。

该属性的 非法值的默认缺失值的默认 都是空字符串状态。

这些状态对各种 获取 处理模型的影响详细地定义在 本标准中,WHATWG Fetch 标准中,以及 Referrer Policy 中。 [FETCH] [REFERRERPOLICY]

对给定的 获取 使用哪个处理模型取决于多个信号; 引荐来源策略属性只是其中之一。一般来说,这些信号的处理顺序是:

  1. 首先,是否出现一个 noreferrer 超链接类型;

  2. 然后,引荐来源策略属性 的值;

  3. 然后,是否出现任何 name 属性设为 referrermeta 元素。

  4. 最后,`Referrer-Policy` HTTP 头。

2.5.6 Nonce attributes

A nonce content attribute represents a cryptographic nonce ("number used once") which can be used by Content Security Policy to determine whether or not a given fetch will be allowed to proceed. The value is text. [CSP]

Elements that have a nonce content attribute ensure that the crytographic nonce is only exposed to script (and not to side-channels like CSS attribute selectors) by extracting the value from the content attribute, moving it into an internal slot named [[CryptographicNonce]], and exposing it to script via the HTMLOrSVGElement interface mixin. Unless otherwise specified, the slot's value is the empty string.

element . nonce

Returns the value of the element's [[CryptographicNonce]] internal slot.

Can be set, to update that slot's value.

The nonce IDL attribute must, on getting, return the value of this element's [[CryptographicNonce]]; and on setting, set this element's [[CryptographicNonce]] to the given value.

Whenever an element including HTMLOrSVGElement has its nonce attribute is set or changed, set this element's [[CryptographicNonce]] to the given value.

Whenever an element including HTMLOrSVGElement becomes browsing-context connected, the user agent must execute the following steps on the element:

  1. Let CSP list be element's shadow-including root's CSP list.

  2. If CSP list contains a header-delivered Content Security Policy, and element has a nonce content attribute attr whose value is not the empty string, then:

    1. Set an attribute value for element using "nonce" and the empty string.

As each Document's CSP list is append-only, user agents can optimize away the contains a header-delivered Content Security Policy check by, for example, holding a flag on the Document, set during Document initialization.

The cloning steps for elements that include HTMLOrSVGElement must set the [[CryptographicNonce]] slot on the copy to the value of the slot on the element being cloned.

2.6 通用 DOM 接口

2.6.1 在 IDL 属性中反映内容属性

定义有些 IDL 属性是为了 反映 特定的内容属性。 这意味着在获取 IDL 属性时返回的是内容属性的当前值, 在设置 IDL 属性时将内容属性更改为给定的值。

通常,当获取 IDL 属性时如果内容属性不存在,IDL 属性必须表现为该内容属性的值为空字符串; 当设置时,如果内容属性的值不存在,则必须首先添加它。

如果反映内容属性的 IDL 属性是USVString属性, 且它的内容属性定义为包含一个 URL。那么在获取时如果内容属性不存在,那么 IDL 属性必须返回空字符串。 否则,IDL 属性必须相对于元素的节点文档 解析内容属性的值,如果解析成功则返回 结果 URL 字符串。 如果解析失败,则必须将内容属性的值转换USVString 并返回。 在设置时,必须设置内容属性的值为新值。

如果反映内容属性的 IDL 属性是 DOMString属性, 且它的内容属性是 枚举属性, 且该 IDL 属性 只限于已知的一些值, 那么当获取时,如果该 IDL 属性所处状态有相关联的一致的值,IDL 属性必须返回它。 如果属性处在一个没有相关联的关键字值的状态,或者属性所处状态未定义 (比如属性缺失且没有默认缺失值)时, IDL 属性必须返回空字符串。 当设置时,必须设置内容属性的值为指定的新值。

如果反映内容属性的 IDL 属性是可为空的 DOMString 属性, 且它的内容属性是一个 枚举属性, 那么当获取时, 如果对应的内容属性处于它的 默认缺失值, 那么该 IDL 属性必须返回 null,否则必须返回与该属性所处状态相关联的一致的值。 当设置时,如果新值为 null 则必须移除该内容属性,否则必须设置内容属性为给定的新值。

如果反映内容属性的 IDL 属性是 DOMStringUSVString 属性但不归于上述类别中, 那么获取和设置必须透明地,保持大小写地进行。

如果反映内容属性的 IDL 属性是 布尔 属性, 当获取该 IDL 属性时,如果设置了该内容属性则必须返回 true, 如果不存在则返回 false。当设置时,如果该 IDL 属性被设为 false 则必须移除该内容属性。 如果该 IDL 属性被设为 true 则必须将内容属性设为空字符串。 (这与布尔内容属性的规则对应。)

如果反映内容属性的 IDL 属性是有符号整数类型 (long), 那么当获取时,必须根据解析有符号整数的规则 解析内容属性,如果解析成功且值在该 IDL 属性的类型的取值范围内,则必须返回结果值。 如果解析失败或返回了范围外的值,或者该属性不存在,则必须返回默认值,如果没有默认值则返回0。 当设置时,必须将给定的值转换为可以将该数字表示为合法整数 的可能的最短字符串,然后该字符串必须被用作新的内容属性值。

如果反映内容属性的 IDL 属性是有符号整数类型 (long) 且 仅限为非负数字,那么当获取时, 该内容属性必须根据解析非负整数的规则 解析,如果解析成功且值在该 IDL 属性类型的取值范围内,必须返回结果值。 如果解析失败或返回了范围外的值,或者该属性不存在,则必须返回默认值, 如果没有默认值则返回 −1。 当设置时,如果值为负用户代理必须抛出 "IndexSizeError" DOMException。 否则必须将给定的值转换为可以将该数字表示为 合法非负整数 的可能的最短字符串, 然后该字符串必须被用作新的内容属性值。

如果反映内容属性的 IDL 属性是 无符号 整数类型 (unsigned long) ,那么当获取时,必须根据 解析非负整数的规则 解析内容属性,如果解析成功且值在 0 到 2147483647 范围内(含), 必须返回结果值。 如果解析失败或返回了范围外的值,或者该属性不存在,必须返回默认值, 如果没有默认值则返回 0。当设置时,如果新值处于 0 到 2147483647 范围内, 则令 n 为这个新值,否则令n 为默认值(如果没有默认值则为0); 然后必须将 n 转换为可将该数字表示为 合法非负整数 的可能的最短字符串,然后该字符串必须被用作新的内容属性值。

如果反映内容属性的 IDL 属性是无符号整数类型(unsigned long) 且 仅限于大于零的非负整数 ,那么行为与上一种情形类似,但零是不允许的。 当获取时,首先必须根据 解析非负整数的规则 解析内容属性, 如果解析成功且值在 1 到 2147483647 范围内(含),则必须返回结果值。 如果解析失败或返回了范围外的值,或者该属性不存在, 则必须返回默认值(没有默认值则为1)。 当设置时,如果值为0,用户代理必须抛出 "IndexSizeError" DOMException。否则, 如果新值在 1 到 2147483647 范围内,那么令 n 为这个新值。 否则令 n 为默认值( 如果没有默认值则为 1); 然后必须将n 转换为可将该数字表示为 合法非负整数 的可能的最短字符串,然后该字符串必须被用作新的内容属性值。

如果反映内容属性的 IDL 属性是无符号整数类型(unsigned long) 且 仅限于有fallback 的大于0的非负整数,则行为与前一种情形类似,但不允许的值将被转换为默认值。 当获取时, 首先必须根据解析非负整数的规则 解析内容属性,如果解析成功且值在 1 到 2147483647 范围内(含),则必须返回结果值。 如果解析失败或返回了范围外的值,或者该属性不存在,则必须返回默认值。 当设置时,如果新值在 1 到 2147483647 范围内,则令 n 为这个新值, 否则令 n 为默认值;然后必须将 n 转换为可将该数字表示为 合法非负整数 的可能的最短字符串,然后该字符串必须被用作新的内容属性值。

如果反映内容属性的 IDL 属性是固定范围 到 [min, max] 的无符号整数类型(unsigned long), 当获取时,必须先根据 解析非负整数的规则 解析内容属性,如果解析成功且值在 minmax 之间(包含), 必须返回该结果值。如果失败,必须返回默认值。如果解析成功但值小于 min,必须返回 min。 如果解析成功但值大于 max,必须返回 max。当设置时,其行为与设置普通无符号整数一样。

如果反映内容属性的 IDL 属性是浮点数类型(doubleunrestricted double),那么当获取时, 必须根据 解析浮点数值的规则 解析内容属性,如果解析成功则必须返回结果值。 如果解析失败或该属性不存在,则必须返回默认值(如果没有默认值则为0)。 当设置时, 必须将给定的值转换为 浮点数的最佳表示,然后该字符串必须被用作新的内容属性值。

如果反映内容属性的 IDL 属性是浮点数类型(doubleunrestricted double)且 仅限于大于零的数字,那么行为与上一种情形类似但不允许零和负值。当获取时,必须根据 解析浮点数值的规则解析内容属性,如果解析成功且值大于 0.0,则必须返回结果值。 否则如果解析失败或返回了范围外的值,或者该属性不存在,则必须返回默认值(如果没有默认值则为0)。 当设置时,如果新值小于等于0,那么必须忽略该值。 否则,必须将给定的值转换为 浮点数的最佳表示,然后该字符串必须被用作新的内容属性值。

当设置 Infinity 和 Not-a-Number (NaN)这些值时会抛出异常。 定义在 Web IDL 标准中。 [WEBIDL]

如果反映内容属性的 IDL 属性的类型为 DOMTokenList,那么当获取时, 必须返回 DOMTokenList 对象,与它关联的元素为被查询的元素, 与它关联的属性的本地名称为被查询的属性名。

如果反映内容属性的 IDL 属性为 HTMLElement 类型, 或者依赖于 HTMLElement 的接口,那么当获取时, 它必须运行下列算法(在第一个返回值的地方停机):

  1. 如果对应的内容属性不存在,那么 IDL 属性必须返回 null。
  2. candidate 为:以对应的内容属性的当前值为参数, 在内容属性的元素的 节点文档 上调用 document.getElementById() 方法将会找到的元素。
  3. 如果 candidate 是 null,或者它与 IDL 属性类型不兼容, 那么该 IDL 属性必须返回 null。
  4. 否则,它必须返回 candidate

当设置时,如果给定的元素有 id 属性, 且与被设置属性的元素有同样的 , 且给定的元素是该 ID 为该 id 属性值的第一个元素,则必须将内容属性设置为 该 id 属性的值。否则,必须设置该内容属性为空字符串。

2.6.2 集合

HTMLFormControlsCollectionHTMLOptionsCollection 接口是 从 HTMLCollection 接口派生出来的 集合HTMLAllCollection 接口是 集合, 但它不派生自 HTMLCollection

2.6.2.1 The HTMLAllCollection interface

The HTMLAllCollection interface is used for the legacy document.all attribute. It operates similarly to HTMLCollection; the main differences are that it allows a staggering variety of different (ab)uses of its methods to all end up returning something, and that it can be called as a function as an alternative to property access.

All HTMLAllCollection objects are rooted at a Document and have a filter that matches all elements, so the elements represented by the collection of an HTMLAllCollection object consist of all the descendant elements of the root Document.

Objects that implement the HTMLAllCollection interface are legacy platform objects with an additonal [[Call]] internal method described in the section below. They also have an [[IsHTMLDDA]] internal slot.

Objects that implement the HTMLAllCollection interface have several unusual behaviors, due of the fact that they have an [[IsHTMLDDA]] internal slot:

These special behaviors are motivated by a desire for compatibility with two classes of legacy content: one that uses the presence of document.all as a way to detect legacy user agents, and one that only supports those legacy user agents and uses the document.all object without testing for its presence first. [JAVASCRIPT]

[Exposed=Window,
 LegacyUnenumerableNamedProperties]
interface HTMLAllCollection {
  readonly attribute unsigned long length;
  getter Element (unsigned long index);
  getter (HTMLCollection or Element)? namedItem(DOMString name);
  (HTMLCollection or Element)? item(optional DOMString nameOrIndex);

  // Note: HTMLAllCollection objects have a custom [[Call]] internal method and an [[IsHTMLDDA]] internal slot.
};
collection . length

Returns the number of elements in the collection.

element = collection . item(index)
element = collection(index)
element = collection[index]

Returns the item with index index from the collection (determined by tree order).

element = collection . item(name)
collection = collection . item(name)
element = collection . namedItem(name)
collection = collection . namedItem(name)
element = collection(name)
collection = collection(name)
element = collection[name]
collection = collection[name]

Returns the item with ID or name name from the collection.

If there are multiple matching items, then an HTMLCollection object containing all those elements is returned.

Only button, form, iframe, input, map, meta, object, select, and textarea elements can have a name for the purpose of this method; their name is given by the value of their name attribute.

The object's supported property indices are as defined for HTMLCollection objects.

The supported property names consist of the non-empty values of all the id attributes of all the elements represented by the collection, and the non-empty values of all the name attributes of all the "all"-named elements represented by the collection, in tree order, ignoring later duplicates, with the id of an element preceding its name if it contributes both, they differ from each other, and neither is the duplicate of an earlier entry.

On getting, the length attribute must return the number of nodes represented by the collection.

The indexed property getter must return the result of getting the "all"-indexed element from this HTMLAllCollection given the passed index.

The namedItem(name) method must return the result of getting the "all"-named element(s) from this HTMLAllCollection given name.

The item(nameOrIndex) method must perform the following steps:

  1. If nameOrIndex was not provided, return null.

  2. Return the result of getting the "all"-indexed or named element(s) from this HTMLAllCollection, given nameOrIndex.


The following elements are "all"-named elements: a, button, embed, form, frame, frameset, iframe, img, input, map, meta, object, select, and textarea

To get the "all"-indexed element from an HTMLAllCollection collection given an index index, return the indexth element in collection, or null if there is no such indexth element.

To get the "all"-named element(s) from an HTMLAllCollection collection given a name name, perform the following steps:

  1. If name is the empty string, return null.

  2. Let subCollection be an HTMLCollection object rooted at the same Document as collection, whose filter matches only elements that are either:

  3. If there is exactly one element in subCollection, then return that element.

  4. Otherwise, if subCollection is empty, return null.

  5. Otherwise, return subCollection.

To get the "all"-indexed or named element(s) from an HTMLAllCollection collection given nameOrIndex:

  1. If nameOrIndex, converted to a JavaScript String value, is an array index property name, return the result of getting the "all"-indexed element from this HTMLAllCollection given the number represented by nameOrIndex.

  2. Return the result of getting the "all"-named element(s) from this HTMLAllCollection given nameOrIndex.

2.6.2.1.1 [[Call]] ( thisArgument, argumentsList )
  1. If argumentsList's size is zero, or if argumentsList[0] is undefined, return null.

  2. Let nameOrIndex be the result of converting argumentsList[0] to a DOMString.

  3. Let result be the result of getting the "all"-indexed or named element(s) from this HTMLAllCollection given nameOrIndex.

  4. Return the result of converting result to an ECMAScript value.

The thisArgument is ignored, and thus code such as Function.prototype.call.call(document.all, null, "x") will still search for elements. (document.all.call does not exist, since document.all does not inherit from Function.prototype.)

2.6.2.2 HTMLFormControlsCollection 接口

HTMLFormControlsCollection 接口用于 form 元素中 列出的元素集合

interface HTMLFormControlsCollection : HTMLCollection {
  // inherits length and item()
  getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
};

interface RadioNodeList : NodeList {
  attribute DOMString value;
};
collection . length

返回集合中元素的数目。

element = collection . item(index)
element = collection[index]

从集合中返回下标为 index 的项目。 这些项目以 树序 排序。

element = collection . namedItem(name)
radioNodeList = collection . namedItem(name)
element = collection[name]
radioNodeList = collection[name]

从集合中返回 IDnamename 的项目。

如果有多个匹配的项目,则返回一个包含所有那些元素的 RadioNodeList 对象。

radioNodeList . value [ = value ]

返回该对象表示的首个选中的单选按钮的值。

可以被设置,此时选中第一个值为该对象表示的值的单选按钮。

该对象 支持的属性下标HTMLCollection 中定义的相同。

支持的属性名该集合表示的 所有元素的所有 idname 属性的非空值组成。 这些值以 树序 排列, 忽略后面的重复项,元素的 idname 之前 (如果都存在的话),它们是互不相同的也互不为重复项。

namedItem(name) 方法必须根据下列算法操作:

  1. 如果 name 为空字符串,返回 null 并停止算法。
  2. 该方法被调用时,如果该集合中只有一个节点的 id 属性或 name 属性等于 name,则返回该节点并停止算法。
  3. 否则,如果集合中没有一个节点的 id 属性或 name 属性等于 name,则返回 null 并停止该算法。
  4. 否则,创建一个新的 RadioNodeList 对象, 表示该 HTMLFormControlsCollection 对象的一个 实时 视图, 且 RadioNodeList 对象中只包含 id 属性或 name 属性等于 name 的节点。RadioNodeList 对象中的节点必须以 树序 排序。
  5. 返回该 RadioNodeList 对象。

继承自 NodeList 接口的 RadioNodeList 接口的成员 必须与 NodeList 对象上的表现一致。

在获取RadioNodeList 对象上的 value IDL 属性时, 必须返回运行下列步骤的返回值:

  1. elementRadioNodeList 对象表示的第一个 (树序type 属性处于 单选按钮 状态且 选中状态 为真的 input 元素。 如果这样的元素不存在,令它为 null。

  2. 如果 element 为 null,返回空字符串。

  3. 如果 element 为没有 value 属性的元素, 返回“on” 字符串。

  4. 否则返回该 元素value 属性的值。

当设置时,value IDL 属性必须执行下列步骤:

  1. 如果新的值是字符串“on”:令 elementRadioNodeList 对象表示的第一个(树序type 属性处于 单选按钮 状态且 value 内容属性缺失, 或存在且等于新的值(如果有新值的话)的 input 元素。 如果这样的元素不存在,令 element 为 null。

    除此之外:令 elementRadioNodeList 对象表示的第一个(树序type 属性处于 单选按钮 状态且 value 内容属性存在且等于新值(如果有的话) 的 input 元素。 如果这样的元素不存在,令 element 为 null。

  2. 如果 element 不是 null, 则设置它的 选中状态 为真。

2.6.2.3 HTMLOptionsCollection 接口

HTMLOptionsCollection 接口用于 option 元素的 集合。它经常以 select 元素为根, 且拥有操作其后代属性和方法。

interface HTMLOptionsCollection : HTMLCollection {
  // inherits item(), namedItem()
  [CEReactions] attribute unsigned long length; // shadows inherited length
  [CEReactions] setter void (unsigned long index, HTMLOptionElement? option);
  [CEReactions] void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
  [CEReactions] void remove(long index);
  attribute long selectedIndex;
};
collection . length [ = value ]

返回集合中元素的数目。

当设置为较小的数字时,截断相应容器中 option 元素的数目。

当设置为较大的数字时,在容器中新增空白的 option 元素。

element = collection . item(index)
element = collection[index]

返回集合中下标为 index 的项目。项目以 树序 排序。

collection[index] = element

index 比集合中项目的数目大时,在相应容器中新增空白 option 元素。

当设为 null 时,从集合中移除在下标 index 处的项目。

当设为一个 option 元素时,在下标 index 处新增或替换为该元素。

element = collection . namedItem(name)
element = collection[name]

从集合中返回 IDnamename 的元素。

如果有多个匹配项则返回第一个。

collection . add(element [, before ] )

before 节点前插入 element

before 参数是数字时,在该数字处的项前插入 element; 是集合中的元素时,在该元素前插入 element

如果 before 被省略或者为 null, 或者是一个溢出的数字, 就在列表尾部插入 element

如果 element 是被插入元素的祖先, 该方法将会抛出 "HierarchyRequestError" DOMException

collection . remove(index)

从集合中移除下标为 index 的元素。

collection . selectedIndex [ = value ]

返回第一个项的下标(如果有的话),否则,如果没有选中项则返回 −1。

可以被设置,来改变选中项。

该对象 支持的属性下标HTMLCollection 对象中定义的相同。

当获取时,length 属性必须返回 集合表示的 节点的数目。

当设置时,其行为取决于新的值等于、大于或小于 当时 集合表示的 节点的数目。 如果等于,则设置该属性不应做任何事情。如果大于,则必须将 n 个新的、 没有属性和子节点的 option 元素追加到 HTMLOptionsCollection 的根 select 元素上。其中 n 为这两个数字之差(新的值减去旧的值)。 同时必须触发 Mutation 事件,如同插入了包含这些 option 元素的 DocumentFragment 一样。如果新的值更小,则必须从父节点中移除集合中最后的 n 个节点,其中 n 为这两个数之差(旧的值减去新的值)。

设置 length 不会移除或增加任何 optgroup 元素,也不会给既有的 optgroup 元素增加子节点。 (虽然可以从中移除子节点)。

支持的属性名 由 所有 集合表示的 元素的 所有idname属性的非空值构成。 这些值以 树序 排列, 忽略后面的重复项,元素的 idname 之前(如果都存在的话),它们互不相同也互不为重复项。

当用户代理 设置一个新的索引属性的值设置已存在的索引属性的值 时, 设属性下标为 index,新的值为 value,它必须运行下列算法:

  1. 如果 value 为 null,以 index 为参数运行 remove 方法的步骤,并终止本步骤。

  2. length集合表示的 节点的数目。

  3. nindexlength

  4. 如果 n 大于0,则 追加 一个由 n-1 个新的、 没有属性和子元素的 option 元素组成的 DocumentFragmentHTMLOptionsCollection 所在的根 select 元素。

  5. 如果 n 大于等于0,追加 valueselect 元素。否则,以 value 替换 集合中第 index 个元素。

add(element, before) 方法必须按照下列算法执行:

  1. 如果 elementHTMLOptionsCollection 所在的根 select 元素的祖先节点,则抛出一个 "HierarchyRequestError" DOMException 并终止这些步骤。

  2. 如果 before 为一个元素,但它并非 HTMLOptionsCollection 所在的根 select 元素的后代,则抛出一个 "NotFoundError" DOMException 并终止这些步骤。

  3. 如果 elementbefore 为同一元素,则返回并终止这些步骤。

  4. 如果 before 为一个节点,那么令 reference 为该节点。 否则如果 before 为整数且集合中存在第 before 个节点,令 reference 为该节点。否则令 reference 为 null。

  5. 如果 reference 不为 null,令 parentreference 的父节点。否则令 parentHTMLOptionsCollection 所在的根 select 元素。

  6. reference之前插入 elementparent 节点中。

remove(index) 方法 必须按照下列算法执行:

  1. 如果 集合表示的 元素数目为0, 终止这些步骤。

  2. 如果 index 小于零,或小于 集合表示的 节点数目,终止这些步骤。

  3. element 为集合中第 index 个元素。

  4. element 从它的父节点移除。

selectedIndex IDL 属性必须像 HTMLOptionsCollection 所在的根 select 元素上的同名属性一样操作。

2.6.3 DOMStringList 接口

DOMStringList 接口是表示字符串列表的一种毫不时髦的复古的方式。

[Exposed=(Window,Worker)]
interface DOMStringList {
  readonly attribute unsigned long length;
  getter DOMString? item(unsigned long index);
  boolean contains(DOMString string);
};

新 API 必须使用 sequence<DOMString> 或 其他等价的接口,而不是 DOMStringList

strings . length

返回 strings 中字符串的个数。

strings[index]
strings . item(index)

返回 strings 中下标为 index 的字符串。

strings . contains(string)

如果 strings 包含 string 则返回 true,否则返回 false。

每个 DOMStringList 对象有一个与之关联的 列表

DOMStringList 对象 支持的属性下标 为 0 到关联列表的 大小 减 1。如果与它关联的列表 为空,它就没有 支持的属性下标

length 属性的读取方法必须返回 与该 DOMStringList 对象关联的列表的 大小

item(index) 方法被调用时, 必须返回该 DOMStringList 对象的关联列表中第 index 个项目, 如果 index 加一大于该 DOMStringList 对象的关联列表的 大小

contains(string) 方法被调用时,如果该 DOMStringList 对象的关联列表 包含 string,则必须返回 true, 否则必须返回 false。

2.6.4 垃圾回收

任何 IDL 属性都暗示着一个预先存在的对象对另一个对象的 强引用

例如,window.document 属性意味着 Window 对象对它的 Document 对象有一个强引用。 类似地,从Document到任何后代节点都有一个强引用, 从任何节点到它的节点文档也都有一个强引用。

2.7 安全地传递结构化数据

本节使用 JavaScript 标准的术语和排版惯例。 [JAVASCRIPT]

2.7.1 可序列化对象

可序列化对象 支持被序列化以及之后反序列化, 且这一过程与给定的 JavaScript 领域 无关。 这允许它们存储在磁盘中用于后续恢复,或者在文档和 worker 的边界上克隆 (包括不同 的文档之间, 或者不同的 事件循环 之间)。

并非所有对象都是 可序列化对象,也并不是 可克隆的对象 的所有方面都需要在序列化时保留。

平台对象 可以是 可序列化对象 只要它们实现了用 [Serializable] IDL 扩展属性 标注的接口。 这样的接口必须定义下面的算法:

序列化步骤, 接受一个 平台对象 value, 一个 记录 serialized, 和一个布尔值 forStorage

value 中的数据序列化为 serialized 字段的一系列步骤。 序列化到 serialized 中的结果数据必须独立于任何 JavaScript 领域

如果不可能序列化,这些步骤会抛出异常。

这些步骤可能会执行一个 子序列化 来序列化嵌套的数据结构。 它们不应直接调用 StructuredSerialize,因为这样做会忽略 一个重要的 memory 参数。

引入这些步骤,如果与该算法无关,则不应该提及 forStorage 参数。

反序列化步骤, 接受一个 记录 serialized 和一个 平台对象 value

serialized 中的数据反序列化的一系列步骤,用它适当地建立 valuevalue 将会是一个新创建的相应 平台对象 类型的实例, 它的内部数据还未建立;这一工作交给这些步骤:

如果不可能反序列化这些步骤会抛出一个异常。

这些步骤可能会执行一个 子反序列化 来反序列化嵌套的数据结构。 它们不能直接调用 StructuredDeserialize,一文这样做会忽略 重要的 targetRealmmemory 参数。

由平台对象的定义决定哪些数据被这些步骤序列化和反序列化。通常这些步骤是非常对称的。

[Serializable] 扩展属性不允许有任何参数, 并且不能出现任何不是接口的地方。在一个接口上它必须只出现一次。它不能用在回调接口上。 如果它出现在部分接口(partial interface)上,或者一个混入接口(mixin)上, 那么它必须也出现在原始(original)或被混入(mixed-in-to)接口上, 并且部分接口或混入提供任何的 序列化步骤反序列化步骤 应该理解为 增加到原始或被混入接口的对应步骤上。

加入我们在定义一个平台对象 Person,它与两部分数据相关联:

接着,我们使用 [Serializable] 扩展属性 标注 Person 接口,可以把 Person 实例定义为 可序列化对象,同时定义下列算法:

序列化步骤
  1. 设置 serialized.[[Name]] 为 value 关联的名字值。

  2. serializedBestFriendvalue 关联的最好朋友的值的 子序列化

  3. 设置 serialized.[[BestFriend]] 为 serializedBestFriend

反序列化步骤
  1. 设置 value 关联的名字值为 serialized.[[Name]]。

  2. deserializedBestFriendserialized.[[BestFriend]] 的 子反序列化

  3. 设置 value 关联的最好朋友值为 deserializedBestFriend

在 JavaScript 规范中定义的对象直接由 StructuredSerialize 抽象操作处理。

最初,本规范定义了“克隆对象”的概念, 可以从一个 JavaScript 领域 克隆到另一个。 但为了更好地指定某些更复杂的情况的行为,更新了模型来显示地进行序列化和反序列化。

2.7.2 可传输对象

可传输对象 支持在 事件循环 之间传输。传输其实就是有效地重新创建对象并共享对底层数据的引用,然后将被传输的对象分离。 在转让昂贵资源的所有权时很有用。并非所有对象都是 可传输对象, 也并非 可传输对象 的所有方面都会在传输时被保留。

传输是不可逆转的、不幂等的操作。对象一旦被传输就不可再次传输或使用。

平台对象 可以是 可传输对象, 只要它们实现了以 [Transferable] IDL 扩展属性 注解的接口。 这样的接口必须定义下列算法:

传输步骤, 接受一个 平台对象 value 和一个 记录 dataHolder

value 中的数据传输到 dataHolder 字段的一系列步骤。 dataHolder 中的结果数据必须独立于任何 JavaScript 领域

如果不可能传输,这些步骤会抛出异常。

接收步骤, 接收一个 记录 dataHolder 和一个 平台对象 value

接收 dataHolder 中的数据并用它适当地建立 value 的一系列步骤。 value 将会是一个新创建的相应 平台对象 类型的实例, 它的内部数据还未建立;这一工作交给这些步骤:

如果不可能接收这次传输,这些步骤会抛出异常。

由平台对象的定义决定哪些数据被这些步骤传输。通常这些步骤是非常对称的。

[Transferable] 扩展属性不允许有任何参数, 并且不能出现任何不是接口的地方。在一个接口上它必须只出现一次。它不能用在回调接口上。 如果它出现在部分接口(partial interface)上,或者一个混入接口(mixin)上, 那么它必须也出现在原始(original)或被混入(mixed-in-to)接口上, 并且部分接口或混入提供任何的 传输步骤接收步骤 应该理解为 增加到原始或被混入接口的对应步骤上。

可传输对象平台对象 有一个 [[Detached]] 内部槽。 用于确保一旦平台对象已经被传输,它不能被再次传输。

JavaScript 标准中定义的对象直接交由 StructuredSerializeWithTransfer 抽象操作处理。

2.7.3 StructuredSerializeInternal ( valueforStorage [ ,memory ] )

StructuredSerializeInternal 抽象操作接受一个 JavaScript 值 value 作为输入, 把它序列化为一个 领域 无关的形式,在这里表示为一个 记录。这一序列化的形式有着后续反序列化到不同领域的新 JavaScript 值需要的所有必要信息。

这一过程可能会抛出一个异常,例如当尝试序列化不可序列化对象时。

  1. 如果没有提供 memory,令 memory 为一个空的 映射

    memory 映射是为了避免把对象序列化两次。 最终会用于保持环状结构以及标识图中的重复对象。

  2. 如果 memory[value] 存在,则 返回 memory[value]。

  3. deep 为 false。

  4. 如果 Type(value) 为 Undefined,Null,Boolean, String 或 Number,则返回 { [[Type]]: "primitive",[[Value]]: value }。

  5. 如果 Type(value) 为 Symbol,则抛出一个 "DataCloneError" DOMException

  6. serialized 为一个未初始化的值。

  7. 如果 value 有一个 [[BooleanData]] 内部槽,则把 serialized 设置为 { [[Type]]: "Boolean",[[BooleanData]]: value.[[BooleanData]] }。

  8. 否则,如果 value 有一个 [[NumberData]] 内部槽,则把 serialized 设置为 { [[Type]]: "Number",[[NumberData]]: value.[[NumberData]] }。

  9. 否则,如果 value 有一个 [[StringData]] 内部槽,则把 serialized 设置为 { [[Type]]: "String",[[StringData]]: value.[[StringData]] }。

  10. 否则,如果 value 有一个 [[DateValue]] 内部槽,则把 serialized 设置为 { [[Type]]: "Date",[[DateValue]]: value.[[DateValue]] }。

  11. 否则,如果 value 有一个 [[RegExpMatcher]] 内部槽,则把 serialized 设置为 { [[Type]]: "RegExp",[[RegExpMatcher]]: value.[[RegExpMatcher]],[[OriginalSource]]: value.[[OriginalSource]], [[OriginalFlags]]: value.[[OriginalFlags]] }。

  12. 否则,如果 value 有一个 [[ArrayBufferData]] 内部槽,则:

    1. sizevalue.[[ArrayBufferByteLength]]。

    2. 如果 ! IsSharedArrayBuffer(value) 为 true,则:

      1. 如果 forStorage 为 true,则抛出一个 "DataCloneError" DOMException

      2. serialized 设置为 { [[Type]]: "SharedArrayBuffer",[[ArrayBufferData]]: value.[[ArrayBufferData]],[[ArrayBufferByteLength]]: size, [[AgentCluster]]: 当前领域记录 对应的 代理集群 }。

    3. 否则:

      1. 如果 ! IsDetachedBuffer(value) 为 true,则抛出一个 "DataCloneError" DOMException

      2. dataCopy 为 ? CreateByteDataBlock(size)。

        在分配地址失败时可能会抛出一个 RangeError 异常。

      3. 执行 ! CopyDataBlockBytes(dataCopy,0,value.[[ArrayBufferData]],0,size)。

      4. serialized 设置为 { [[Type]]: "ArrayBuffer",[[ArrayBufferData]]: dataCopy,[[ArrayBufferByteLength]]: size }。

  13. 否则,如果 value 有一个 [[ViewedArrayBuffer]] 内部槽,则:

    1. buffervalue 的 [[ViewedArrayBuffer]] 内部槽的值。

    2. bufferSerialized 为 ? StructuredSerializeInternal(buffer,forStorage, memory)。

    3. 断言: bufferSerialized.[[Type]] 是 "ArrayBuffer"。

    4. 如果 value 有一个 [[DataView]] 内部槽,则把 serialized 设置为 { [[Type]]: "ArrayBufferView",[[Constructor]]: "DataView",[[ArrayBufferSerialized]]: bufferSerialized,[[ByteLength]]: value.[[ByteLength]],[[ByteOffset]]: value.[[ByteOffset]] }。

    5. 否则:

      1. 断言: value 有一个 [[TypedArrayName]] 内部槽。

      2. serialized 设置为 { [[Type]]: "ArrayBufferView",[[Constructor]]: value.[[TypedArrayName]],[[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]],[[ByteOffset]]: value.[[ByteOffset]],[[ArrayLength]]: value.[[ArrayLength]] }。

  14. 否则,如果 value 有 [[MapData]] 内部槽,则:

    1. 设置serialized 为 { [[Type]]: "Map",[[MapData]]: 一个新的空 列表 }。

    2. 设置deep 为 true。

  15. 否则,if value 有 [[SetData]] 内部槽,则:

    1. 设置 serialized 为 { [[Type]]: "Set",[[SetData]]: 一个新的空 列表 }。

    2. 设置 deep 为 true。

  16. 否则,如果 value 是一个外来 Array 对象,那么:

    1. valueLenDescriptor 为 ? OrdinaryGetOwnProperty(value,"length")。

    2. valueLenvalueLenDescriptor.[[Value]]。

    3. 设置serialized 为 { [[Type]]: "Array",[[Length]]: valueLen, [[Properties]]: 一个新的空 列表 }。

    4. 设置deep 为 true。

  17. 否则,如果 value 是一个 可序列化的 平台对象

    1. 如果 value 有一个 [[Detached]] 内部槽且值为 true, 则抛出一个 "DataCloneError" DOMException

    2. typeStringvalue主接口 标识。

    3. 设置serialized 为 { [[Type]]: typeString }。

    4. 设置deep 为 true。

  18. 否则,如果 value 是一个 平台对象,则抛出一个 "DataCloneError" DOMException

  19. 否则,如果 IsCallable(value) 为 true,则抛出一个 "DataCloneError" DOMException

  20. 否则,如果 value 有除了 [[Prototype]] 和 [[Extensible]] 之外的任何内部槽, 则抛出一个 "DataCloneError" DOMException

    例如 [[PromiseState]] 或 [[WeakMapData]] 内部槽。

  21. 否则,如果 value 是一个外来对象,则抛出一个 "DataCloneError" DOMException

    例如代理对象。

  22. 否则:

    1. 设置serialized 为 { [[Type]]: "Object",[[Properties]]: 一个新的空 列表 }。

    2. 设置deep 为 true。

  23. 设置 memory[value] 为 serialized

  24. 如果 deep 为 true,则:

    1. 如果 value 有一个 [[MapData]] 内部槽,则:

      1. copiedList 为一个新的空 列表

      2. value.[[MapData]] 中的 每一个 记录 { [[Key]],[[Value]] } entry

        1. copiedEntry 为一个新的 记录 { [[Key]]: entry.[[Key]],[[Value]]: entry.[[Value]] }。

        2. 如果 copiedEntry.[[Key]] 不是特殊值 empty追加 copiedEntrycopiedList

      3. copiedList 中的 每一个 记录 { [[Key]],[[Value]] } entry

        1. serializedKey 为 ? StructuredSerializeInternal(entry.[[Key]],forStorage, memory)。

        2. serializedValue 为 ? StructuredSerializeInternal(entry.[[Value]],forStorage, memory)。

        3. 追加 { [[Key]]: serializedKey, [[Value]]: serializedValue } 到 serialized.[[MapData]]。

    2. 否则,如果 value 有一个 [[SetData]] 内部槽,则:

      1. copiedList 为一个新的空 列表

      2. value.[[SetData]] 中 每一个 entry

        1. 如果 entry 不是特殊值 empty追加 entrycopiedList

      3. copiedList每一个 entry

        1. serializedEntry 为 ? StructuredSerializeInternal(entry,forStorage, memory)。

        2. 追加 serializedEntryserialized.[[SetData]]。

    3. 否则,如果 value 是一个 可序列化的 平台对象,则给定 valueserialized,和 forStorage 执行适当的 序列化步骤

      序列化步骤 可能需要执行一个 字序列化。 该操作接受 subValue 值作为输入,返回 StructuredSerializeInternal (subValue, forStorage,memory)。 (换句话说,子序列化StructuredSerializeInternal 的与该调用一致的特化。)

    4. 否则:

      1. enumerableKeys 为一个新的空 列表

      2. value.[[OwnPropertyKeys]]() 中的每一个 key

        1. 如果 Type(key) 为 String,则:

          1. valueDesc 为 ! value.[[GetOwnProperty]](key)。

          2. 如果 valueDesc.[[Enumerable]] 为 true,则 追加 keyenumerableKeys

      3. enumerableKeys 中的每一个 key

        1. 如果 ! HasOwnProperty(value,key) 为 true,则:

          1. inputValue 为 ? value.[[Get]](key, value)。

          2. outputValue 为 ? StructuredSerializeInternal(inputValue,forStorage, memory)。

          3. 追加 { [[Key]]: key,[[Value]]: outputValue } 到 serialized.[[Properties]]。

      上面执行的键的集合非常类似于 JavaScript 规范的 EnumerableOwnProperties 操作, 但最关键的是它使用 [[OwnPropertyKeys]] 内部方法提供的确定性排序, 而不是像 EnumerableOwnProperties 那样以非未定义的方式对键进行重新排序。 [JAVASCRIPT]

  25. 返回 serialized

注意 StructuredSerializeInternal 产生的 记录 可能包含其他记录的 "指针",这产生了环装引用。例如当我们传递下面的 JavaScript 对象到 StructuredSerializeInternal 中时:

const o = {};
o.myself = o;

它产生了下面的结果:

{
  [[Type]]: "Object",
  [[Properties]]: «
    {
      [[Key]]: "myself",
      [[Value]]: <一个指向整个结构的指针>
    }
  »
}

2.7.4 StructuredSerialize ( value )

  1. 返回 ? StructuredSerializeInternal(value, false).

2.7.5 StructuredSerializeForStorage ( value )

  1. 返回 ? StructuredSerializeInternal(value, true).

2.7.6 StructuredDeserialize ( serializedtargetRealm [ ,memory ] )

StructuredDeserialize 抽象操作接受一个 记录 serialized 作为输入,它由之前的 StructuredSerializeStructuredSerializeForStorage 产生,把它反序列化到一个新的 targetRealm 中创建的 JavaScript 值。

该过程可能抛出一个异常,例如为新的对象尝试分配内存时(尤其是 ArrayBuffer 对象)。

  1. 如果没有提供 memory,令 memory 为一个空的 映射

    memory 映射是为了避免把对象反序列化两次。 最终会用于保持环状结构以及标识图中的重复对象。

  2. 如果 memory[sirialized] 存在,则 返回 memory[serialized]。

  3. deep 为 false。

  4. value 为一个未初始化的值。

  5. 如果 serialized 包含一个 [[TransferConsumed]] 字段,则:

    1. 断言: serialized.[[TransferConsumed]] 为 false。 (一定不能进入这种情况:在同一个序列化上调用多次 StructuredDeserialize,而那个序列化又包含了传输数据容器。)

    2. 设置 serialized.[[TransferConsumed]] 为 true。

    3. 如果 serialized.[[Type]] 是 "ArrayBuffer",则设置 value 为一个新的 targetRealm 中的 ArrayBuffer 对象,其 [[ArrayBufferData]] 内部槽值为 serialized.[[ArrayBufferData]],其 [[ArrayBufferByteLength]] 内部槽值为 serialized.[[ArrayBufferByteLength]]。

      在反序列化期间可以访问 [[ArrayBufferData]] 占用的原始内存的情况下, 此步骤不大可能会引发异常,因为不需要分配新的内存: 只是把 [[ArrayBufferData]] 占用的内存转移到新的 ArrayBuffer 中。 例如当源和目标 Realm 都在同一进程中时,就属于这种情况。

    4. 否则:

      1. interfaceNameserialized.[[Type]]。

      2. 如果由 interfaceName 标识的接口没有暴露在 targetRealm 中,则抛出一个 "DataCloneError" DOMException

      3. 设置 value 为一个在 targetRealm 中创建的 新的由 interfaceName 标识的接口的实例。

      4. 给定 serializedvalue,为 interfaceName 标识的接口 执行适当的 接收步骤

  6. 否则,如果 serialized.[[Type]] 是 "primitive",则设置 valueserialized.[[Value]]。

  7. 否则,如果 serialized.[[Type]] 是 "Boolean",则设置 value 为一个 targetRealm 中的新的 Boolean 对象,其 [[BooleanData]] 内部槽值为 serialized.[[BooleanData]]。

  8. 否则,如果 serialized.[[Type]] 是 "Number",则设置 value 为一个 targetRealm 中的新的 Number 对象,其 [[NumberData]] 内部槽值为 serialized.[[NumberData]]。

  9. 否则,如果 serialized.[[Type]] 是 "String",则设置 value 为一个 targetRealm 中的新的 String 对象,其 [[StringData]] 内部槽值为 serialized.[[StringData]]。

  10. 否则,如果 serialized.[[Type]] 是 "Date",则设置 value 为一个 targetRealm 中的新的 Date 对象,其 [[DateValue]] 内部槽值为 serialized.[[DateValue]]。

  11. 否则,如果 serialized.[[Type]] 是 "RegExp",则设置 value 为一个 targetRealm 中的新的 RegExp 对象,其 [[RegExpMatcher]] 内部槽值为 serialized.[[RegExpMatcher]],其 [[OriginalSource]] 内部槽值为 serialized.[[OriginalSource]],其 [[OriginalFlags]] 内部槽值为 serialized.[[OriginalFlags]]。

  12. 否则,如果 serialized.[[Type]] 是 "SharedArrayBuffer",则:

    1. 如果 targetRealm 对应的 agent cluster 不是 serialized.[[AgentCluster]],则抛出一个 "DataCloneError" DOMException

    2. 否则,设置 value 到一个 targetRealm 中的新的 SharedArrayBuffer 对象, 其 [[ArrayBufferData]] 内部槽值为 serialized.[[ArrayBufferData]], 其 [[ArrayBufferByteLength]] 内部槽值是 serialized.[[ArrayBufferByteLength]]。

  13. 否则,如果 serialized.[[Type]] 是 "ArrayBuffer",则设置 value 为一个 targetRealm 中新的 ArrayBuffer 对象,其 [[ArrayBufferData]] 内部槽值为 serialized.[[ArrayBufferData]],其 [[ArrayBufferByteLength]] 内部槽值为 serialized.[[ArrayBufferByteLength]]。

    如果这抛出了一个异常,则抛出一个 "DataCloneError" DOMException

    如果没有足够的内存来创建这样一个 ArrayBuffer 对象,该步骤可能会抛出异常。

  14. 否则,如果 serialized.[[Type]] 是 "ArrayBufferView",则:

    1. deserializedArrayBuffer 为 ? StructuredDeserialize(serialized.[[ArrayBufferSerialized]], targetRealm,memory)。

    2. 如果 serialized.[[Constructor]] 是 "DataView",则设置 valuetargetRealm 中的一个新的 DataView 对象,其 [[ViewedArrayBuffer]] 内部槽值为 deserializedArrayBuffer,其 [[ByteLength]] 内部槽值为 serialized.[[ByteLength]],其 [[ByteOffset]] 内部槽值为 serialized.[[ByteOffset]]。

    3. 否则,设置 value 为一个 targetRealm 中新的有类型数组对象, 使用 serialized.[[Constructor]] 给出的构造器,其 [[ViewedArrayBuffer]] 内部槽值为 deserializedArrayBuffer,其 [[TypedArrayName]] 内部槽值为 serialized.[[Constructor]],其 [[ByteLength]] 内部槽值为 serialized.[[ByteLength]],其 [[ByteOffset]] 内部槽值为 serialized.[[ByteOffset]],其 [[ArrayLength]] 内部槽值为 serialized.[[ArrayLength]]。

  15. 否则,如果 serialized.[[Type]] 是 "Map",则:

    1. 设置valuetargetRealm 中一个新的 Map 对象,其 [[MapData]] 内部槽值为一个新的空 列表

    2. 设置deep to true。

  16. 否则,如果 serialized.[[Type]] 是 "Set",则:

    1. 设置value 为一个 targetRealm 中新的设置对象,其 [[SetData]] 内部槽值为一个新的空 列表

    2. 设置deep 为 true。

  17. 否则,如果 serialized.[[Type]] 是 "Array",则:

    1. outputPrototargetRealm 中的 %ArrayPrototype% 固有对象。

    2. 设置 value 为 ! ArrayCreate(serialized.[[Length]], outputProto)。

    3. 设置deep 为 true。

  18. 否则,如果 serialized.[[Type]] 是 "Object",则:

    1. 设置valuetargetRealm 中一个新的 Object。

    2. 设置deep 为 true。

  19. 否则:

    1. interfaceNameserialized.[[Type]]。

    2. 如果 interfaceName 标识的接口没有暴露在 targetRealm 中,则抛出一个 "DataCloneError" DOMException

    3. 设置value 为在 targetRealm 中创建的、 以 interfaceName 标识的接口的一个新的实例。

    4. 设置deep 为 true。

  20. 设置 memory[serialized] 为 value

  21. 如果 deep 为 true,则:

    1. 如果 serialized.[[Type]] 是 "Map",则:

      1. serialized.[[MapData]] 中的 每一个 记录 { [[Key]],[[Value]] } entry

        1. deserializedKey 为 ? StructuredDeserialize(entry.[[Key]],targetRealm, memory)。

        2. deserializedValue 为 ? StructuredDeserialize(entry.[[Value]],targetRealm, memory)。

        3. 追加 { [[Key]]: deserializedKey, [[Value]]: deserializedValue } 到 value.[[MapData]]。

    2. 否则,如果 serialized.[[Type]] 是 "Set",则:

      1. serialized.[[SetData]] 中 每一个 entry

        1. deserializedEntry 为 ? StructuredDeserialize(entry,targetRealm, memory)。

        2. 追加 deserializedEntryvalue.[[SetData]]。

    3. 否则,如果 serialized.[[Type]] 是 "Array" 或 "Object",则:

      1. serialized.[[Properties]] 中的 每一个 记录 { [[Key]],[[Value]] } entry

        1. deserializedValue 为 ? StructuredDeserialize(entry.[[Value]],targetRealm, memory)。

        2. result 为 ! CreateDataProperty(value, entry.[[Key]],deserializedValue)。

        3. 断言: result 为 true。

    4. 否则:

      1. 给定 serializedvalue,为 serialized.[[Type]] 标识的接口 执行适当的 反序列化步骤

        反序列化步骤 可能会执行一个 子反序列化。该操作接受 先前序列化后的 Record subSerialized 作为输入,返回 StructuredDeserialize(subSerialized,targetRealm, memory)。(换句话说,子反序列化 是 是 StructuredDeserialize 的与该调用一致的特化。)

  22. 返回 value

2.7.7 StructuredSerializeWithTransfer ( valuetransferList )

  1. memory 为一个空的 映射

    除了它在 StructuredSerializeInternal 中的正常使用外, 在本算法中 memory 还用来确保 StructuredSerializeInternal 忽略了 transferList 中的项目,来让我们做自己的处理。

  2. transferList 中的 每一个 transferable

    1. 如果 transferable 既没有 [[ArrayBufferData]] 内部槽 又没有 [[Detached]] 内部槽,则抛出一个 "DataCloneError" DOMException

    2. 如果 transferable 有一个 [[ArrayBufferData]] 内部槽且 ! IsSharedArrayBuffer(transferable) 为 true 或 ! IsDetachedBuffer(transferable) 为 true,则抛出一个 "DataCloneError" DOMException

    3. 如果 transferable 有一个 [[Detached]] 内部槽且 transferable.[[Detached]] 为 true,则抛出一个 "DataCloneError" DOMException

    4. placeholder 为一个用户代理定义的占位对象。

    5. 设置 memory[transferable] 为 placeholder

  3. serialized 为 ? StructuredSerializeInternal(value, false,memory)。

  4. transferDataHolders 为一个新的空 列表

  5. transferList 中的 每一个 transferable

    1. placeholdermemory[transferable]。

    2. dataHolder 为一个未初始化的值。

    3. 如果 transferable 有一个 [[ArrayBufferData]] 内部槽,则:

      1. 设置dataHolder 为 { [[TransferConsumed]]: false,[[Type]]: "ArrayBuffer", [[ArrayBufferData]]: transferable.[[ArrayBufferData]],[[ArrayBufferByteLength]]: transferable.[[ArrayBufferByteLength]] }。

      2. 执行 ! DetachArrayBuffer(transferable)。

    4. 否则:

      1. 断言: transferable 是一个 可传输的 平台对象

      2. interfaceNametransferable主接口 的标识符。

      3. 设置dataHolder 为 { [[TransferConsumed]]: false,[[Type]]: interfaceName }。

      4. 指定 transferabledataHolder, 为 interfaceName 标识的接口执行适当的 传输步骤

      5. 设置transferable.[[Detached]] 为 true。

    5. serialized 中,用 dataHolder 替换所有的 placeholder 实例。

    6. 追加 dataHoldertransferDataHolders

  6. 返回 { [[Serialized]]: serialized,[[TransferDataHolders]]: transferDataHolders }。

2.7.8 StructuredDeserializeWithTransfer ( serializeWithTransferResulttargetRealm )

  1. memory 为一个空的 映射

    除了它在 StructuredDeserialize 中的正常使用外, 在本算法中 memory 还用来帮助我们确定传输值的列表。

  2. deserialized 为 ? StructuredDeserialize(serializeWithTransferResult.[[Serialized]], targetRealm,memory)。

  3. transferredValues 为一个新的空 列表

  4. serializeWithTransferResult.[[TransferDataHolders]] 中的 每一个 transferDataHolder

    1. 追加 memory[transferDataHolder] 到 transferredValues

  5. 返回 { [[Deserialized]]: deserialized,[[TransferredValues]]: transferredValues }。

2.7.9 在其他规范中执行序列化和传输

其他规范可以使用这里定义的抽象操作。下面为每个抽象操作何时比较有用提供了指导以及例子。

StructuredSerializeWithTransfer
StructuredDeserializeWithTransfer

把一个值克隆到另一个 JavaScript Realm, 带着传输列表但提前不知道目标领域。 这一情况下序列化步骤可以立即执行,反序列化步骤延迟到目标 Realm 已知的时候执行。

messagePort.postMessage() 使用这一对抽象操作,因为目标 Realm 直到 MessagePort 发出 时才知道。

StructuredSerialize
StructuredSerializeForStorage
StructuredDeserialize

为给定的值创建一个 JavaScript Realm 无关的可以保存无限时间的快照, 然后(可能很多次)具象化回 JavaScript 值。

StructuredSerializeForStorage 可以在序列化被用于持久保存值的时候 (而不是在 Realm 之间传递)使用。当尝试序列化 SharedArrayBuffer 对象时会抛出异常, 因为保存共享内存没有意义。类似地,当指定有着定制的 序列化步骤平台对象forStorage 参数为 true 时,也可能抛出异常或者有不同的行为。

history.pushState()history.replaceState() 在作者提供的状态对象上使用 StructuredSerializeForStorage,把它们存储为 会话历史入口序列化状态。 然后 history.state 属性用了 StructuredDeserialize 来返回最初提供的状态对象的一份克隆。

broadcastChannel.postMessage() 对它的输入使用了 StructuredSerialize,然后对结果多次使用了 StructuredDeserialize 来对每一个广播目标产生新的拷贝。注意在多目标情况下传输没有意义。

持久化 JavaScript 值到文件系统的 API 可能还会对它的输入使用 StructuredSerializeForStorage 并对它的输出使用 StructuredDeserialize

一般来说,调用点可能会传递 Web IDL 值而不是 JavaScript 值; 这将被理解为在调用这些算法之前执行到 JavaScript 值的隐式 转换

本规范曾经定义了“结构化克隆”算法和一个 StructuredClone 抽象操作。 然而在实践中,它的所有已知用途可以更好地通过单独的序列化和反序列化步骤来实现,所以把它删除了。


如果在任意对象上进行操作,对于非用户代码同步调用到用户代理方法的调用点必须在调用 StructuredSerializeStructuredSerializeForStorage, 或 StructuredSerializeWithTransfer 等抽象操作之前小心地 准备执行脚本 以及 准备运行 fallback。 这是必要的,因为序列化过程可能会调用作者定义的访问器作为最终的深度序列化步骤, 这些访问器调用的操作可能会依赖于 entryincumbent 的概念已经建立好。

window.postMessage() 对它的参数执行 StructuredSerializeWithTransfer 操作,但是在算法中的同步部分立即执行这一操作则需要小心。 因为可能无需 准备执行脚本准备执行 fallback 就能使用该算法。

作为对比,假设有个 API 直接通过 事件循环任务 来定期地使用 StructuredSerialize 序列化一些作者提供的对象, 可能需要事先确保它执行了适当的准备工作。现在我们还没见过平台上有这样的 API; 通常,作为作者代码的同步结果来事先执行序列化更加容易。

3 HTML 文档的语义,结构,与API

3.1 文档

HTML UA 中的每个 XML 和 HTML 文档表示为一个 Document 对象。 [DOM]

Document 对象的 URL 定义在 WHATWG DOM 标准中。 It is initially set when 当创建 Document 对象时设置,但可以在 Document 的生命期内改变; 例如当用户 导航 到一个页面的一个 片段 并用一个新的 URL 调用 pushState() 方法时就会改变。[DOM]

交互式用户代理通常在其用户界面中显示 Document 对象的 URL。 这是用户用来判断当前网站是否在冒充其他网站的主要机制。

脚本 中使用 createDocument()createHTMLDocument() 创建 Document 时,该 Document 立即 准备好了执行加载后的任务 并且 完全加载

文档的引荐来源 是一个(表示一个 URL 的)字符串, 在 Document 创建时设置。如果没有显式地设置它,那么它的值是空字符串。

每个 Document 对象有一个 重新载入覆盖标志,初始未设置。 该标志由 document.open()document.write() 方法在特定情况下设置。当该标志被设置时, Document 还有一个 重新载入覆盖缓冲区, 它是一个 Unicode 字符串,当文档重新载入时用作文档的源码。

给定一个 源浏览环境,用户代理执行 覆盖重新载入 时必须执行以下操作:

  1. source浏览环境活动文档重新载入覆盖缓冲区 的值。

  2. address浏览环境活动文档URL

  3. HTTPS state浏览环境活动文档HTTPS 状态

  4. referrer policy浏览环境活动文档引荐来源策略

  5. CSP list浏览环境活动文档CSP 列表

  6. 浏览环境 导航 到 一个新的 响应,其 bodysource头部列表Referrer-Policyreferrer policyCSP 列表CSP listHTTPS 状态HTTPS state, 同时设置 启用异常标志启用替换标志源浏览环境 为传给 覆盖重新载入 算法的那个。 当 导航 算法为此创建了一个 Document 对象时, 设置这个 Document重新载入覆盖标志, 并把它的 重新载入覆盖缓冲区 设为 source。重新抛出任何异常。

    导航算法设置文档的地址 时, 使用 address 作为 覆盖 URL

3.1.1 Document 对象

WHATWG DOM 标志定义了 Document 接口,本规范对它进行了很多扩展:

enum DocumentReadyState { "loading","interactive","complete" };
typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement;

[OverrideBuiltins]
partial interface Document {
  // 资源元数据管理
  [PutForwards=href,Unforgeable] readonly attribute Location? location;
  attribute USVString domain;
  readonly attribute USVString referrer;
  attribute USVString cookie;
  readonly attribute DOMString lastModified;
  readonly attribute DocumentReadyState readyState;

  // DOM 树访问器
  getter object (DOMString name);
  [CEReactions] attribute DOMString title;
  [CEReactions] attribute DOMString dir;
  [CEReactions] attribute HTMLElement? body;
  readonly attribute HTMLHeadElement? head;
  [SameObject] readonly attribute HTMLCollection images;
  [SameObject] readonly attribute HTMLCollection embeds;
  [SameObject] readonly attribute HTMLCollection plugins;
  [SameObject] readonly attribute HTMLCollection links;
  [SameObject] readonly attribute HTMLCollection forms;
  [SameObject] readonly attribute HTMLCollection scripts;
  NodeList getElementsByName(DOMString elementName);
  readonly attribute HTMLOrSVGScriptElement? currentScript; // classic scripts in a document tree only

  // 动态标记插入
  [CEReactions] Document open(optional DOMString type = "text/html",optional DOMString replace = "");
  WindowProxy open(USVString url,DOMString name,DOMString features);
  [CEReactions] void close();
  [CEReactions] void write(DOMString..。 text);
  [CEReactions] void writeln(DOMString..。 text);

  // 用户交互
  readonly attribute WindowProxy? defaultView;
  readonly attribute Element? activeElement;
  boolean hasFocus();
  [CEReactions] attribute DOMString designMode;
  [CEReactions] boolean execCommand(DOMString commandId,optional boolean showUI = false,optional DOMString value = "");
  boolean queryCommandEnabled(DOMString commandId);
  boolean queryCommandIndeterm(DOMString commandId);
  boolean queryCommandState(DOMString commandId);
  boolean queryCommandSupported(DOMString commandId);
  DOMString queryCommandValue(DOMString commandId);

  // 只适用于 Document 对象的特殊 事件处理器 IDL 属性
  [LenientThis] attribute EventHandler onreadystatechange;
};
Document 实现了 GlobalEventHandlersDocument 实现了 DocumentAndElementEventHandlers

Document 有一个 HTTPS 状态 (一个 HTTPS 状态值), 初始为 "none",它表示传递 Document 的数据的网络频道的安全属性。

Document 有一个 引荐来源策略 (一个 引荐来源策略), 初始为空字符串,它表示由 Document 发起的 获取 的默认 引荐来源策略

Document 有一个 CSP 列表,它是一个在该上下文中活动的 内容安全策略 对象的列表。 该列表在没有指定时是空的。

Document 有一个 feature policy,它是一个 feature policy 且初始为空。.

Document 有一个 模块映射, 是一个初始为空的 模块映射

3.1.2 资源元数据管理

document . referrer

返回用户导航到此文档的那个 DocumentURL, 除非它被阻止或没有这样的文档,这时返回空字符串。

noreferrer 链接类型可用于阻止引荐来源。

referrer 属性必须返回 该文档的引荐来源


document . cookie [ = value ]

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

可以被设置,用来给该元素的 HTTP Cookie 集合添加一个新的 Cookie。

如果内容 被沙盒化到一个唯一的 origin 中 (例如有 sandbox 属性的 iframe), 当读取和设置时抛出 "SecurityError" DOMException

cookie 属性表示由文档的 URL 标识的资源的 Cookie。

满足下列条件的 Document 对象为 cookie-averse 文档 对象

当读取时,如果文档是一个 cookie-averse Document 对象, 那么用户代理必须返回空字符串。否则,如果 Documentorigin 是一个 不透明 origin,用户代理必须抛出 "SecurityError" DOMException。否则,用户代理必须作为 "非HTTP" API 返回 使用 无 BOM 的 UTF-8 解码算法 解码后的, 文档 URLCookie 字符串[COOKIES](This is a fingerprinting vector.)

当设置时,如果文档是一个 cookie-averse Document 对象, 则用户代理必须什么都不做。否则,如果 Documentorigin 是一个 不透明 origin,用户代理必须抛出一个 "SecurityError" DOMException。 否则用户代理的行为必须像是通过 "非HTTP" API 为文档的 URL 接收 set-cookie-string 时一样。 其中,set-cookie-string 由一个新的 UTF-8 编码的 值组成。[COOKIES] [ENCODING]

因为在 frame 之间可以访问 cookie 属性, Cookie 的路径限制只是用来帮助管理对站点的哪一部分发送哪些 Cookie 的工具,并不是任何形式的安全特性。

cookie 属性的读取方法和设定方法同步地访问共享状态。 由于没有加锁机制,在多进程用户代理中其他浏览环境可能会在脚本执行中修改 Cookie。 比如一个站点试着读取 Cookie,增加它的值然后写回去,用新的值作为会话的唯一标识; 如果该站点在不同的浏览器窗口中同时做这件事情,两个会话使用的唯一标识可能是相同的,这可能引发灾难性后果。


document . lastModified

根据服务器的报告返回文档的(用户的本地时区的)最后修改时间,按照这样的格式:"MM/DD/YYYY hh:mm:ss"。

如果不知道最后修改时间,返回当前时间。

当读取 lastModified 属性时, 必须返回 Document 的源文件的最后修改(在用户本地时区的)日期和时间,按照下列格式:

  1. 日期的月。
  2. 一个 U+002F SOLIDUS 字符 (/)。
  3. 日期的日。
  4. 一个 U+002F SOLIDUS 字符 (/)。
  5. 日期的年。
  6. 一个 U+0020 SPACE 字符。
  7. 时间的小时部分。
  8. 一个 U+003A COLON 字符 (:)。
  9. 时间的分钟部分。
  10. 一个 U+003A COLON 字符 (:)。
  11. 时间的秒部分。

上述除了年之外的所有数字数字组件必须以两位 ASCII 数字 的形式给出, 表示十进制数,必要时需要补零。年必须按照最短可能的字符串给出,可能是 4 个或更多的 ASCII 数字,表示十进制数,必要时需要补零。

Document 的源文件的最后修改日期和时间必须从使用的网络协议的相关特性中获取。 比如文档的 HTTP Last-Modified 头部,或者(对于本地文件)文件系统中的元数据。 如果不知道最后修改日期和时间,该属性必须按照上述格式返回当前日期和时间。


document . readyState

Document 正在加载时返回 "loading", 一旦结束解析但仍在加载子资源时返回 "interactive", 一旦加载完成返回 "complete"。

当这个值变化时触发 Document 对象上的 readystatechange 事件。

每个文档有一个 当前文档就绪状态。 创建 Document 对象时, 如果文档有关联的 HTML 解析器XML 解析器,或 XSLT 处理器, 必须将 当前文档就绪状态 设置为字符串 "loading"; 否则必须将 当前文档就绪状态 设置为字符串 "complete"。 在页面加载过程中很多算法都会影响这个值。当这个值被设置时用户代理必须 在 Document 对象上 触发 一个名为 readystatechange 的事件。

如果文档有关联的 HTML 解析器XML 解析器, 且该解析器还没有 停止中止, 那么就称该 Document 有一个 活动的解析器

当读取时,readyState IDL 属性必须返回 当前文档就绪状态

3.1.3 DOM 树访问器

如果文档是一个 html 元素, 它的 html 元素 就是它的 文档元素, 否则就是 null。


document . head

返回 head 元素

文档的 head 元素 是它的 html 元素 的第一个 head 子元素。 如果没有这样的元素,则为 null。

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

Support: documentheadChrome for Android 67+Chrome 4+iOS Safari 4.0+UC Browser for Android 11.8+Firefox 4+IE 9+Opera Mini all+Safari 5.1+Edge 12+Samsung Internet 4+Android Browser 2.3+Opera 11+

Source: caniuse.com


document . title [ = value ]

返回文档的标题,对于 HTML 由 title 元素 给出, 对于 SVG 由 SVG title 元素给出。

可以被设置来更新文档的标题。如果没有合适的元素来更新,新的值将被忽略。

文档的 title 元素 是文档中的第一个 title 元素(按 树序), 如果没有则为 null。

当读取时,title 属性必须执行以下算法:

  1. 如果 文档元素 是一个 SVG svg 元素, 那么令 value文档元素 的第一个子 SVG title 元素的 子文本内容

  2. 否则,令 valuetitle 元素子文本内容, 如果 title 元素 是 null 则令 value 为空字符串。

  3. 移除 value 前后和多余的 ASCII 空白

  4. 返回 value

当设置时,必须执行匹配下列第一个条件的对应步骤:

如果 文档元素 是一个 SVG svg 元素
  1. 如果 文档元素 有一个 SVG title 子元素, 令 element 为第一个该元素。

  2. 否则:

    1. element 为给定 文档元素节点文档titleSVG 命名空间 创建一个元素 的结果。

    2. element 作为 第一个子元素 插入到 文档元素 中。

  3. 如同 elementtextContent IDL 属性设置为正在分配的新值一样表现。

如果 文档元素HTML 命名空间
  1. 如果 title 元素 为 null 且 the head 元素 为 null,则中止这些步骤。

  2. 如果 title 元素 不是 null,令 element 为该 title 元素

  3. 否则:

    1. element 为给定 文档元素节点文档titleHTML 命名空间 创建一个元素 的结果。

    2. element 追加head 元素 中。

  4. 如同 elementtextContent IDL 属性设置为正在分配的新值一样表现。

否则

什么都不做。


document . body [ = value ]

返回 body 元素

被设置时替换 body 元素

如果新值不是一个 bodyframeset 元素,这将会抛出一个 "HierarchyRequestError" DOMException

文档的 body 元素html 元素 的第一个是 body 元素或 frameset 元素的子节点,没有的话就是 null。

读取 body 属性时,必须返回 文档的 body 元素(是一个 bodyframeset 元素,或者是 null)。 当设置时,必须执行以下算法:

  1. 如果新值不是一个 bodyframeset 元素则抛出一个 "HierarchyRequestError" DOMException 并中止这些步骤。
  2. 否则,如果新值与 body 元素 相同,什么都不做并中止这些步骤。
  3. 否则, 如果 body 元素 不是 null,就在 body 元素 的父元素中,把 body 元素 替换 为新值并中止这些步骤。
  4. 否则, 如果不存在 文档元素,就抛出一个 "HierarchyRequestError" DOMException 并中止这些步骤.
  5. 否则, body 元素 是 null, 但有一个 文档元素,就把新值 追加文档元素 上。

document . images

返回一个 Document 中的 img 元素的 HTMLCollection

document . embeds
document . plugins

返回一个 Document 中的 embed 元素的 HTMLCollection

document . links

返回一个 Document 中的有 href 属性的 aarea 元素的 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 元素, 以及有 href 属性的 area 元素。

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

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


collection = document . getElementsByName(name)

返回一个 Document 中的 name 属性值为 nameNodeList

getElementsByName(name) 方法接受一个字符串 name,必须返回一个 活的 NodeList, 包含该文档中 name 属性的值(大小写敏感地 地)等于 name 参数 的所有 HTML 元素,按照 树序 排列。 在 Document 对象上再次使用同样的参数调用该方法时,用户代理可以返回之前调用时返回的对象。 其他情况必须返回一个新的 NodeList 对象。


document . currentScript

返回正在执行的 script 元素或 SVG script 元素, 只要该元素表示一个 经典的脚本。 对于再次进入的脚本,返回还没结束执行的脚本中最近开始执行的那个。

如果 Document 当前没有在执行 scriptSVG script (例如,因为运行的脚本是一个事件处理器或定时器),如果当前执行的 scriptSVG script 元素表示一个 module script 则返回 null。

读取 currentScript 属性时,必须返回最近设置的值。 创建 Document 时,currentScript 必须初始化为 null。

Support: document-currentscriptChrome for Android 67+Chrome 29+iOS Safari 8+UC Browser for Android 11.8+Firefox 4+IE NoneOpera Mini NoneSafari 8+Edge 12+Samsung Internet 4+Android Browser 4.4+Opera 16+

Source: caniuse.com

实现和标准社区已经不再青睐这一 API 因为它会全局暴露 scriptSVG script 元素。 因此它在新的环境中不再可用,比如执行 module scripts 时, 或者在 shadow tree 执行中执行脚本时。我们正在寻求一种解决方案, 在这些环境中识别正在执行的脚本,同时又不让它全局可用。参见 Issue:#1013


Document 接口 支持命名属性。 任何时候 Document 对象 document 支持的属性名 包括 (根据贡献的元素按照树序 排列,忽略后续重复项, 对同一元素从 id 属性来的值排在从 name 属性来的值前面):

为了 确定 Document 的命名属性 name 的值,用户代理返回必须执行以下算法得到的值:

  1. elements在文档树中 rootdocument, 且名为 name命名元素 列表。

    按照定义,至少会有一个这样的元素。

  2. 如果 elements 只有一个元素且该元素为 iframe 元素, 且该 iframe 元素的 嵌套浏览环境 不是 null, 则返回该元素的 嵌套浏览环境WindowProxy 对象。

  3. 否则,如果 elements 只有一个元素,返回该元素。

  4. 否则返回一个根为 Document 节点的 HTMLCollection, 其过滤器只匹配名为 name命名元素

上述算法中名为 name命名元素 包括:

如果 embedobject 元素没有 暴露的 object 祖先, 而且对于 object 元素没有显示它的 后备内容 或没有 objectembed 后代,就说它是 暴露的


Document 接口上的 dir 属性 与 dir 内容属性定义在一起。

3.2 元素

3.2.1 语义

HTML 中的元素、属性和属性值(由本规范)定义有确定的含义(语义)。 例如,ol 元素表示一个有序列表, lang 属性表示内容的语言。

这些定义允许诸如 Web 浏览器或搜索引擎的 HTML 处理器可能在作者不曾考虑过的 各种上下文中呈现和使用文档或应用。

作为一个简单的例子,考虑一个由只考虑了桌面电脑 Web 浏览器的作者编写的 Web 页面:

<!DOCTYPE HTML>
<html lang="en">
 <head>
  <title>My Page</title>
 </head>
 <body>
  <h1>Welcome to my page</h1>
  <p>I like cars and lorries and have a big Jeep!</p>
  <h2>Where I live</h2>
  <p>I live in a small hut on a mountain!</p>
 </body>
</html>

因为 HTML 表达了 含义,而不是呈现,同样的页面也可以用于移动电话的小浏览器而不需要改动页面。 比如在桌面浏览器中标题使用大号字体,但在移动浏览器中可能整页使用同样大小的字体,但标题使用粗体。

这不仅仅是屏幕尺寸的差异:同一页面可以通过基于语音合成的浏览器同样地被盲人使用, 这时就不是在屏幕上显示页面,而是将页面朗读给用户,比如使用耳机。 标题可能不再是大号的文本,语音浏览器可能会对它使用不同的音量或较慢的声音。

带来的好处不止于此。由于浏览器知道页面的哪些部分是标题,它们可以创建文档大纲来使得用户可以快速浏览文档, 使用“跳转到下一个标题”或“跳转到上一个标题”的快捷键。 这些功能在语音浏览器中尤其常见,不然用户可能很难快速浏览页面。

甚至除浏览器之外的软件也可以利用这些信息。 搜索引擎可以使用标题更有效地对页面进行索引,或者从结果中提供到页面子部分的快速链接。 而工具可以使用标题来创建一个目录(实际上这个规范的目录就是这样生成的)。

这个例子集中在标题上,但是相同的原则也适用于 HTML 中的所有语义。

作者不得将元素,属性或属性值用于适当的语义目的之外的其他意图,因为这样做会使软件无法正确处理页面。

例如,以下代表公司网站标题的代码片段是不合规范的, 因为第二行不是子部分的标题,而是副标题(同一部分的下级标题)。

<body>
 <h1>ACME Corporation</h1>
 <h2>The leaders in arbitrary fast delivery since 1920</h2>
 ...

hgroup 元素适用于这些情况:

<body>
 <hgroup>
  <h1>ACME Corporation</h1>
  <h2>The leaders in arbitrary fast delivery since 1920</h2>
 </hgroup>
 ...

下一个例子中的文档类似,也不合规范。尽管语法是正确的, 因为放在单元格中的数据显然不是表格数据,而且误用了 cite 元素:

<!DOCTYPE HTML>
<html lang="en-GB">
 <head> <title> Demonstration </title> </head>
 <body>
  <table>
   <tr> <td> My favourite animal is the cat. </td> </tr>
   <tr>
    <td>
     —<a href="https://example.org/~ernest/"><cite>Ernest</cite></a>,
     in an essay from 1992
    </td>
   </tr>
  </table>
 </body>
</html>

这将使得依赖于这些语义的软件出错: 例如支持盲人浏览文档中的表格的语音浏览器将把上述引用误报为表格,这会使用户困惑; 同样地,从网页中提取作品标题的工具也会将“Ernest”提取为作品的标题,即使它实际上是一个人名而不是标题。

这个文档的更正版本可能是:

<!DOCTYPE HTML>
<html lang="en-GB">
 <head> <title> Demonstration </title> </head>
 <body>
  <blockquote>
   <p> My favourite animal is the cat. </p>
  </blockquote>
  <p>
   —<a href="https://example.org/~ernest/">Ernest</a>,
   in an essay from 1992
  </p>
 </body>
</html>

作者不得使用本规范或 其他适用规范 不允许的元素,属性或属性值,因为这样做会使以后的语言扩展变得更加困难。

下一个示例中有一个不符合规范的属性值(“carpet”)和不符合规范的属性(“texture”),这是本规范不允许的:

<label>Carpet: <input type="carpet" name="c" texture="deep pile"></label>

以下是标记这一内容的正确的替代方式:

<label>Carpet: <input type="text" class="carpet" name="c" data-texture="deep pile"></label>

节点文档 不具有 浏览环境 的 DOM 节点 不受 HTML 语法 要求和 XML 语法 要求之外的所有文档一致性要求的限制。

特别地,template 元素的 模板内容节点文档 没有浏览上下文。 例如,内容模型 要求 和属性值微语法要求不适用于 template 元素的 模板内容。 在此示例中,img 元素的属性值是占位符,如果在 template 元素外就是无效的。

<template>
 <article>
  <img src="{{src}}" alt="{{alt}}">
  <h1></h1>
 </article>
</template>

但是,如果上述标记省略了 </h1> 结束标记,将会违反 HTML 语法,会被符合性检查器标记为错误。

通过脚本和使用其他机制,在用户代理处理文档时,属性值,文本以及文档的整体结构都可能会动态变化。 某一时刻文档的语义由这一时刻的文档的状态来表示,因此文档的语义会随时间变化。 当这种情况发生时,用户代理 must 更新文档的显示。

HTML 有一个表示进度条的 progress 元素。 如果其 “value” 属性由脚本动态地更新,那么 UA 将更新呈现以显示进度变化。

3.2.2 DOM 中的元素

在 DOM 中表示 HTML 元素 的节点 必须 实现本规范相关章节中的对应接口,并暴露给脚本。这包括 XML 文档 中的 HTML 元素, 即使那些文档在另外的上下文中(比如在一个 XSLT 转换中)。

DOM 中的元素 表示着 事物; 也就是说它们具有内在的 意义,也被称为语义。

例如一个 ol 元素表示一个有序列表。

元素可以被显式地或者隐式地 引用。 一种显式地引用 DOM 中元素的方式是给该元素一个 id 属性, 然后创建一个 超链接, 用那个 id 属性值作为该 超链接href 属性值的 片段。其实引用不需要超链接的存在,任何其他引用元素的方式都是足够的。

考虑下面的 figure 元素,给了它一个 id 属性:

<figure id="module-script-graph">
  <img src="module-script-graph.svg"
       alt="Module A depends on module B, which depends
            on modules C and D.">
  <figcaption>Figure 27: a simple module graph</figcaption>
</figure>

可以用 a 元素创建基于 超链接引用,像这样:

As we can see in <a href="#module-script-graph">figure 27</a>, ...

但是也有很多其他 引用 figure 元素的方式,比如:

所有 HTML 元素 的接口都继承自一个基本接口,没有额外要求的元素必须使用这一接口。这就是 HTMLElement 接口。

[Exposed=Window,
 HTMLConstructor]
interface HTMLElement : Element {
  // 元数据属性
  [CEReactions] attribute DOMString title;
  [CEReactions] attribute DOMString lang;
  [CEReactions] attribute boolean translate;
  [CEReactions] attribute DOMString dir;
  [SameObject] readonly attribute DOMStringMap dataset;

  // 用户交互
  [CEReactions] attribute boolean hidden;
  void click();
  [CEReactions] attribute long tabIndex;
  void focus(optional FocusOptions options);
  void blur();
  [CEReactions] attribute DOMString accessKey;
  readonly attribute DOMString accessKeyLabel;
  [CEReactions] attribute boolean draggable;
  [CEReactions] attribute boolean spellcheck;
  [CEReactions] attribute DOMString autocapitalize;

  [CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;
};

HTMLElement includes GlobalEventHandlers;
HTMLElement includes DocumentAndElementEventHandlers;
HTMLElement includes ElementContentEditable;

// 注意:有意 不是 [HTMLConstructor]
[Exposed=Window]
interface HTMLUnknownElement : HTMLElement { };

HTMLElement 接口保存着很多不同功能的方法和属性,因此该接口的成员在本规范的不同部分中描述。


HTML 命名空间 中名为 name 的元素的 元素接口 这样决定:

  1. 如果 nameappletbgsoundblinkisindexkeygenmulticolnextid, 或 spacer, 则返回 HTMLUnknownElement

  2. 如果 nameacronymbasefontbigcenternobrnoembednoframesplaintextrbrtcstrike,或 tt,则返回 HTMLElement

  3. 如果 namelistingxmp,则返回 HTMLPreElement

  4. 否则,如果本规范定义了一个 local name name 对应的 元素类型 的接口,则返回那个接口。

  5. 如果 其他适用规范name 定义了一个合适的接口, 则返回他们定义的接口。

  6. 如果 name 是一个 合法的 Custom Element 名字, 则返回HTMLElement

  7. 返回 HTMLUnknownElement

合法的 Custom Element 名 时, 使用 HTMLElement 而不是 HTMLUnknownElement 是为了确保任何将来可能的 升级 只造成元素原型链的线性转变, 从 HTMLElement 到一个子类,而不是后者从 HTMLUnknownElement 到一个不相关的子类。

HTML 和 SVG 元素共同的特性使用 HTMLOrSVGElement 接口 mixin: [SVG]

interface mixin HTMLOrSVGElement {
  [SameObject] readonly attribute DOMStringMap dataset;
  attribute DOMString nonce;

  [CEReactions] attribute long tabIndex;
  void focus(optional FocusOptions options);
  void blur();
};
HTMLElement includes HTMLOrSVGElement;
SVGElement includes HTMLOrSVGElement;

3.2.3 HTML 元素构造器

为支持 Custom Element 特性, 所有 HTML 元素都有特定的构造器行为。该行为 [HTMLConstructor] IDL 扩展属性 表示。 它指示着给定接口的接口对象将在调用时具有特定的行为,如下所述:

[HTMLConstructor] 扩展属性必须接受无参数, 不得出现在非接口的对象上。它在接口上必须只出现一次,且该接口不得以 [Constructor][NoInterfaceObject] 扩展属性标注。(但是该接口可以用 [NamedConstructor] 标注,这里没有冲突。)它不得作为回调接口使用。

[HTMLConstructor] 扩展属性标注的接口的 接口对象 必须作为相应 JavaScript 函数对象的 [[Call]] 和 [[Construct]] 调用的函数体行为运行以下步骤。从 [[Call]] 调用时,NewTarget 值未定义,因此下面的算法将立即抛出异常。 从 [[Construct]] 调用时,[[Construct]] 的 newTarget 参数提供了 NewTarget 值。

  1. registry当前全局对象CustomElementRegistry 对象。

  2. 如果 NewTarget 等于 活动的函数对象,则抛出一个 TypeError 并中止这些步骤。

    这在使用 元素接口 作为构造器定义 Custom Element 时可能发生:

    customElements.define("bad-1",HTMLButtonElement);
    new HTMLButtonElement();          // (1)
    document.createElement("bad-1");  // (2)

    在这种情形下,HTMLButtonElement(可能是显式地,比如 1,也可能是隐式地,比如 2)的执行期间, 活动的函数对象 和 NewTarget 都是 HTMLButtonElement。 如果没有这项检查,就可能会创建一个 local name 是 bad-1HTMLButtonElement 实例。

  3. definitionregistryconstructor 等于 NewTarget 的条目。 如果没有这样一个定义,则抛出一个 TypeError 并中止这些步骤。

    由于 registry 中没有 constructor 是 undefined 的条目, 这一步可以防止 HTML 元素构造器作为函数被调用(在该情况下 NewTarget 将是 undefined)。

  4. 如果 definitionlocal name 等于 definitionname (即 definition 是一个 自主的 Custom Element),则:

    1. 如果 活动的函数对象 不是 HTMLElement,则抛出一个 TypeError 并中止这些步骤。

      当 Custom Element 定义时没有扩展任何 local name 但继承了非 HTMLElement 类时就会发生这种情况:

      customElements.define("bad-2",class Bad2 extends HTMLParagraphElement {});

      这种情形下,在(隐含地)在创建 Bad2 实例的 super() 调用期间, 活动的函数对象HTMLParagraphElement 而不是 HTMLElement

  5. 否则(如果 definition 是一个 定制的内建元素):

    1. valid local name 为本规范 或 其他适用规范 中定义的 使用 活动的函数对象 作为 元素接口 的元素的 local name 列表。

    2. 如果 valid local names 不包含 definitionlocal name,则抛出一个 TypeError 并中止这些步骤。

      这在定义扩展了给定 local name 但继承了错误的类的 Custom Element 时会发生:

      customElements.define("bad-3",class Bad3 extends HTMLQuoteElement {},{ extends: "p" });

      这种情形下,在(隐含地)在创建 Bad3 实例的 super() 调用期间, valid local names 列表包含 qblockquote,但 definitionlocal namep,不在这个列表中。

  6. prototypeGet(NewTarget,"prototype")。 重新抛出任何异常。

  7. 如果 Type(prototype) 不是 Object,则:

    1. realmGetFunctionRealm(NewTarget)。

    2. 设置 prototyperealm 中 接口与 活动函数对象 的接口相同的 的 接口原型对象

    活动函数对象 的 realm 可能不是 realm,所以我们用更通用的概念 "Realms 中同样的接口" 而不寻找 相等的 接口对象。设计这个退化行为是为了匹配 JavaScript 内建对象的类似行为, 包括使用 NewTarget 的 Realm 以及在那里查找合适的原型。

  8. 如果 definition构造栈 为空,则:

    1. element 为实现了 活动函数对象 对应接口的新元素, 没有属性,命名空间设为 HTML 命名空间,local name 设为 definitionlocal name节点文档 设为 当前全局对象关联 Document

    2. 执行 element.[[SetPrototypeOf]](prototype)。重新抛出任何异常。

    3. 设置 elementCustom Element 状态 为 "custom"。

    4. 设置 elementCustom Element 定义definition

    5. 返回 element

    当作者脚本直接构建了一个新的 Custom Element 时(例如通过 new MyCustomElement()),就会发生这种情况。

  9. elementdefinition构造栈 中的最后一个条目。

  10. 如果 element 是一个 已经构造 标记, 则抛出一个 "InvalidStateError" DOMException 并中止这些步骤。

    Custom Element 构造器 中的作者代码 在调用 super() 之前 不合规范地 创建了 正在创建的类的另一个实例时,就会发生这种情况:

    let doSillyThing = false;
    
    class DontDoThis extends HTMLElement {
      constructor() {
        if (doSillyThing) {
          doSillyThing = false;
          new DontDoThis();
          // 现在构造栈将会包含一个 已经构造 标记。
        }
    
        // 这将会失败并抛出 "InvalidStateError" DOMException:
        super();
      }
    }

    Custom Element 构造器 中的作者代码 不合规范地 调用两次 super() 时也会发生。 因为根据 JavaScript 规范,这确实会在抛出异常前执行两次父类构造器(即当前这个算法):

    class DontDoThisEither extends HTMLElement {
      constructor() {
        super();
    
        // 这将会抛出异常,但这时已经调用进入了 HTMLElement 构造器
        super();
      }
    }
  11. 执行 element.[[SetPrototypeOf]](prototype)。重新抛出任何异常。

  12. definition构造栈 中的最后一个条目替换为一个 已经构造 标记

  13. 返回 element

    升级 Custom Element 时就会自然地进入这一步, 返回现有元素,以便 Custom Element 构造器 中的 super() 调用将该现有元素赋值给 this


除了 [HTMLConstructor] 隐含的构造器行为之外, 有些元素还有 命名的构造器(其实是改过 prototype 属性的工厂函数)。

当定义 Custom Element 构造器 时, HTML 元素的命名构造器也可以用于 extends 子句中:

class AutoEmbiggenedImage extends Image {
  constructor(width,height) {
    super(width * 10,height * 10);
  }
}

customElements.define("auto-embiggened",AutoEmbiggenedImage,{ extends: "img" });

const image = new AutoEmbiggenedImage(15,20);
console.assert(image.width === 150);
console.assert(image.height === 200);

3.2.4 元素定义

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

类别

该元素所属的 类别 列表。 在为每个元素定义 内容模型 时用到。

可以使用该元素的上下文

该元素可以在哪里使用的 非规范化的 描述。 该信息与允许该元素为子元素的元素内容模型之间存在冗余,只是为了方便而提供。

为了简单起见,只列出最具体的期望值。 例如,既是 流内容 又是 短语内容 的元素 可以用于任何期望出现 流内容短语内容 的地方, 但是因为任何期望出现 流内容 的地方也期望出现 短语内容(因为所有 短语内容 都是 流内容), 将只列出 "期望出现 短语内容 的地方"。

内容模型

必须包含哪些内容作为子元素和后代元素的规范性描述。

text/html 中的标签省略

非规范性的 描述:在 text/html 语法中, 是否可以忽略 开始结束 标签。 该信息与 可选标签 部分给出的规范性要求之间存在冗余, 在元素定义中提供只是为了方便。

内容属性

可以在该元素上指定的(除了不允许的情况)一个规范性的属性列表, 以及对这些属性的非规范性的描述。(破折号左侧是规范性的,右侧是非规范性的。)

DOM 接口

一个关于这样的元素必须实现的 DOM 接口的规范性的定义。

之后是更多的描述:元素所 代表 的内容, 以及可能适用于作者 和实现 的任何其他规范性的一致性标准,有时也包括实例。

3.2.4.1 属性

一个属性值是一个字符串。 除非另有说明,HTML 元素 上的属性值可以是任何字符串值, 包括空字符串,而且对这些属性值中可以指定的文本没有任何限制。

3.2.5 内容模型

本标准中定义的每个元素都有内容模型:描述了元素期望的 内容HTML 元素 的内容必须匹配元素内容模型的要求。 元素的 内容 是它在 DOM 中的子节点。

元素之间总是允许 ASCII 空白。用户代理将源码标记中元素之间的字符表示为 DOM 中的 Text 节点。 空的 Text 节点和 只包含那些字符序列的 Text 节点都被认为是 元素间空白

当决定元素内容是否匹配元素内容模型的要求时必须忽略 元素间空白, 注释节点,以及处理指令节点。 在执行定义文档和元素语义的算法时也必须忽略这些节点。

因此,元素 A 与元素 B 相邻 是指 AB 有相同的父节点且它们之间没有元素节点或 Text 节点 (元素间空白 除外)。 类似地,元素的 唯一子节点 是指其父元素只包含 元素箭空白, 注释节点,以及处理指令节点。

作者不得随意使用 HTML 元素,除非明确允许(每个元素都有定义), 或其他规范有明确要求。对于 XML 复合文档,如果这些元素定义为提供相关上下文,那么这些上下文可以位于其他命名空间的元素之内。

例如 Atom 规范定义了一个 content 元素。当它的 type 属性值为 xhtml 时,Atom 规范要求它包含单个 HTML div 元素。因此该上下文中允许出现一个a div 元素,虽然本规范没有明确地声明这一点。[ATOM]

此外,HTML 元素 可能是孤立节点(即没有父节点)。

例如创建一个 td 元素并把它存储为脚本中的全局变量是符合规范的,即使 td 元素只期望用于 tr 元素中。

var data = {
  name: "Banana",
  cell: document.createElement('td'),
};
3.2.5.1 "nothing" 内容模型

当元素的内容模型是 nothing 时, 该元素不得包含 Text 节点(元素间空白 除外) 和元素节点。

方便起见,多数内容模型为 “nothing” 的 HTML 元素同时也是 void 元素HTML 语法 中没有 结束标签 的元素)。 但是,这些是完全独立的概念。

3.2.5.2 内容的种类

HTML 中的每个元素都属于一个或多个 类别 一个类别中的元素有着相似的特点。本规范使用以下几个大类:

有些元素属于其他类别,这些类别定义在本规范的其他部分。

这些类别之间的关系如下:

章节内容,标题内容,短语内容,嵌入内容和交互式内容都是流式内容。元数据有时也是流式内容。 元数据和交互式内容有时是短语内容。嵌入内容也是短语内容,有时也是交互式内容。

有时为了特定意图也会使用其他的类别,比如为了定义通用要求,为表单控件指定了多种类别。 有些元素有独特的要求,不属于任何特定类别。

3.2.5.2.1 元数据内容

元数据内容 是设置其余内容的呈现或行为, 设置文档与其他文档的关系,传达其他“带外”信息的内容。

其语义主要与元数据相关的其他命名空间的元素(比如 RDF) 也是 元数据内容

因此在 XML 序列化中,可以像这样使用 RDF:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:r="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xml:lang="en">
 <head>
  <title>Hedral's Home Page</title>
  <r:RDF>
   <Person xmlns="http://www.w3.org/2000/10/swap/pim/contact#"
           r:about="https://hedral.example.com/#">
    <fullName>Cat Hedral</fullName>
    <mailbox r:resource="mailto:hedral@damowmow.com"/>
    <personalTitle>Sir</personalTitle>
   </Person>
  </r:RDF>
 </head>
 <body>
  <h1>My home page</h1>
  <p>I like playing with string, I guess. Sister says squirrels are fun
  too so sometimes I follow her to play with them.</p>
 </body>
</html>

然而,这在 HTML 序列化中是不可能的。

3.2.5.2.2 流式内容

多数文档和应用的 body 中的元素都归类为 流式内容

3.2.5.2.3 章节内容

章节内容 是定义了 标题页脚 范围的内容。

每个 章节内容 元素可能具有标题和 大纲。 有关详细信息请参阅 标题和章节

有些元素属于 章节根元素。 它们与 章节内容 不同,但也可以有 大纲

3.2.5.2.4 标题内容

标题内容 定义了章节的标题 (可以显式地用 章节内容 元素标记, 也可以隐式地用标题内容自己来标记)。

3.2.5.2.5 短语内容

短语内容 是文档中的文本, 以及标记该文本的段内级别的元素。 多个 短语内容 形成 段落

Spec bugs: 25493

多数短语内容元素只能包含短语内容元素,而不是任何流式内容元素。

内容模型中的 文本内容 意味着什么都没有, 或者有 Text 节点。有时 文本内容 自身就是 一种内容模型,但它也是 短语内容, 也可以是 元素间空白 (如果 Text 节点为空或者只包含 ASCII 空白)。

Text 节点和属性值必须由 标量值 组成,不包含 非字符, 以及除 ASCII 空白 之外的 控制字符。 本规范对 Text 节点的值和属性的值,基于其确切的上下文会有额外的约束。

3.2.5.2.6 嵌入内容

嵌入内容 是指 引入其他资源的内容,或插入到文档的其他词汇表的内容。

来自除 HTML 命名空间 之外的,表达内容而不是元数据的元素, 是 嵌入内容,用于本规范定义的内容模型 (例如 MathML 或 SVG。)

有些嵌入内容元素可以包含 fallback 内容: 在不能使用外部资源时使用的内容(例如,因为它是不受支持的格式)。 如果有 fallback 内容的话,元素定义会加以说明。

3.2.5.2.7 交互式内容

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

tabindex 属性也可以让任何元素变成 交互式内容

3.2.5.2.8 可感知内容

作为一般规则,其内容模型允许任何 流式内容短语内容 的元素应在其 内容 中至少包含一个 可感知内容 的节点,并且它没有指定 hidden 属性。

可感知内容 通过提供一些非空的后代 文本, 可以听到(audio 元素)或看到(videoimgcanvas 元素), 或可以与之交互的内容(例如可交互的表单控件)来让一个元素变得非空。

但这个要求并不是一个硬性要求,因为有许多情况下空元素是合理的,比如当它被用作一个占位符之后用脚本填充, 或者对于模板元素,大多数页面都会填充,只有某些页面表现为空白,这也无关紧要。

推荐一致性检查工具为作者提供工具,来定位不遵守该要求的元素,帮助作者的代码编写。

下列元素是可感知内容:

3.2.5.2.9 脚本支持元素

脚本支持元素 是指那些本身不 表示 任何东西(即它们不被渲染),但是被用于支持脚本, 为用户提供功能。

下列元素是脚本支持元素:

3.2.5.3 透明内容模型

有些元素被描述为 透明的;它们的内容模型描述中有 "透明" 一词。 透明 元素的内容模型从其父元素的内容模型派生: “透明”的内容模型中某一部分所要求的元素与父元素的内容模型中对应部分所要求的元素相同。

例如,ruby 元素中的 ins 元素不可包含 rt 元素, 因为 ruby 元素的内容模型中允许 ins 元素的部分就是允许 短语内容 的那一部分, rt 元素不是 短语内容

在有些情况下,透明元素互相嵌套时,必须迭代地应用这个过程。

考虑下面的标记片段:

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

为了检查 a 元素中是否允许 "Apples",要检查内容模型。 a 元素的内容模型是透明的,map 元素也是, ins 元素也是,object 元素中 ins 元素所在的部分也是。 object 元素位于 p 元素中,后者的内容模型是 短语内容。 因此 "Apples" 是允许的,因为文本是短语内容。

当透明元素秘佑父元素时,它的内容模型中透明的那一部分必须被当做可以接受任何 流式内容

3.2.5.4 段落

本小节定义的术语 段落 的用途不止是 p 元素的定义。这里定义的 段落 概念用于描述如何解释文档。 p 元素仅仅是标记 段落 的一种方式。

一个 段落 通常是由一系列 短语内容 形成的一个文本块, 在排版中可能包含一个或多个句子,讨论一个特定的主题(也可以用于更一般的专题分组)。 例如,一个地址也可以是一个段落,可以是表单的一部分,一行署名,或者一首诗中的一节。

下面的例子中,一个章节中有两段话。还有一个标题,它包含的短语内容不构成段落。 注意注释和 元素间空白 也不构成段落。

<section>
  <h1>Example of paragraphs</h1>
  This is the <em>first</em> paragraph in this example.
  <p>This is the second.</p>
  <!-- This is not a paragraph. -->
</section>

流式内容 中的段落相对于文档的样子来定义,与 ainsdel,和 map 元素造成的复杂情况无关。 因为那些元素的混合内容模型使它们可以跨越段落边界,就像下面两个例子那样。

通常来讲,最好避免让元素跨越段落边界。这样的标记很难维护。

下面的例子取自前一个例子中的标记,在某些标记处加入了 insdel 元素, 用来展示文本的变更(尽管这种情况下,这一变更确实没啥意义)。注意这个例子中的段落与上一个例子完全相同, 尽管插入了 insdel 元素 — ins 元素跨越了标题和第一个段落, del 元素跨越了两个段落的边界。

<section>
  <ins><h1>Example of paragraphs</h1>
  This is the <em>first</em> paragraph in</ins> this example<del>.
  <p>This is the second.</p></del>
  <!-- This is not a paragraph. -->
</section>

view 为 DOM 的一个视图,将文档中所有的 a, ins, del, 和 map 元素替换为它们的 内容。然后对 view 中除了接受 短语内容 还接受非 短语内容 的元素中的每一个没有被其他类型内容打断的 短语内容 节点序列, 令 first 为序列中第一个节点,令 last 为序列中最后一个节点。 对每一个上述序列中,包含至少一个非 嵌入内容元素间空白 节点的序列,在原始 DOM 中从 first 前面到 last 后面形成了一个段落。(因此段落可以横跨 a, ins, del, 和 map 元素。)

一致性检查器可以在段落相互重叠时警告作者( 在 object, video, audio, 和 canvas 元素中有可能发生这种情况, 允许再次嵌入 HTML 的其他命名空间的元素也可能间接地发生这种情况,比如 SVG svgMathML math)。

p 元素也显式地生成了 段落

p 元素可以用于包裹普通的短语内容来形成相互独立的段落。

在下面的例子中,链接横跨了半个第一个段落,分离两个段落的标题,以及半个第二个段落。它同时横跨了段落和标题。

<header>
 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.
</header>

这是上述标记的另一种写法,这次显式地声明了段落,将一个链接分割成三部分:

<header>
 <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>
</header>

当使用某些元素来定义 fallback 内容时,段落可以重叠。例如下面的章节:

<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="https://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>

共有5个段落:

  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."。

第一个段落与后面4个重叠。支持 "cats.sim" 资源的用户代理只会显示第一个段落,但显示 fallback 的用户代理就会 将第一个段落的第一句话与第二段显示为一个段落,最后一个段落会显示在第一个段落的第二个句子之前。

为避免困惑,可以显式地使用 p 元素。例如:

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

3.2.6 全局属性

下列属性是通用的,所有 HTML 元素 都可以指定。 (即使是本规范中没有定义的那些元素):

本规范定义的这些属性只用于 HTML 元素 的属性。 当本规范引用具有这些属性的元素时, 没有定义这些属性的命名空间下的元素不得当作具有这些属性的元素处理。

例如,在下面的 XML 片段中,根据本标准的定义 "bogus" 元素没有 dir 属性,尽管它字面上有一个名为 "dir" 的属性。因此,最里面的 span 元素的 方向 是 'rtl', 通过 "bogus" 元素间接地继承自 div 元素。

<div xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
 <bogus xmlns="https://example.net/ns" dir="ltr">
  <span xmlns="http://www.w3.org/1999/xhtml">
  </span>
 </bogus>
</div>

WHATWG DOM 标准为任何命名空间下的任何元素的 classid,和 slot 属性定义了用户代理的要求。[DOM]

classid,和 slot 属性可以在任何 HTML 元素 上指定。

HTML 元素 上指定了 class 属性时,该属性的值必须是 一组空格分隔的令牌, 表示该元素所属的各种类。

设置元素的类会影响 CSS 选择符的匹配,DOM 的 getElementsByClassName() 方法, 以及其他这类特性。

作者在 class 属性中可以使用的令牌没有额外的限制, 但鼓励作者使用描述内容本质的取值,而不是描述内容表示的取值。

HTML 元素 上指定了 id 属性时, 该属性的值必须在该元素所在的 的所有 IDs 中是唯一的, 必须至少包含一个字符,且不得包含任何 ASCII 空白

id 属性指定了该元素的 唯一标识符(ID)

对 ID 的形式没有其他限制;ID 甚至可以只包含数字,以数字起始,以下划线起始,或者只包含标点等等。

元素的 唯一标识符 有很多用途, 最值得一提的是通过 URL 片段 链接到文档的特定部分, 在脚本中指向元素的一种方式,以及从 CSS 中指定特定元素的样式。

标识符是不透明的字符串。不得通过 id 属性的值来推断特定的含义。

HTML 元素slot 属性没有符合性要求。

slot 属性用于为元素 设置一个槽:具有 slot 属性的元素会被 指定到 name 属性值匹配该 slot 属性值的 slot 元素创建的 slot 中。 — 但条件是 slot 元素所在的 shadow treeroothost 有相应的 slot 属性值。


为了使辅助技术产品提供相比于 HTML 元素和属性更加细粒度的界面,有一组 用于辅助技术产品的注解 可以指定 (ARIA rolearia-* 属性)。[ARIA]


下面的 事件处理器内容属性 可以在任何 HTML 元素 上指定:

用星号标记的属性在用于 body 元素时有不同的含义, 因为该元素暴露了 Window 对象上同名的 事件处理器

虽然这些属性适用于所有元素,但并不是对所有元素都有用。 例如,只有 媒体元素 才会接收到用户代理触发的 音量变化 事件。


任何 HTML 元素 都可以指定 自定义数据属性 (例如 data-foldernamedata-msgid), 用于存储页面相关的自定义数据,状态,注解这样的东西。


HTML 文档 中,HTML 命名空间 中的元素可以指定一个 xmlns 属性,但它的值只能是 "http://www.w3.org/1999/xhtml" 。这不适用于 XML 文档

在 HTML 中,xmlns 属性完全没有效果,它只是一个标志。 它的存在只是为了方便 XML 与 HTML 之间的迁移。 被 HTML 解析器 解析时,该属性的结果是没有命名空间, 而不是像 XML 中的命名空间声明那样,解析为 "http://www.w3.org/2000/xmlns/" 命名空间。

在 XML 中,xmlns 属性是命名空间机制的一部分, 没有指定命名空间时,元素不能有 xmlns 属性。


XML 文档 中的任何元素上,XML 规范也遵循 XML 命名空间 中的 xml:space 属性的使用。 该属性在 HTML 元素 上没有作用,因为 HTML 的默认行为就是保留空白。 [XML]

text/html 语法中,无法序列化 HTML 元素xml:space 属性。

3.2.6.1 title 属性

title 属性 表示 元素的建议信息,比如适用于工具提示。 在链接上,这可能是目标资源的标题或描述;在图片上,它可以是图片来源或图片的描述; 在段落上,它可能是文本的脚注或评论;在引用上,可以是来源的进一步信息; 在 交互式内容 上,它可能是元素的标签或使用说明; 等等。值为文本。

目前不鼓励依赖于 title 属性, 因为许多用户代理不按照本规范中要求的可访问的方式来暴露该属性 (例如,要求像鼠标这样的定点设备来触发工具提示,这排除了纯键盘用户和触摸设备用户,比如手机或平板电脑的用户)。

如果从元素中省略此属性,则默认关联到离该元素最近的设置了 title 属性的 祖先 HTML 元素。 设置该属性可以覆盖这一行为,显式地声明了任何祖先的建议信息与此元素无关。 将属性设置为空字符串表示该元素没有建议信息。

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

title 属性中使用换行要多加小心。

比如下面的代码片段其实定义了一个缩写的解释,其中包含一个换行

<p>My logs show that there was some interest in <abbr title="Hypertext
Transport Protocol">HTTP</abbr> today.</p>

有些元素比如 linkabbr,和 inputtitle 属性定义了额外的语义。

元素的 建议信息 是下面算法的返回值, 只要有值返回算法就中止。当该算法返回空字符串时,没有任何建议信息。

  1. 如果该元素是一个 linkstyledfn,或 abbr 元素,那么:如果该元素有 title 属性, 返回该属性的值,否则返回空字符串。

  2. 否则,如果该元素有一个 title 属性则返回它的值。

  3. 否则,如果该属性有父元素,则返回父元素的 建议信息

  4. 否则,返回空字符串。

当元素有 建议信息 时, 用户代理应该通知用户,不然就无法发现该信息。


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

3.2.6.2 langxml:lang 属性

lang 属性(没有命名空间)指定了该元素内容, 以及该元素包含文本的属性的主要语言。它的值必须是一个合法的 BCP 47 语言标签, 或者空字符串。将该属性设置为控制付出表示主要语言是未知的。 [BCP47]

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

如果元素省略了这些属性,该元素的语言就是其父元素的语言(如果有的话)。

没有命名空间的 lang 属性可以用于任何 HTML 元素

XML 命名空间 中的 lang 属性 可以用于 XML 文档 中的 HTML 元素, 也可以用户其他命名空间中的元素,只要相关规范允许(特别低, MathML 和 SVG 允许其元素上指定 XML 命名空间 中的lang 属性 )。如果同时在同一个元素上指定了 无命名空间的 lang 属性,和 XML 命名空间 中的 lang 属性, 它们必须有 ASCII 大小写不敏感的 同样的值。

作者不得在 HTML 文档 中的 HTML 元素 上使用 XML 命名空间 中的 lang 属性。 为了便于与 XML 之间迁移,作者可以在 HTML 文档 中的 HTML 元素 上 指定一个没有命名空间的,没有前缀的属性,其 localname 为 "xml:lang", 但指定该属性时必须同时指定一个无命名空间的 lang 属性, 它们必须有 ASCII 大小写不敏感的 同样的值。

没有命名空间没有前缀的 localname 是 "xml:lang" 的属性对语言处理没有任何影响。


确定节点的 language,用户代理必须寻找设置了 XML 命名空间 中的 lang 属性 或无命名空间的 lang 属性的, 最近的祖先元素(包括该元素自身,如果该节点是元素的话)。 该属性指定了节点的语言(不管它的值是什么)。

如果同时在同一个元素上指定了 无命名空间的 lang 属性,和 XML 命名空间 中的 lang 属性, 在确定元素的语言时,用户代理必须使用 XML 命名空间 中的 lang 属性, 必须 忽略 无命名空间的 lang 属性。

如果节点的 包括自身在内的祖先 两个属性都没设置, 但是设置了一个 编译指示的默认语言,那么这就是该节点的语言。 如果没有设置 编译指示的默认语言, 那么必须使用上级协议(比如 HTTP)的语言信息(如果有的话)作为最终的 fallback 语言。 如果没有该语言信息,或者上级协议报告了多种语言,该节点的语言就是未知的,对应的语言标签是空字符串。

如果结果值不是可识别的的语言标签,那么它必须被视为具有给定语言标签的未知语言,区别于所有其他语言。 为了与预期该语言标签的其他服务进行往返或通信,用户代理应通过未修改的方式传递未知语言标签, 并将其标记为 BCP 47 语言标签,以防后续服务将数据解释为另一种语言描述。 [BCP47]

因此,例如具有 lang="xyzzy" 的元素将被选择器 :lang(xyzzy) 匹配(例如在 CSS 中), 但是它不会被 :lang(abcde) 匹配,虽然两者都是无效的。 类似地,如果要 Web 浏览器和屏幕阅读器一致地传达关于元素的语言, 则浏览器将告诉屏幕阅读器该语言是 “xyzzy”,即使它知道这个语言是无效的, 以防屏幕阅读器实际上支持该标签的语言。即使屏幕阅读器支持 BCP 47 和用于编码语言名称的另一语法, 比如在这一语法中字符串 “xyzzy” 表示白俄罗斯语言,那么屏幕阅读器将会 错误地 把文本当做白俄罗斯语言处理, 因为 “xyzzy” 不是 BCP 47 规范中描述的白俄罗斯语言(BCP 47 使用 “be” 表示白俄罗斯语言)。

如果结果值是空字符串,那么必须把它解释为该节点的语言显式地声明为未知。


用户代理可以使用元素的语言来决定适当的处理和渲染(例如选择合适的字体和标点, 选择合适的字典,或者用于表单控件的 UI 比如日期选择器)。


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

3.2.6.3 translate 属性

translate 属性是一个 枚举属性,用于指定元素在本地化时应该翻译其属性值和 Text 子节点的值,还是让它们保持不变。

该属性的关键字是空字符串,yes,和 no。 空字符串和 yes 关键字映射为 yes 状态。 no 关键字映射为 no 状态。 此外还有第三种状态,inherit 状态,这是 缺失值默认 (以及 非法值默认)。

每个元素(甚至非 HTML 元素)都有 翻译模式,处于 启用翻译 状态或者 不翻译 状态。 如果 HTML 元素translate 属性处于 yes 状态,那么该元素的 翻译模式 处于 启用翻译 状态;否则该元素的 translate 属性处于 no 状态,那么该元素的 翻译模式 处于 不翻译 状态。 否则,元素的 translate 属性处于 inherit 状态,或者该元素不是 HTML 元素 因此没有 translate 属性;任何一种情况下该元素的 翻译模式 都将与其父元素处于同样的状态(如果有父元素的话), 否则该元素是一个 文档元素,则处于 启用翻译 状态。

当元素处于 启用翻译 状态时,该元素的 可翻译的属性 及其 Text 子节点的值将会在页面本地化时进行翻译。

当元素处于 不翻译 状态时,该元素的属性值及其 Text 子节点的值将会在页面本地化时保留原样。例如因为该元素包含人名或者计算机程序名。

下面的属性是 可翻译属性

其他规范可能会定义其他 可翻译的属性。例如 ARIA 可能会把 aria-label 属性定义为可翻译的。


在读取时,translate IDL 属性必须返回 true 如果元素的 翻译模式启用翻译; 否则返回 false。当设置时,它必须设置该内容属性的值为 "yes" 如果新值为 true; 否则设置该内容属性的值为 "no"。

在这个例子中,在本地化时文档中的所有东西都会被翻译,除了示例键盘输入和示例程序输出:

<!DOCTYPE HTML>
<html lang=en> <!-- default on the document element is translate=yes -->
 <head>
  <title>The Bee Game</title> <!-- implied translate=yes inherited from ancestors -->
 </head>
 <body>
  <p>The Bee Game is a text adventure game in English.</p>
  <p>When the game launches,the first thing you should do is type
  <kbd translate=no>eat honey</kbd>。 The game will respond with:</p>
  <pre><samp translate=no>Yum yum! That was some good honey!</samp></pre>
 </body>
</html>
3.2.6.4 dir 属性

dir 属性指定了元素的文本方向。 该属性是一个 枚举属性 关键字和状态如下:

ltr 关键字,映射到 ltr 状态

表示该元素的内容是明确的独立方向隔离的从左到右的文本。

rtl 关键字,映射到 rtl 状态

表示该元素的内容是明确的独立方向隔离的从右到左的文本。

auto 关键字,映射到 auto 状态

表示该元素的内容是明确的方向隔离的文本,但其方向需要通过元素的内容以编程方式确定(描述如下)。

这种状态使用的启发式是非常粗糙的(类似于双向算法中的段落级别确定,查看第一个具有较强方向性的字符)。 强烈建议作者只有在文本的方向是未知,并且服务器端没有更好的启发式算法的情况下才使用该值作为最后的手段。 [BIDI]

对于 textareapre 元素,该启发式算法按段落级别生效。

该属性没有 非法值默认缺失值默认


元素(任意元素,不仅是 HTML 元素)的 方向 或者是 'ltr',或者是'rtl', 由下列列表中第一个适用的步骤确定:

如果该元素的 dir 属性处于 ltr 状态
如果该元素是一个 文档元素dir 属性不处于已定义状态(即未出现或具有非法值)
如果该元素是一个 input 元素 type 属性处于 电话 状态, 且 dir 属性不处于已定义状态(即未出现或具有非法值)

元素的 方向 为 'ltr'。

如果该元素的 dir 属性处于 rtl 状态

元素的 方向 为 'rtl'。

如果该元素是 input 元素,且它的 type 属性处于 文本搜索电话URL,或 E-mail 状态, 且 dir 属性处于 auto 状态
如果该元素是 textarea 元素,且它的 dir 属性处于 auto 状态

如果该元素的 value 包含一个双向字符类型 AL 或 R 的字符, 且它之前不包含双向字符类型 L 的字符,则该元素的 方向 为 'rtl'。 [BIDI]

否则,如果该元素的 value 不是空字符串, 或者该元素是一个 文档元素,该元素的 方向 为 'ltr'。

否则,该元素的 方向 与该元素的父元素的 方向 相同。

如果该元素的 dir 属性处于 auto 状态
如果该元素是一个 bdi 元素且 dir 属性不处于已定义状态(即未出现或具有非法值)

找到按照 树序 的第一个匹配下列条件的字符:

如果找到了这样的字符且它属于双向字符类型 AL 或 R,该元素的 方向rtl'。

如果找到了这样的字符且它属于双向字符类型 L,该元素的 方向ltr'。

否则,如果该元素是 文档元素, 该元素的 方向ltr'。

否则,该元素的 方向 与该元素的父元素的 方向 相同。

如果有父元素且 dir 属性处于未定义状态 (即未出现或具有非法值)

该元素的 方向 与该元素的父元素的 方向 相同。

因为只有 HTML 元素 定义有 dir 属性, 它不得出现在其他命名空间的元素上。所以其他命名空间的元素只从它们的父元素继承 方向,如果没有父元素则默认为 'ltr'。

该属性 有涉及双向算法的渲染要求


当该属性的文本用于渲染过程时,HTML 元素 属性的方向 由第一个合适的步骤决定:

如果该属性是一个 有方向的属性 且该元素的 dir 属性处于 auto 状态

找到该属性值中第一个属于双向字符类型 L,AL,或 R (按照逻辑顺序)的字符。 [BIDI]

如果找到了这样一个字符,且它的双向字符类型是 AL 或 R, 该属性的方向 为 'rtl'。

否则,该属性的方向 为 'ltr'。

否则
该属性的方向 与该元素的 方向 相同。

下列属性属于 有方向的属性


document . dir [ = value ]

返回 html 元素dir 属性值,如果有的话。

可以设置为 "ltr","rtl",或 "auto" 来替换掉 html 元素dir 属性值。

如果不存在 html 元素,则返回空字符串,忽略新的值。

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

Document 对象上的 dir IDL 属性必须 反映 html 元素dir 内容属性,如果有的话, 仅限于已知值。如果没有这样的元素, 该属性必须返回空字符串,且在设置时什么都不做。

强烈建议作者使用 dir 属性而不是 CSS 来指明文本方向。因为这样的话即使没有 CSS 文档也会正确地渲染。 (例如被搜索引擎解释时)。

这个标记片段是关于 IM 对话的。

<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> How do you write "What的 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的 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 元素合适的样式表和默认对齐样式,也就是说把文本对齐到段落 起始端,渲染结果可能是这样的:

Each paragraph rendered as a separate block,with the paragraphs left-aligned except the second paragraph and the last one,which would  be right aligned,with the usernames (的tudent' and 'Teacher' in this example) flush right,with a colon to their left,and the text first to the left of that.

就像之前提到的,auto 值不是万能药。 这个例子中最后一个段落被错误地解释为从右向左的文本, 因为它以一个阿拉伯字符开始,这会导致 "right?" 出现在阿拉伯文字的左边。

3.2.6.5 style 属性

所有 HTML 元素 都可以设置 style 内容属性。 这个 style 属性 定义在 CSS Style Attributes 规范中。 [CSSATTR]

在支持 CSS 的用户代理中,当添加或改变这个属性时必须 , 根据 style 属性 的规则解析该属性的值。 [CSSATTR]

但是如果 是否应该根据内容安全策略禁止元素的内联行为 算法对 属性的 元素,"style attribute",和属性值返回了 "Blocked" , 那么该属性值中定义的样式规则不得应用于该 元素[CSP]

在任何元素上使用了 style 属性的文档必须 在那些属性移除之后仍然可以理解和使用。

特别是使用 style 属性来隐藏和显示内容, 或者传达文档中本没有的含义,这些都是不合规范的。 (隐藏和显示内容,可以使用 hidden 属性)


element . style

返回该元素的 style 属性的 CSSStyleDeclaration 对象。

style IDL 属性定义在 CSS Object Model (CSSOM) 规范中。 [CSSOM]

下面的例子中,使用 span 元素和 style 属性 来标记指代颜色的词,来让它们在视觉媒体中显示相关的颜色。

<p>My sweat suit is <span style="color: green; background:
transparent">green</span> and my eyes are <span style="color: blue;
background: transparent">blue</span>.</p>
3.2.6.6 使用 data-* 属性 嵌入自定义不可见数据

自定义数据属性 是一个无命名空间的属性,其名字以 字符串 "data-" 起始,连字符后有至少一个字符, 兼容于 XML,且不得包含非 ASCII 大写字母

HTML 文档HTML 元素 上所有属性名都会被自动 ASCII 小写化,所以 ASCII 大写字母的限制不会影响这种文档。

自定义数据属性 用于存储页面或应用私有的,自定义的数据、状态、注解和类似东西,只有在找不到更合适的属性或元素时才能使用。

这些属性不适用于所属站点管理员不知道的软件。对于很多独立工具使用的通用扩展, 或者需要扩展本规范来显式地提供该特性,或者应该使用类似 microdata 的技术(使用标准化的词汇)。

例如一个音乐相关的站点可能会在表示专辑音轨的列表项中, 使用自定义数据属性来表示每个音轨的长度。 用户可能会用该信息对列表进行排序,或者按照某个长度来过滤列表。

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

但是用户使用与这个音乐站点不相关的通用软件来根据这个数据搜索某个长度的音轨是不合适的。

这是因为这些属性只适用于该站点自己的脚本,并不是一种公众可用的元数据的通用扩展机制。

类似地,页面作者可能会编写一些标记来为他们打算使用的翻译工具提供一些信息:

<p>The third <span data-mytrans-de="Anspruch">claim</span> covers the case of <span
translate="no">HTML</span> markup.</p>

这个例子中,"data-mytrans-de" 属性给出的文字 提供给 MyTrans 产品使用,把 "claim" 翻译到德语。但是标准的 translate 属性用于指示, 在所有语言环境中 "HTML" 要保持不变。当有标准属性可用时,就没必要使用 自定义数据属性 了。

在这个例子中,自定义数据属性用于存储 PaymentRequest 特性探测的结果,可能会用于 CSS 中,对付款页面做特殊的样式。

<script>
 if ('PaymentRequest' in window) {
   document.documentElement.dataset.hasPaymentRequest = '';
 }
</script>

这里 data-has-payment-request 属性被当做 布尔属性 来使用;检查该属性是否出现就足够了。 但是如果作者希望,它后续也可以填充一些值,比如用来标识该特性的功能限制。

每个 HTML 元素 都可以指定任意个 自定义数据属性,指定为任意值。

作者应该仔细地设计这样的扩展,当属性被忽略或者任何相关 CSS 被丢弃时,页面仍然可用。

用户代理不得从这些属性和值腿短任何实现行为。用户代理的相关规范不得为这些属性定义任何有意义的值。

JavaScript 库可以使用 自定义数据属性,因为它们也是页面的一部分。 鼓励有很多人用的库的作者在属性名中包含名字,来减小冲突的风险。 如果可行的话,鼓励库的作者支持自定义实际在用的名字,这样不小心选了重复名字的库也可以用于同一个页面, 同一个库的多个版本也可以用于同一个页面,即使它们互相不兼容。

例如一个叫做 "DoQuery" 的库可能会使用叫做 data-doquery-range 的属性名, 另一个叫做 "jJo" 的库可能会使用叫做 data-jjo-range 的属性名。 jJo 库也可以提供一个 API 来设置使用哪个前缀(例如 J.setDataPrefix('j2'), 使属性的名字变成 data-j2-range)。


element . dataset

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

连字符连接的名字会变成驼峰的。例如 data-foo-bar="" 变成了 element.dataset.fooBar

dataset IDL 属性 为元素上的所有 data-* 属性提供了便利访问器。 当读取时,dataset IDL 属性必须返回一个与该元素关联的 DOMStringMap

DOMStringMap 接口用于 dataset 属性。每个 DOMStringMap 有一个 关联的元素

[OverrideBuiltins]
interface DOMStringMap {
  getter DOMString (DOMString name);
  [CEReactions] setter void (DOMString name,DOMString value);
  [CEReactions] deleter void (DOMString name);
};

获取 DOMStringMap 的键值对,需呀执行以下算法:

  1. list 为一个键值对的空列表。

  2. 对于 DOMStringMap关联元素 上的每个前五个字符是 "data-" 且剩余字符(如果有的话)不包含任何 ASCII 大写字母 的内容属性, 按照这些属性在 属性列表 中出现的顺序, 在 list 中新增一个键值对,属性名移除前五个字符后作为键,属性值作为值。

  3. list 中的每个键中的每个后面跟随着一个 ASCII 小写字母 的 U+002D HYPHEN-MINUS 字符 (-) ,移除这个 U+002D HYPHEN-MINUS 字符 (-)并且将后面的这个字符替换为 同一个字母 转换为 ASCII 大写 的结果。

  4. 返回 list

任一时刻,DOMStringMap 对象上 支持的属性名 都是那一时刻 获取 DOMStringMap 的键值对 返回的每个键值对的键构成的列表,并按照返回的顺序排序。

对一个 DOMStringMap 确定命名属性 name 的值获取 DOMStringMap 的键值对 返回的列表中键是 name 的键值对的值。

给定属性名 name 和一个新值 value, 为一个 DOMStringMap 设置一个新命名属性的值设置已有属性的值 ,需要执行以下步骤:

  1. 如果 name 包含一个 U+002D HYPHEN-MINUS 字符(-) 紧跟着 ASCII 小写字母, 则抛出一个 "SyntaxError" DOMException 并中止这些步骤。

  2. 对每一个 name 中的 ASCII 大写字母 , 在该字符前插入一个 U+002D HYPHEN-MINUS 字符(-),并把这个字母替换为同一字母 转换为 ASCII 小写 的结果。

  3. name 之前插入字符串 data-

  4. 如果 name 不匹配 XML Name 生成式, 抛出一个 "InvalidCharacterError" DOMException 并中止这些步骤。

  5. 使用 namevalueDOMStringMap关联元素 设置属性值

为一个 DOMStringMap 删除一个既有命名属性 name ,需要执行以下步骤:

  1. 对每一个 name 中的 ASCII 大写字母 , 在该字符前插入一个 U+002D HYPHEN-MINUS 字符(-),并把这个字母替换为同一字母 转换为 ASCII 小写 的结果。

  2. name 之前插入字符串 data-

  3. 给定 nameDOMStringMap关联元素 通过属性名移除属性

Web IDL 规范只会使用前述 获取 DOMStringMap 的键值对 算法给出的名字调用该算法。 [WEBIDL]

如果一个 Web 页面想要一个元素来表示宇宙飞船,比如作为游戏的一部分,他可能必须同时使用 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()">
  Fire
 </button>
</div>

注意连字符连接的属性名在 API 中变成了驼峰命名的。

给定下面的相似构造的片段和元素:

<img class="tower" id="tower5" data-x="12" data-y="5"
     data-ai="robotarget" data-hp="46" data-ability="flames"
     src="towers/rocket.png" alt="Rocket Tower">

...可能会想到用一个 splashDamage() 函数,它接受的第一个参数是被处理的元素:

function splashDamage(node,x,y,damage) {
  if (node.classList.contains('tower') && // checking the 'class' attribute
      node.dataset.x == x && // reading the 'data-x' attribute
      node.dataset.y == y) { // reading the 'data-y' attribute
    var hp = parseInt(node.dataset.hp); // reading the 'data-hp' attribute
    hp = hp - damage;
    if (hp < 0) {
      hp = 0;
      node.dataset.ai = 'dead'; // setting the 'data-ai' attribute
      delete node.dataset.ability; // removing the 'data-ability' attribute
    }
    node.dataset.hp = hp; // setting the 'data-hp' attribute
  }
}

3.2.7 innerText IDL 属性

element . innerText [ = value ]

返回该元素 "渲染后的" 文本内容。

设置时,用给定的值替换掉该元素的子元素,其中换行替换为 br 元素。

读取时,innerText 属性必须遵循这些步骤:

  1. 如果该元素未 被渲染,或者用户代理是非 CSS 用户代理, 则返回该元素上 textContent IDL 属性同样的值。

  2. 对该元素的每个子节点 node 按照 树序 应用下列的递归过程, 计算得到一个字符串和正整数(一个 需要的换行数)的列表,然后把结果连接成一个列表。

    直觉上,需要的换行数 是指在那个点需要插入的换行个数,但相邻的 需要的换行数 会合并,想想 CSS 外边距合并。

    1. items 为递归地,按照 树序 应用这一过程到 node 的每个子元素, 并把结果连接成一个列表的结果。

    2. 如果 node'visibility'计算后的值 不是 'visible',则令这些子步骤的结果为 items 并终止这些步骤。

    3. 如果 node 没有相关联的 CSS 盒子,则令这些子步骤的结果为 items 并中止这些子步骤。 在这一步中,下列元素必须表现为 'display' 属性的 计算后的值 不是 'none':

      • select 原始有一个相关联的未被替换的内联 CSS 盒子, 其子盒子只包括 optgroupoption 元素的子节点的盒子;
      • optgroup 元素有一个关联的未被替换的块级别的 CSS 盒子, 其子盒子只包含 option 元素的子节点的盒子;另外
      • option 元素有一个相关联的未被替换的块级别的 CSS 盒子, 其子盒子是正常的未被替换的块级别的 CSS 盒子。

      items 可能会因为 'display:contents' 变得非空的。

    4. 如果 node 是一个 Text 节点,那么对每一个 node 产生的 CSS 文字盒子, 按照内容顺序,应用 CSS 'white-space' 的处理规则和 'text-transform' 规则后, 计算盒子的文字,令这些子步骤的结果为一个结果字符串列表,并中止这些子步骤。CSS 'white-space' 处理规则要稍加修改:总是合并行尾可合并的空格, 但只有这是块中最后一行或以 br 元素结尾时才移除它。应该保留软的连字符。 [CSSTEXT]

    5. 如果 node 是一个 br 元素,那么在 items 后追加一个只包含一个 U+000A LINE FEED (LF)字符的字符串。

    6. 如果 node'display'计算后的值'table-cell', 且 node 的 CSS 盒子不是它所在的 'table-row' 盒子中 最后一个 'table-cell' 盒子,则在 items 后追加一个 只包含一个 U+0009 CHARACTER TABULATION (tab)字符的字符串。

    7. 如果 node'display'计算后的值'table-row', 且 node 的 CSS 盒子不是它最近的祖先 'table' 盒子的最后一个 'table-row' 盒子,则在 items 后追加一个 只包含一个 U+000A LINE FEED (LF)字符的字符串。

    8. 如果 node 是一个 p 元素,则在 items 前后添加 2(这是 需要的换行数)。

    9. 如果 node'display' 在使用的值块级别'table-caption',则在 items 的前后添加 1 (这是 需要的换行数)。 [CSSDISPLAY]

      浮点数和绝对定位元素属于这一类。

    10. 令这些子步骤的结果为 items

  3. 删除所有空字符串的列表项。

  4. 删除列表前后的所有连续的 需要的换行数

  5. 把剩余的每个连续的 需要的换行数 替换为这些 需要的换行数 中最大的那个对应个数的 U+000A LINE FEED (LF)字符组成的字符串。

  6. 返回字符串列表项的连接后的值。

严格地说,多数被替换元素的子元素(比如 textareainput,和 video — 但不包括 button)不由 CSS 渲染, 因此没有该算法中的 CSS 盒子。

该算法适用于广义的 范围。 我们可以使用它作为 Selection 的字符串化程序的基础, 或者让它直接操作 范围。 参见 Bugzilla bug 10583

当设置时,innerText 属性必须遵循这些步骤:

  1. document 为该元素的的 节点文档

  2. fragment 为一个新的 DocumentFragment 对象, 其 节点文档document

  3. input 为给定的值。

  4. positioninput 中的指针初始指向字符串开始。

  5. text 为空字符串。

  6. While position 没有越过 input 的结尾:

    1. input 的给定 position 收集 不是 U+000A LINE FEED(LF) 或 U+000D CARRIAGE RETURN (CR)字符的代码点序列,将 text 设为得到的字符。

    2. 如果 text 不是空字符串,则在 fragment追加 一个新的 Text 节点,其 datatext节点文档document

    3. While position 没有越过 input 的结尾,且 position 处的字符是 U+000A LINE FEED(LF) 或 U+000D CARRIAGE RETURN (CR) 字符:

      1. 如果 position 处的字符是 U+000D CARRIAGE RETURN (CR)字符且下一个字符是 U+000A LINE FEED (LF)字符,则前进 positioninput 中的下一个字符。

      2. 前进 positioninput 中的下一个字符。

      3. 把给定 documentbr,和 HTML 命名空间 创建一个元素 的结果 追加fragment

  7. fragment 替换该元素的所有内容

3.2.8 与双向算法相关的要求

3.2.8.1 双向算法格式化字符的编写一致性标准

内容 中包含 Text 节点的 HTML 元素 中的 文本内容, 以及允许自由文本的 HTML 元素 属性中的文本, 可以包含 U+202A 到 U+202E,和 U+2066 到 U+2069 (双向算法的格式化字符) 范围内的字符。 [BIDI]

鼓励作者使用 dir 属性, bdo 元素,以及 bdi 元素, 而不是手动地维护双向算法字符。双向算法格式化字符与 CSS 的交互性很差。

3.2.8.2 用户代理一致性标准

用户代理必须实现 Unicode 双向算法,以便在渲染文档或文档部分时确定合适的字符顺序。[BIDI]

HTML 到 Unicode 双向算法的映射必须以这三种方式中的任何一种来完成。 一,用户代理必须实现 CSS,特别是 CSS 'unicode-bidi''direction',和 'content' 属性, 并且在其用户代理样式表中必须包含在本规范的 渲染 章节中给出的用到了这些属性的规则。 二,用户代理必须表现得就像实现了前述属性一样,并且用户代理样式表中包含所有前述规则,但没有让文档中指定的样式表覆盖它们。 三,用户代理必须实现另一种具有等价语义的样式语言。 [CSSGC]

以下元素和属性具有由 渲染 部分定义的要求, 由于本节中的要求,那些要求对所有用户代理都有效(不仅仅是那些 支持建议默认渲染的):

3.2.9 ARIA 与 平台可访问性 API 相关的要求

HTML 元素 上实现可访问性 API 语义的用户代理要求定义在 HTML Accessibility API Mappings 中。 [HTMLAAM]

对一致性检查器检查 HTML 元素 上 ARIA rolearia-* 属性的使用 的相关要求定义在 ARIA in HTML[ARIAHTML]

4 HTML 元素

4.1 文档元素

4.1.1 html 元素

类别
无。
该元素可用的上下文
作为文档的 文档元素
复合文档中允许子文档片段的地方。
内容模型
head 元素紧接着 body 元素。
text/html 中的标签省略
An html element's start tag can be omitted if the first thing inside the html element is not a comment.
An html element's end tag can be omitted if the html element is not immediately followed by a comment.
内容属性
全局属性
manifestApplication cache manifest
DOM 接口
[HTMLConstructor]
interface HTMLHtmlElement : HTMLElement {};

html 元素 表示 HTML 文档的根。

鼓励作者在根 html 元素上指定 lang 属性, 给出文档的语言。这可以帮助语音合成工具确定要使用的发音,帮助翻译工具确定要使用的规则, 等等。

manifest 属性给出文档的 应用缓存 manifest 的地址,如果有的话。 如果出现了该属性,其值必须是一个 可能被空格包裹的合法的非空URL

manifest 属性是是遗留的 "离线 Web 应用" 特性的一部分, 该特性正在从 Web 平台移除。(这是一个很长的过程,可能持续很多年。) 现在强烈不推荐使用 manifest 属性。 使用 service workers 来替代。 [SW]

manifest 属性只在文档加载的早期阶段 起作用。 因此动态改变该属性没有效果(因此没有为该属性提供任何 DOM API)。

应用缓存选择 中,后续的 base 元素影响不了 manifest 属性的 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>

4.2 文档元数据

4.2.1 head 元素

类别
无。
该元素可用的上下文
作为 html 元素的第一个元素。
内容模型
如果该文档是 iframe srcdoc 文档, 或者如果在更高级协议上有标题信息可用:大于等于0个 元数据内容 元素,其中不多于一个 title 元素, 不多于一个 base 元素。
否则:一个或更多 元数据内容 元素,其中恰好一个是 title 元素, 且不多于一个 base 元素。
text/html 中的标签省略
A head element's start tag can be omitted if the element is empty, or if the first thing inside the head element is an element.
A head element's end tag can be omitted if the head element is not immediately followed by ASCII whitespace or a comment.
内容属性
全局属性
DOM 接口
[HTMLConstructor]
interface HTMLHeadElement : HTMLElement {};

head 元素 表示 Document 的元数据集合。

head 元素中的元数据集合可大可小。这里有一个非常小的例子:

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

这是一个更长的例子:

<!DOCTYPE HTML>
<HTML LANG="EN">
 <HEAD>
  <META CHARSET="UTF-8">
  <BASE HREF="https://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 元素在多数场景下都是必须的子元素,但是当更高级协议提供了标题信息时, 例如在 e-mail 中使用 HTML 作为编写格式,有标题行时就可以忽略 title 元素。

4.2.2 title 元素

类别
元数据内容
该元素可用的上下文
在不包含 titlehead 元素中。
内容模型
元素间空白文本内容
text/html 中的标签省略
哪个标签都不能省略。
内容属性
全局属性
DOM 接口
[HTMLConstructor]
interface HTMLTitleElement : HTMLElement {
  [CEReactions] attribute DOMString text;
};

title 元素 表示 文档的标题或名称。 作者应该使用标识其文档的标题,这个标题在其他上下文中也会被使用,例如在用户的历史、书签,或搜索结果中。 文档的标题常常与第一个标题元素不同,因为第一个标题不需要在上下文之外有意义。

每个文档不得有多个 title 元素。

如果 Document 没有标题是合理的,则可能不要求有 title 元素。在 head 元素的内容模型中描述了何时该元素是必须的。

title . text [ = value ]

返回该元素的 子文本内容

设置时用给定的值替换该元素的子内容。

text IDL 属性必须返回 title 元素的 子文本内容。 当设置时,必须与 textContent IDL 属性的表现一致。

这是一些合适的标题的例子,以及同一页面中可能有的顶层标题。

  <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...

The next page might be a part of the same site。 Note how the title describes the subject matter unambiguously,while the first heading assumes the reader knows what the context is and therefore won't wonder if the dances are Salsa or Waltz:

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

document.title IDL 属性用作文档的标题。

当用户代理在其用户界面中引用文档时,应该使用该文档的标题。 当这样使用 title 元素的内容时, 应该使用该 title 元素的 方向 设置用户界面中该文档标题的方向。

4.2.3 base 元素

类别
元数据内容
该元素可用的上下文
不包含其他 base 元素的 head 元素中。
内容模型
text/html 中的标签省略
哪个标签都不能省略。
内容属性
全局属性
hrefDocument base URL
target — Default browsing context for hyperlink navigation and form submission
DOM 接口
[Exposed=Window,
 HTMLConstructor]
interface HTMLBaseElement : HTMLElement {
  [CEReactions] attribute USVString href;
  [CEReactions] attribute DOMString target;
};

base 元素允许作者指定用于 解析 URL文档基 URL, 以及用于 跟随超链接 的默认 浏览上下文 的名称。 该元素不 表示 超出该信息的任何内容。

每个文档中不得包含多个 base 元素。

base 元素有一个 href 属性, 或者 target 属性,或者两者都有。

如果指定了 href 内容属性, 必须包含一个 可能被空白包裹的合法的 URL

如果 base 元素有 href 属性, 则必须出现在树中的任何使用 URL 的其他元素之前, html 元素除外(其 manifest 属性不受 base 元素的影响)。

如果有多个有 href 属性的 base 元素, 则忽略除第一个之外的。

如果指定了 target 属性,则必须包含一个 合法的浏览上下文名称或关键字, 它指定了当 Document 中的 超链接表单 产生 导航 时默认使用哪个 浏览上下文

base 元素如果有 target 属性, 必须出现在树中表示 超链接 的其他元素之前。

如果有多个有 target 属性的 base 元素,则忽略除第一个之外的。

给定 aarea, 或 form 元素 element, 要 获得元素的 target,执行这些步骤:

  1. 如果 elementtarget 属性,则返回该属性的值。

  2. 如果 element节点文档 包含一个 有 target 属性的 base 元素, 则返回第一个这样的 base 元素的这一 target 属性的值。

  3. 返回空字符串。


在文档树中 第一个有 href 内容属性的 base 元素元素有一个 冻结的 base URL。当下列情况发生时, 必须 立即 设置 元素的 冻结的 base URL

为元素 element 设置冻结的 base URL 步骤如下:

  1. documentelement节点文档

  2. urlRecord 为用 documentfallback base URL, 以及 document字符编码 解析 elementhref 内容属性的值的结果。 (因此 base 元素不影响它自己。)

  3. 如果 urlRecord 是失败或者 在 结果 URL 记录document 上执行 Document 是否允许 base? 返回了 "Blocked", 则设置 element冻结的 base URLdocumentfallback base URL;否则设置为 urlRecord

在读取时,href IDL 属性必须返回运行以下算法的结果:

  1. documentelement节点文档

  2. url 该元素的 href 属性的值, 如果没有则为空字符串。

  3. urlRecord 为用 documentfallback base URL, 以及 document字符编码 解析 elementhref 内容属性的值的结果。 (因此 base 元素不影响它自己。)

  4. 如果 urlRecord 是失败,则返回 url

  5. 返回 urlRecord序列化

在设置 href IDL 属性时,必须设置 href 内容属性为给定的新值。

target IDL 属性必须 反映 同名的内容属性。

在这个例子中,用一个 base 元素来设置 文档的 base URL

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>This is an example for the &lt;base&gt; element</title>
        <base href="https://www.example.com/news/index.html">
    </head>
    <body>
        <p>Visit the <a href="archives.html">archives</a>.</p>
    </body>
</html>

上面例子中的链接地址是 "https://www.example.com/news/archives.html"。

类别
元数据内容
如果 body 中允许 该元素:流式内容
如果 body 中允许 该元素:短语内容
该元素可用的上下文
期望 元数据内容 的地方。
head 中的 noscript 元素中。
如果 body 中允许 该元素: 期望 短语内容 的地方。
内容模型
text/html 中的标签省略
哪个标签都不能省略。
内容属性
全局属性
href — Address of the hyperlink
crossorigin — How the element handles crossorigin requests
rel — Relationship between the document containing the hyperlink and the destination resource
media — Applicable media
integrity — Integrity metadata used in Subresource Integrity checks [SRI]
hreflang — Language of the linked resource
type — Hint for the type of the referenced resource
referrerpolicyReferrer policy for fetches initiated by the element
sizes — Sizes of the icons (for rel="icon")
asPotential destination for a preload request (for rel="preload" and rel="modulepreload")
color — Color to use when customizing a site's icon (for rel="mask-icon")
此外,在该元素上 title 属性 有特殊的语义。 — Title of the link — CSS style sheet set name
DOM 接口
[HTMLConstructor]
interface HTMLLinkElement : HTMLElement {
  [CEReactions] attribute USVString href;
  [CEReactions] attribute DOMString? crossOrigin;
  [CEReactions] attribute DOMString rel;
  [CEReactions] attribute DOMString as; // (default "")
  [SameObject,PutForwards=value] readonly attribute DOMTokenList relList;
  [CEReactions] attribute DOMString media;
  [CEReactions] attribute DOMString integrity;
  [CEReactions] attribute DOMString hreflang;
  [CEReactions] attribute DOMString type;
  [SameObject,PutForwards=value] readonly attribute DOMTokenList sizes;
  [CEReactions] attribute DOMString referrerPolicy;
};
HTMLLinkElement includes LinkStyle;

link 元素允许作者把他们的文档链接到其他资源。

链接的目标由 href 属性给出, 它必须存在并包含一个 合法的可能由空白包裹的非空 URL 字符串。 如果 href 属性缺失, 则视为该元素不定义链接。

crossorigin 属性是一个 CORS 设置属性。 它用于 外部资源链接

链接指示的类型(关系)由 rel 属性的值给出。该属性如果出现则它的值必须是一个 由空格分隔的令牌允许的关键字及其含义 定义在后续章节中。 如果 rel 属性缺失, 不包含关键字,或者没有出现(根据本规范中的定义)允许的关键字, 则该元素不创建任何链接。

rel 支持的令牌HTML 链接类型 中定义的, link 元素上允许的,影响处理模型的,用户代理支持的关键字。 可能的 支持的令牌 包括 alternatedns-prefetchiconmodulepreload, nextpingbackpreconnectprefetchpreloadprerendersearch,和 stylesheetrel支持的令牌 必须只包含这个列表中用户代理实现了相应处理模型的令牌。

理论上用户代理可能会支持 canonical 关键字的处理模型, 比如用户代理是一个执行 JavaScript 的搜索引擎的话。虽然实践中基本不会发生。 所以大多数场景下,canonical 不应属于 rel 支持的令牌

link 元素必须有一个 rel 属性或者 itemprop 属性,但不能同时有这两个。

如果 link 元素有一个 itemprop 属性, 或者有一个只包含 body-ok 关键字的 rel 属性, 则称该元素 允许出现在 body 中。 这意味着该元素可以用于期望 短语内容 的地方。

如果用了 rel 属性, 该元素只能用于页面中的 body 部分。如果用了 itemprop 属性,该元素既可以用于页面中的 head 元素也可以用于 body 元素,取决于元数据模型的约束。

使用 link 元素可以创建两类链接: 外部资源链接超链接链接类型一章 定义了 特定的链接类型是外部资源还是超链接。 一个 link 元素可以创建多个链接(其中有些可能是 外部资源链接,有些可能是 超链接);具体创建了哪种链接,创建了多少个取决于 rel 属性中给出的关键字。 用户代理必须逐链接而不是逐元素进行处理。

link 元素创建的每个链接都会被单独处理。 例如,如果有两个有 rel="stylesheet"link 元素, 它们每个都被当做独立的外部资源,每个都会独立地受自己的属性影响。 类似地,如果单个 link 元素有一个 值为 next stylesheet rel 属性, 它(为 next 关键字)创建了一个 超链接,同时也 (为 stylesheet 关键字)创建了一个 外部资源链接, 它们分别受其他属性(例如 mediatitle)的影响。

例如下面的 link 元素创建了两个 超链接 (指向同一页面):

<link rel="author license" href="/about">

该元素创建的这两个链接,一个的语义是目标页面具有关于当前页面作者的信息, 另一个的语义是目标页面具有提供当前页面的授权信息。

link 元素和它的 rel 属性创建的 超链接 适用于整个文档。 这区别于 aarea 元素的 rel 属性,它们指定了链接的类型, 链接的上下文由链接在文档中的位置给出。

外部资源链接 的确切行为取决于由相关的 链接类型 定义的具体关系。

media 属性指定了该资源适用哪种媒体。 它的值必须是 合法的媒体查询列表

nonce 属性表示一个加密随机数 ("一次性数字")用于 Content Security Policy 来确定 该链接指定的外部资源 是否会被加载和应用于该文档。它的值是文本。 [CSP]

integrity 属性表示 该元素对应请求的 完整性元数据。 它的值是文本。该属性不得指定在 rel 属性不包含 stylesheet 关键字的 link 元素上。 [SRI]

link 元素上的 hreflang 属性与 a 元素上的 hreflang 属性 具有相同的语义。

type 属性给出了被链接资源的 MIME type。它纯属建议性的。它的值必须是 合法的 MIME 类型

对于 外部资源链接type 属性用于提示用户代理避免获取它们不支持的资源。

referrerpolicy 属性是一个 引荐策略属性。 它用于 外部资源链接, 帮助设置 获取 该外部资源时的 引荐策略[REFERRERPOLICY]

title 属性给出了链接的标题。 有一个特例中,它是纯建议性的。它的值是文本。 特例是 在文档树 中的样式表链接, 对它而言 title 属性定义了 CSS 样式表集合

link 元素上的 title 属性 与多数其他元素的全局 title 属性不同, 没有标题的链接不继承父元素的标题:它只是没有标题。


sizes 属性为视觉媒体给出了图标大小。 它的值(如果存在的话)只是建议性的。在有多个图标可用时, 用户代理可以用这一值决定用哪个图标。 如果指定了,该属性的值必须是 一个 一组无序的不重复的空格分隔的令牌,它们是 ASCII 大小写不敏感的。 每个值必须 ASCII 大小写不敏感 地匹配 字符串 "any",或者由两个 合法非负整数 组成,且没有前导 U+0030 DIGIT ZERO(0)字符,且由一个 U+0078 LATIN SMALL LETTER X 或 U+0058 LATIN CAPITAL LETTER X 字符分隔。 该属性不得在 rel 属性没有指定 icon 关键字或 apple-touch-icon 关键字的 link 元素上指定。

apple-touch-icon 关键字是一个已注册的 链接类型的预定义集合扩展,但不要求用户代理支持它。


as 属性为 href 指定的资源的预加载请求指定了 potential destination。 这是一个 枚举属性。 每个 potential destination 是一个关键字, 映射为一个同名的状态。该属性必须指定在 rel 属性包含 preload 关键字的 link 元素上,不得指定在没有该关键字的 link 元素上。 在 获取资源的步骤 中给出了 as 属性如何使用的处理模型。

该属性没有 缺失值默认非法值默认,意味着非法值或缺失值不映射到任何状态。 这在处理模型中有所解释。


color 属性用于 mask-icon 链接类型。该属性不得指定在 rel 属性不包含 mask-icon 关键字的 link 元素上。它的值必须是一个匹配 CSS <color> 生成式的字符串, 用于定义一个用户代理在用户固定一个网站时用来自定义图标展示的建议颜色。

本规范在 color 属性上对用户代理没有任何要求。

mask-icon 关键字是一个已注册的 链接类型的预定义集合扩展,但不要求用户代理支持。


IDL 属性 hrefhreflangintegritymedianoncerelscopesizes,和 type 都必须 反映 对应的同名内容属性。

color 属性没有相应的 IDL 属性,但今后可能会增加。

as IDL 属性必须 反映 as 内容属性, 并限制为已知的值

crossOrigin IDL 属性必须 反映 crossorigin 内容属性。

referrerPolicy IDL 属性必须 反映 referrerpolicy 内容属性,并 限制到已知的值

relList IDL 属性必须 反映 rel 内容属性。

4.2.4.1 处理 media 属性

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

但如果该链接是 外部资源链接,则 media 属性则是指定的。 当 media 属性值 匹配当前环境 以及其他相关条件时, 用户代理必须应用这一外部资源。其他情况不得应用该资源。

如果忽略 media 属性, 默认值是 "all",表示默认情况下链接适用于所有媒体。

外部资源可能会在此限制范围内限定其适用性。 例如,CSS样式表可能有一些 @media 块。 本规范不会覆盖这些进一步的限制或要求。

4.2.4.2 处理 type 属性

如果存在 type 属性,那么用户代理必须假定 该资源属于给定的类型(即使它不是 合法的 MIME 类型, 例如空字符串)。 如果忽略了该属性,但 外部资源链接 类型定义有默认值,则用户代理必须假定该资源属于那种类型。 如果 UA 对指定的链接关系不支持给定的 MIME 类型, 那么 UA 不应 获取 该资源;如果 UA 对指定的链接关系支持给定的 MIME 类型, 那么 UA 应该按照 外部资源链接 的特定类型所指定的 适当时机 获取 该资源。 如果忽略了该属性,且 外部资源链接 类型没有定义默认值,但如果已知类型且支持的话用户代理会 获取 该资源, 那么用户代理就应该假设支持该资源并且 获取 它。

用户代理不得将 type 属性当做权威的 — 也就是说获取该资源时用户代理不得使用 type 属性来决定实际的类型。只能用实际的类型(定义在下一段)而不是前述的假设的类型 来决定是否应用该资源。