1. 2.6 通用 DOM 接口
      1. 2.6.1 在 IDL 属性中反映内容属性
      2. 2.6.2 在规范中使用 reflect
      3. 2.6.3 集合
        1. 2.6.3.1 HTMLAllCollection 接口
          1. 2.6.3.1.1 [[Call]] ( thisArgument, argumentsList )
        2. 2.6.3.2 HTMLFormControlsCollection 接口
        3. 2.6.3.3 HTMLOptionsCollection 接口
      4. 2.6.4 DOMStringList 接口

2.6 通用 DOM 接口

2.6.1 在 IDL 属性中反映内容属性

反映的构建块如下

一个反射 IDL 属性可以被定义为反射反射内容属性名称反射目标。通常,这意味着 IDL 属性 getter 返回内容属性的当前值,而 setter 将内容属性的值更改为给定值。

如果反射目标是元素,则反射 IDL 属性还可以声明支持 ElementInternals。这意味着 ElementInternals 接口也具有一个反射 IDL 属性,具有相同的标识符,并且该反射 IDL 属性反射相同的反射内容属性名称

fooBar IDL 属性必须反射foobar 内容属性并支持 ElementInternals

反射目标具有以下关联算法

对于一个反射目标,它是一个元素 element,这些定义如下

获取元素
  1. 返回 element

获取内容属性
  1. attribute 为运行根据命名空间和本地名称获取属性给定 null、反射内容属性名称element的结果。

  2. 如果 attribute 为 null,则返回 null。

  3. 返回 attribute

使用字符串 value 设置内容属性
  1. 设置属性值给定 element反射内容属性名称value

删除内容属性
  1. 根据命名空间和本地名称删除属性给定 null、反射内容属性名称element

对于一个反射目标,它是一个 ElementInternals 对象 elementInternals,它们定义如下

获取元素
  1. 返回 elementInternals目标元素

获取内容属性
  1. 如果 elementInternals目标元素内部内容属性映射[反射内容属性名称] 不存在,则返回 null。

  2. 返回 elementInternals目标元素内部内容属性映射[反射内容属性名称]。

使用字符串 value 设置内容属性
  1. 设置 elementInternals目标元素内部内容属性映射[反射内容属性名称] 为 value

删除内容属性
  1. 移除 elementInternals目标元素内部内容属性映射[反射内容属性名称]。

这导致 ElementInternals 对象的数据结构有些冗余,因为它们的目标元素内部内容属性映射不能直接操作,因此反射仅在一个方向上发生。然而,选择这种方法是为了使定义在反射目标之间共享的 IDL 属性不太容易出错,并受益于通用的 API 语义。


类型为 DOMStringDOMString? 的 IDL 属性,它们反射枚举内容属性可以限制为仅已知的值。根据下面的处理模型,这些将导致此类 IDL 属性的 getter 仅返回这些枚举属性的关键字,或空字符串或 null。

如果反射 IDL 属性的类型为 DOMString

如果一个反射 IDL 属性的类型是DOMString?

如果一个反射 IDL 属性的类型是USVString

如果一个反射 IDL 属性的类型是boolean

这对应于布尔内容属性的规则。

如果一个反射 IDL 属性的类型是long,可选地仅限于非负数,并可选地具有默认值defaultValue

如果一个反射 IDL 属性的类型是unsigned long,可选地仅限于正数仅限于正数并回退限制在范围内[clampedMinclampedMax],并可选地具有默认值defaultValue

如果一个 反射 IDL 属性 的类型为 double,可以选择 仅限于正数,并且可以选择具有 默认值 defaultValue

根据 Web IDL 中的定义,Infinity 和 Not-a-Number (NaN) 值在设置时会抛出异常。 [WEBIDL]

如果一个 反射 IDL 属性 的类型为 DOMTokenList,则其 getter 步骤是返回一个 DOMTokenList 对象,其关联元素为 此对象,并且关联属性的本地名称为 反射内容属性名称。规范作者不能对这种类型的 IDL 属性使用 支持 ElementInternals

如果一个 反射 IDL 属性 的类型为 T?,其中 TElement 或从 Element 继承的接口,则以 attr反射内容属性名称

这种类型的反射 IDL 属性 强烈建议其标识符以“Element”结尾,以保持一致性。

如果一个 反射 IDL 属性 的类型为 FrozenArray<T>?,其中 TElement 或从 Element 继承的接口,则以 attr反射内容属性名称

反射的 IDL 属性 的这种类型强烈建议其标识符以“Elements”结尾,以保持一致性。

2.6.2 在规范中使用反射

反射 主要关于通过 反射的 IDL 属性 为 Web 开发人员提供类型化访问内容属性,从而改善 Web 开发人员的体验。Web 平台构建的基础是内容属性本身,即最终的真相来源。也就是说,规范作者不得使用 反射的 IDL 属性 获取器或设置器步骤,而必须使用内容属性的存在和值。(或基于其之上的抽象,例如 枚举属性 的状态。)

对此有两个重要的例外:反射的 IDL 属性 其类型是以下类型之一

对于这些,规范作者必须分别使用 反射目标获取 attr 关联的元素获取 attr 关联的元素。不得使用内容属性的存在和值,因为它们无法与 反射的 IDL 属性 完全同步。

反射目标显式设置的 attr 元素显式设置的 attr 元素缓存的 attr 关联的元素缓存的 attr 关联的元素对象 应被视为内部实现细节,不得依赖于它们。

2.6.3 集合

HTMLFormControlsCollectionHTMLOptionsCollection 接口是从 HTMLCollection 接口派生的 集合HTMLAllCollection 接口是一个 集合,但不是如此派生。

2.6.3.1 HTMLAllCollection 接口

HTMLAllCollection 接口用于旧版 document.all 属性。它的操作方式类似于 HTMLCollection;主要区别在于它允许其方法的各种令人震惊的不同(滥用)最终返回某些内容,并且可以将其作为函数调用作为属性访问的替代方法。

所有 HTMLAllCollection 对象都根植于 Document 并且具有匹配所有元素的过滤器,因此 HTMLAllCollection 对象的 集合表示的元素 由根 Document 的所有后代元素组成。

实现 HTMLAllCollection 接口的对象是 旧版平台对象,具有在 下面部分 中描述的附加 [[Call]] 内部方法。它们还有一个 [[IsHTMLDDA]] 内部插槽。

实现 HTMLAllCollection 接口的对象具有几种异常行为,因为它们具有 [[IsHTMLDDA]] 内部插槽

这些特殊行为的动机是为了希望与两类旧版内容兼容:一类使用 document.all 的存在来检测旧版用户代理,另一类只支持这些旧版用户代理并使用 document.all 对象而无需首先测试其是否存在。 [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.
};

对象的 支持的属性索引HTMLCollection 对象中所定义。

支持的属性名称”由所有元素的id属性的所有非空值组成,以及所有"all"命名的元素包含在集合中name属性的所有非空值,按照树的顺序排列,忽略后续的重复项,如果元素同时包含idname属性,且两者不同,并且都不与前面出现的条目重复,则元素的id属性优先于name属性。

length获取器的步骤是返回集合中包含的节点数。

索引属性的获取器必须返回从当前对象获取“all”索引的元素的结果,其中传递的参数为索引值。

namedItem(name)方法的步骤是返回从当前对象获取“all”命名的元素的结果,其中传递的参数为name

item(nameOrIndex)方法的步骤是

  1. 如果未提供nameOrIndex,则返回null。

  2. 返回从当前对象获取“all”索引的或命名的元素的结果,其中传递的参数为nameOrIndex


以下元素是"all"命名的元素abuttonembedformframeframesetiframeimginputmapmetaobjectselecttextarea

HTMLAllCollection collection获取“all”索引的元素,给定索引index,返回collection中的第index个元素,如果不存在第index个元素,则返回null。

HTMLAllCollection collection获取“all”命名的元素,给定名称name,执行以下步骤

  1. 如果name为空字符串,则返回null。

  2. subCollection为一个HTMLCollection对象,其根节点与collectionDocument相同,其过滤器仅匹配以下元素:

  3. 如果subCollection中恰好包含一个元素,则返回该元素。

  4. 否则,如果subCollection为空,则返回null。

  5. 否则,返回subCollection

HTMLAllCollection collection获取“all”索引的或命名的元素,给定nameOrIndex

  1. 如果将nameOrIndex转换为JavaScript字符串值后,是一个数组索引属性名称,则返回从collection获取“all”索引的元素的结果,其中传递的参数为nameOrIndex表示的数字。

  2. 返回从collection获取“all”命名的元素的结果,其中传递的参数为nameOrIndex

2.6.3.1.1 [[Call]] ( thisArgument, argumentsList )
  1. 如果argumentsList大小为零,或者argumentsList[0]未定义,则返回null。

  2. nameOrIndex为将argumentsList[0]转换为DOMString的结果。

  3. result为从当前HTMLAllCollection获取“all”索引的或命名的元素的结果,其中传递的参数为nameOrIndex

  4. 返回将result转换为ECMAScript值的结果。

thisArgument会被忽略,因此诸如Function.prototype.call.call(document.all, null, "x")之类的代码仍然会搜索元素。(document.all.call不存在,因为document.all没有继承自Function.prototype。)

2.6.3.2 HTMLFormControlsCollection接口

HTMLFormControlsCollection接口用于form元素中集合列出元素

HTMLFormControlsCollection

所有当前引擎都支持。

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer不支持
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

RadioNodeList

所有当前引擎都支持。

Firefox33+Safari7+Chrome21+
Opera?Edge79+
Edge (旧版)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
[Exposed=Window]
interface HTMLFormControlsCollection : HTMLCollection {
  // inherits length and item()
  getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
};

[Exposed=Window]
interface RadioNodeList : NodeList {
  attribute DOMString value;
};
collection.length

返回collection中的元素数量。

element = collection.item(index)
element = collection[index]

返回collection中索引为index的项。这些项按照树的顺序排序。

element = collection.namedItem(name)

HTMLFormControlsCollection/namedItem

所有当前引擎都支持。

Firefox33+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer不支持
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+
radioNodeList = collection.namedItem(name)
element = collection[name]
radioNodeList = collection[name]

collection中返回具有IDnamename的项。

如果有多个匹配项,则返回包含所有这些元素的RadioNodeList对象。

radioNodeList.value

返回由radioNodeList表示的第一个选中的单选按钮的值。

radioNodeList.value = value

选中由radioNodeList表示的第一个值等于value的单选按钮。

对象的支持的属性索引HTMLCollection对象的定义相同。

支持的属性名称” 由所有元素的idname 属性的所有非空值组成,这些元素由集合表示,按照树的顺序,忽略后面的重复项,如果一个元素同时具有idname 属性,并且它们彼此不同,并且两者都不是前面条目的重复项,则该元素的id 优先于其name

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

所有当前引擎都支持。

Firefox33+Safari7+Chrome21+
Opera?Edge79+
Edge (旧版)12+Internet Explorer9+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

RadioNodeList 对象上的value IDL 属性在获取时必须返回运行以下步骤的结果

  1. elementRadioNodeList 对象表示的树的顺序中的第一个元素,该元素是input 元素,其type 属性处于单选按钮状态,并且其选中状态为 true。否则,令其为 null。

  2. 如果element 为 null,则返回空字符串。

  3. 如果element 是没有value 属性的元素,则返回字符串“on”。

  4. 否则,返回elementvalue 属性的值。

在设置时,value IDL 属性必须运行以下步骤

  1. 如果新值为字符串“on”:令elementRadioNodeList 对象表示的树的顺序中的第一个元素,该元素是input 元素,其type 属性处于单选按钮状态,并且其value 内容属性不存在或存在且等于新值(如果有)。如果没有这样的元素,则改为令element 为 null。

    否则:令elementRadioNodeList 对象表示的树的顺序中的第一个元素,该元素是input 元素,其type 属性处于单选按钮状态,并且其value 内容属性存在且等于新值(如果有)。如果没有这样的元素,则改为令element 为 null。

  2. 如果element 不为 null,则将其选中状态设置为 true。

2.6.3.3 HTMLOptionsCollection 接口

HTMLOptionsCollection

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge(旧版)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLOptionsCollection 接口用于option 元素的集合。它始终根植于select 元素,并具有操作该元素的后代的属性和方法。

[Exposed=Window]
interface HTMLOptionsCollection : HTMLCollection {
  // inherits item(), namedItem()
  [CEReactions] attribute unsigned long length; // shadows inherited length
  [CEReactions] setter undefined (unsigned long index, HTMLOptionElement? option);
  [CEReactions] undefined add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
  [CEReactions] undefined remove(long index);
  attribute long selectedIndex;
};
collection.length

返回collection中的元素数量。

collection.length = value

当设置为小于现有长度的数字时,会截断与collection对应的容器中option 元素的数量。

当设置为大于现有长度的数字时,如果该数字小于或等于 100000,则会向与collection对应的容器中添加新的空白option 元素。

element = collection.item(index)
element = collection[index]

返回collection中索引index处的项目。这些项目按照树的顺序排序。

collection[index] = element

index 大于collection中项目数量时,会在对应的容器中添加新的空白option 元素。

当设置为 null 时,会从collection中删除索引index处的项目。

当设置为option 元素时,会在collection中索引index处添加或替换它。

element = collection.namedItem(name)
element = collection[name]

collection中返回具有IDname name 的项目。

如果有多个匹配的项目,则返回第一个项目。

collection.add(element[, before])

在由before给定的节点之前插入element

before 参数可以是数字,在这种情况下,element 会插入到具有该数字的项目之前;也可以是collection中的元素,在这种情况下,element 会插入到该元素之前。

如果省略before,或者before为 null,或者before是超出范围的数字,则element 会添加到列表的末尾。

如果element 是要将其插入到的元素的祖先,则会抛出HierarchyRequestError DOMException

collection.remove(index)

collection中删除索引index处的项目。

collection.selectedIndex

返回第一个选中项目的索引(如果有),如果没有选中项目,则返回 -1。

collection.selectedIndex = index

将选择更改为collection中索引index处的option 元素。

对象的支持的属性索引HTMLCollection 对象的定义相同。

length 获取器步骤是返回集合表示的节点的数量。

length 设置器步骤如下

  1. current 为集合所表示的节点的数量。

  2. 如果给定值大于 current,则

    1. 如果给定值大于 100,000,则返回。

    2. nvaluecurrent

    3. n 个新的 option 元素(无属性且无子节点)追加到 select 元素,this 根植于该元素。

  3. 如果给定值小于 current,则

    1. ncurrentvalue

    2. 从其父节点中移除集合中的最后 n 个节点。

设置 length 永远不会移除或添加任何 optgroup 元素,也不会向现有的 optgroup 元素添加新的子节点(尽管它可以移除其子节点)。

受支持的属性名称包括所有元素所表示的集合的所有 idname 属性的非空值,按照树的顺序,忽略后面的重复项,如果一个元素同时具有 idname 属性,且它们彼此不同,并且两者都不是前面条目的重复项,则该元素的 id 位于其 name 之前。

当用户代理需要设置新索引属性的值设置现有索引属性的值(对于给定的属性索引 index,设置为新值 value)时,它必须运行以下算法

  1. 如果 value 为 null,则使用 index 作为参数调用 remove 方法的步骤,并返回。

  2. length 为集合所表示的节点的数量。

  3. nindex 减去 length

  4. 如果 n 大于零,则追加一个 DocumentFragment,该片段由 n-1 个新的 option 元素(无属性且无子节点)组成,追加到 select 元素,HTMLOptionsCollection 根植于该元素。

  5. 如果 n 大于或等于零,则追加 valueselect 元素。否则,替换集合中第 index 个元素为 value

add(element, before) 方法必须根据以下算法执行

  1. 如果 elementselect 元素的祖先,HTMLOptionsCollection 根植于该元素,则抛出一个 "HierarchyRequestError" DOMException

  2. 如果 before 是一个元素,但该元素不是 select 元素的后代,HTMLOptionsCollection 根植于该元素,则抛出一个 "NotFoundError" DOMException

  3. 如果 elementbefore 是同一个元素,则返回。

  4. 如果 before 是一个节点,则设 reference 为该节点。否则,如果 before 是一个整数,并且集合中存在第 before 个节点,则设 reference 为该节点。否则,设 reference 为 null。

  5. 如果 reference 不为 null,则设 parentreference 的父节点。否则,设 parentselect 元素,HTMLOptionsCollection 根植于该元素。

  6. 预插入 elementparent 节点,位于 reference 之前。

remove(index) 方法必须根据以下算法执行

  1. 如果集合所表示的节点数量为零,则返回。

  2. 如果 index 不是一个大于或等于 0 且小于集合所表示的节点数量的数字,则返回。

  3. element 为集合中第 index 个元素。

  4. 从其父节点中移除 element

selectedIndex IDL 属性的行为必须与 select 元素上同名属性相同,HTMLOptionsCollection 根植于该元素。

2.6.4 DOMStringList 接口

DOMStringList

所有当前引擎都支持。

Firefox1+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

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 接口支持索引属性。受支持的属性索引是关联列表的索引

DOMStringList/length

所有当前引擎都支持。

Firefox1+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

length 获取器的步骤是返回关联列表的大小

DOMStringList/item

所有当前引擎都支持。

Firefox1+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

item(index) 方法的步骤是返回关联列表中的第 index 个项目,如果 index 加 1 大于关联列表的大小,则返回 null。

DOMStringList/contains

所有当前引擎都支持。

Firefox1.5+Safari5.1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

contains(string) 方法的步骤是,如果关联列表包含 string,则返回 true,否则返回 false。