动态标准 — 最后更新于 2024年9月12日
反映的构建块如下
一个 反射目标 是一个元素或 ElementInternals
对象。它通常从上下文中明确,并且通常与反射 IDL 属性的接口相同。当它是一个 ElementInternals
对象时,它始终与该接口相同。
一个 反射 IDL 属性 是一个属性接口成员。
一个 反射内容属性名称 是一个字符串。当反射目标是元素时,它表示内容属性的本地名称,其命名空间为空。当反射目标是 ElementInternals
对象时,它表示反射目标的目标元素的内部内容属性映射的键。
一个反射 IDL 属性可以被定义为反射反射内容属性名称的反射目标。通常,这意味着 IDL 属性 getter 返回内容属性的当前值,而 setter 将内容属性的值更改为给定值。
如果反射目标是元素,则反射 IDL 属性还可以声明支持 ElementInternals
。这意味着 ElementInternals
接口也具有一个反射 IDL 属性,具有相同的标识符,并且该反射 IDL 属性反射相同的反射内容属性名称。
fooBar
IDL 属性必须反射foobar
内容属性并支持 ElementInternals
。
反射目标具有以下关联算法
对于一个反射目标,它是一个元素 element,这些定义如下
返回 element。
令 attribute 为运行根据命名空间和本地名称获取属性给定 null、反射内容属性名称和 element的结果。
如果 attribute 为 null,则返回 null。
返回 attribute的值。
根据命名空间和本地名称删除属性给定 null、反射内容属性名称和 element。
对于一个反射目标,它是一个 ElementInternals
对象 elementInternals,它们定义如下
返回 elementInternals的目标元素。
这导致 ElementInternals
对象的数据结构有些冗余,因为它们的目标元素的内部内容属性映射不能直接操作,因此反射仅在一个方向上发生。然而,选择这种方法是为了使定义在反射目标之间共享的 IDL 属性不太容易出错,并受益于通用的 API 语义。
类型为 DOMString
或 DOMString?
的 IDL 属性,它们反射枚举内容属性可以限制为仅已知的值。根据下面的处理模型,这些将导致此类 IDL 属性的 getter 仅返回这些枚举属性的关键字,或空字符串或 null。
getter 步骤如下
令 attributeDefinition 为 element的内容属性的属性定义,其命名空间为空,本地名称为反射内容属性名称。
如果 contentAttributeValue 为 null,则返回空字符串。
返回 contentAttributeValue。
setter 步骤是运行this的使用给定值设置内容属性。
getter 步骤如下
设置器步骤为
getter 步骤如下
令attributeDefinition为element的内容属性的属性定义,其命名空间为 null,本地名称为反射内容属性名称。
如果attributeDefinition指示它包含一个URL
如果 contentAttributeValue 为 null,则返回空字符串。
令urlString为给定contentAttributeValue相对于element的节点文档运行URL 的编码、解析和序列化的结果。
如果urlString不是失败,则返回urlString。
返回contentAttributeValue,转换为标量值字符串。
getter 步骤如下
设置器步骤为
这对应于布尔内容属性的规则。
如果一个反射 IDL 属性的类型是long
,可选地仅限于非负数,并可选地具有默认值defaultValue
getter 步骤如下
设置器步骤为
如果反射 IDL 属性是仅限于非负数并且给定值为负数,则抛出"IndexSizeError
"DOMException
。
如果一个反射 IDL 属性的类型是unsigned long
,可选地仅限于正数、仅限于正数并回退或限制在范围内[clampedMin,clampedMax],并可选地具有默认值defaultValue
getter 步骤如下
令minimum为 0。
如果contentAttributeValue不为 null
返回minimum。
设置器步骤为
如果反射 IDL 属性是仅限于正数并且给定值为 0,则抛出"IndexSizeError
"DOMException
。
令minimum为 0。
令newValue为minimum。
如果给定值在minimum到 2147483647(含)范围内,则将其设置为newValue。
使用将 newValue 转换为表示该数字的最短可能的字符串(作为 有效的非负整数)的结果,运行此对象的 设置内容属性。
范围限制 对 setter 步骤没有影响。
如果一个 反射 IDL 属性 的类型为 double
,可以选择 仅限于正数,并且可以选择具有 默认值 defaultValue
getter 步骤如下
设置器步骤为
使用给定值(转换为 该数字作为浮点数的最佳表示形式)运行此对象的 设置内容属性。
根据 Web IDL 中的定义,Infinity 和 Not-a-Number (NaN) 值在设置时会抛出异常。 [WEBIDL]
如果一个 反射 IDL 属性 的类型为 DOMTokenList
,则其 getter 步骤是返回一个 DOMTokenList
对象,其关联元素为 此对象,并且关联属性的本地名称为 反射内容属性名称。规范作者不能对这种类型的 IDL 属性使用 支持 ElementInternals
。
如果一个 反射 IDL 属性 的类型为 T?
,其中 T 为 Element
或从 Element
继承的接口,则以 attr 为 反射内容属性名称
其 反射目标 具有一个 显式设置的 attr-元素,它是一个对元素或 null 的弱引用。最初为 null。
其 反射目标 reflectedTarget 具有一个 获取 attr-关联元素 算法,该算法运行以下步骤
令 element 为运行 reflectedTarget 的 获取元素 的结果。
令 contentAttributeValue 为运行 reflectedTarget 的 获取内容属性 的结果。
如果 reflectedTarget 的 显式设置的 attr-元素 不为 null
如果 reflectedTarget 的 显式设置的 attr-元素 是 element 的任何 阴影包括祖先 的 后代,则返回 reflectedTarget 的 显式设置的 attr-元素。
返回 null。
否则,如果 contentAttributeValue 不为 null,则返回第一个满足以下条件的元素 candidate(按 树序):
如果没有这样的元素,则返回 null。
返回 null。
getter 步骤是返回运行此对象的 获取 attr-关联元素 的结果。
设置器步骤为
如果给定值为 null,则
将此对象的 显式设置的 attr-元素 设置为 null。
运行此对象的 删除内容属性。
返回。
使用空字符串运行此对象的 设置内容属性。
将此对象的 显式设置的 attr-元素 设置为对给定值的弱引用。
仅对于元素 反射目标:以下 属性更改步骤(给定 element、localName、oldValue、value 和 namespace)用于在内容属性和 IDL 属性之间同步
如果 localName 不是 attr 或 namespace 不为 null,则返回。
将 element 的 显式设置的 attr-元素 设置为 null。
这种类型的反射 IDL 属性 强烈建议其标识符以“Element
”结尾,以保持一致性。
如果一个 反射 IDL 属性 的类型为 FrozenArray<T>?
,其中 T 为 Element
或从 Element
继承的接口,则以 attr 为 反射内容属性名称
其 反射目标 具有一个 缓存的 attr-关联元素对象,它是一个 FrozenArray<T>?
。最初为 null。
其 反射目标 reflectedTarget 具有一个 获取 attr-关联元素 算法,该算法运行以下步骤
令 elements 为一个空的 列表。
令 element 为运行 reflectedTarget 的 获取元素 的结果。
如果 reflectedTarget 的 显式设置的 attr-元素 不为 null
否则
令 contentAttributeValue 为运行 reflectedTarget 的 获取内容属性 的结果。
如果 contentAttributeValue 为空,则返回 null。
令 tokens 等于 contentAttributeValue,以 ASCII 空格分隔。
对于 tokens 中的每个 id
返回 elements。
getter 步骤如下
令 elements 为运行 this 的 获取 attr 关联的元素 的结果。
如果 elements 的内容等于 this 的 缓存的 attr 关联的元素 的内容,则返回 this 的 缓存的 attr 关联的元素对象。
令 elementsAsFrozenArray 为 elements,转换为 FrozenArray<T>?
。
将 this 的 缓存的 attr 关联的元素 设置为 elements。
将 this 的 缓存的 attr 关联的元素对象 设置为 elementsAsFrozenArray。
返回 elementsAsFrozenArray。
此额外的缓存层对于保持 element.reflectedElements === element.reflectedElements
不变性是必要的。
设置器步骤为
对于元素 反射目标 仅:以下 属性更改步骤,给定 element、localName、oldValue、value 和 namespace,用于在内容属性和 IDL 属性之间同步
如果 localName 不是 attr 或 namespace 不为 null,则返回。
将 element 的 显式设置的 attr 元素 设置为 null。
反射的 IDL 属性 的这种类型强烈建议其标识符以“Elements
”结尾,以保持一致性。
反射 主要关于通过 反射的 IDL 属性 为 Web 开发人员提供类型化访问内容属性,从而改善 Web 开发人员的体验。Web 平台构建的基础是内容属性本身,即最终的真相来源。也就是说,规范作者不得使用 反射的 IDL 属性 获取器或设置器步骤,而必须使用内容属性的存在和值。(或基于其之上的抽象,例如 枚举属性 的状态。)
对此有两个重要的例外:反射的 IDL 属性 其类型是以下类型之一
对于这些,规范作者必须分别使用 反射目标 的 获取 attr 关联的元素 和 获取 attr 关联的元素。不得使用内容属性的存在和值,因为它们无法与 反射的 IDL 属性 完全同步。
反射目标 的 显式设置的 attr 元素、显式设置的 attr 元素、缓存的 attr 关联的元素 和 缓存的 attr 关联的元素对象 应被视为内部实现细节,不得依赖于它们。
HTMLFormControlsCollection
和 HTMLOptionsCollection
接口是从 HTMLCollection
接口派生的 集合。 HTMLAllCollection
接口是一个 集合,但不是如此派生。
HTMLAllCollection
接口HTMLAllCollection
接口用于旧版 document.all
属性。它的操作方式类似于 HTMLCollection
;主要区别在于它允许其方法的各种令人震惊的不同(滥用)最终返回某些内容,并且可以将其作为函数调用作为属性访问的替代方法。
所有 HTMLAllCollection
对象都根植于 Document
并且具有匹配所有元素的过滤器,因此 HTMLAllCollection
对象的 集合表示的元素 由根 Document
的所有后代元素组成。
实现 HTMLAllCollection
接口的对象是 旧版平台对象,具有在 下面部分 中描述的附加 [[Call]] 内部方法。它们还有一个 [[IsHTMLDDA]] 内部插槽。
实现 HTMLAllCollection
接口的对象具有几种异常行为,因为它们具有 [[IsHTMLDDA]] 内部插槽
当给定实现 HTMLAllCollection
接口的对象时,JavaScript 中的 ToBoolean 抽象操作返回 false。
当给定实现 HTMLAllCollection
接口的对象时,IsLooselyEqual 抽象操作在与 undefined
和 null
值进行比较时返回 true。(使用 IsStrictlyEqual 抽象操作进行的比较以及与其他值(如字符串或对象)的 IsLooselyEqual 比较不受影响。)
当应用于实现 HTMLAllCollection
接口的对象时,JavaScript 中的 typeof
运算符返回字符串 "undefined"
。
这些特殊行为的动机是为了希望与两类旧版内容兼容:一类使用 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
属性的所有非空值,按照树的顺序排列,忽略后续的重复项,如果元素同时包含id
和name
属性,且两者不同,并且都不与前面出现的条目重复,则元素的id
属性优先于name
属性。
length
获取器的步骤是返回集合中包含的节点数。
索引属性的获取器必须返回从当前对象中获取“all”索引的元素的结果,其中传递的参数为索引值。
namedItem(name)
方法的步骤是返回从当前对象中获取“all”命名的元素的结果,其中传递的参数为name
。
item(nameOrIndex)
方法的步骤是
如果未提供nameOrIndex
,则返回null。
返回从当前对象中获取“all”索引的或命名的元素的结果,其中传递的参数为nameOrIndex
。
以下元素是"all"命名的元素:a
、button
、embed
、form
、frame
、frameset
、iframe
、img
、input
、map
、meta
、object
、select
和textarea
。
从HTMLAllCollection
collection中获取“all”索引的元素,给定索引index
,返回collection
中的第index
个元素,如果不存在第index
个元素,则返回null。
从HTMLAllCollection
collection中获取“all”命名的元素,给定名称name
,执行以下步骤
如果name
为空字符串,则返回null。
令subCollection
为一个HTMLCollection
对象,其根节点与collection
的Document
相同,其过滤器仅匹配以下元素:
"all"命名的元素,其name
属性等于name
,或者
其ID等于name
的元素。
如果subCollection
中恰好包含一个元素,则返回该元素。
否则,如果subCollection
为空,则返回null。
否则,返回subCollection
。
从HTMLAllCollection
collection中获取“all”索引的或命名的元素,给定nameOrIndex
如果将nameOrIndex
转换为JavaScript字符串值后,是一个数组索引属性名称,则返回从collection
中获取“all”索引的元素的结果,其中传递的参数为nameOrIndex
表示的数字。
返回从collection
中获取“all”命名的元素的结果,其中传递的参数为nameOrIndex
。
如果argumentsList
的大小为零,或者argumentsList[0]
未定义,则返回null。
令result
为从当前HTMLAllCollection
中获取“all”索引的或命名的元素的结果,其中传递的参数为nameOrIndex
。
返回将result
转换为ECMAScript值的结果。
thisArgument
会被忽略,因此诸如Function.prototype.call.call(document.all, null, "x")
之类的代码仍然会搜索元素。(document.all.call
不存在,因为document.all
没有继承自Function.prototype
。)
HTMLFormControlsCollection
接口HTMLFormControlsCollection
接口用于form
元素中集合的列出元素。
所有当前引擎都支持。
所有当前引擎都支持。
[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
所有当前引擎都支持。
radioNodeList = collection.namedItem(name)
element = collection[name]
radioNodeList = collection[name]
从collection
中返回具有ID或name
为name
的项。
如果有多个匹配项,则返回包含所有这些元素的RadioNodeList
对象。
radioNodeList.value
返回由radioNodeList
表示的第一个选中的单选按钮的值。
radioNodeList.value = value
选中由radioNodeList
表示的第一个值等于value
的单选按钮。
对象的支持的属性索引与HTMLCollection
对象的定义相同。
“支持的属性名称” 由所有元素的id
和 name
属性的所有非空值组成,这些元素由集合表示,按照树的顺序,忽略后面的重复项,如果一个元素同时具有id
和 name
属性,并且它们彼此不同,并且两者都不是前面条目的重复项,则该元素的id
优先于其name
。
namedItem(name)
方法必须按照以下算法执行
id
属性或name
属性等于name,则返回该节点并停止算法。id
属性或name
属性等于name,则返回 null 并停止算法。RadioNodeList
对象,该对象表示HTMLFormControlsCollection
对象的实时视图,并进一步过滤,以便RadioNodeList
对象中的唯一节点是那些具有id
属性或name
属性等于name的节点。RadioNodeList
对象中的节点必须按照树的顺序排序。RadioNodeList
对象。从NodeList
接口继承的RadioNodeList
接口的成员必须像在NodeList
对象上一样。
所有当前引擎都支持。
RadioNodeList
对象上的value
IDL 属性在获取时必须返回运行以下步骤的结果
令element 为RadioNodeList
对象表示的树的顺序中的第一个元素,该元素是input
元素,其type
属性处于单选按钮状态,并且其选中状态为 true。否则,令其为 null。
如果element 为 null,则返回空字符串。
如果element 是没有value
属性的元素,则返回字符串“on
”。
否则,返回element 的value
属性的值。
在设置时,
IDL 属性必须运行以下步骤value
如果新值为字符串“on
”:令element 为RadioNodeList
对象表示的树的顺序中的第一个元素,该元素是input
元素,其type
属性处于单选按钮状态,并且其value
内容属性不存在或存在且等于新值(如果有)。如果没有这样的元素,则改为令element 为 null。
否则:令element 为RadioNodeList
对象表示的树的顺序中的第一个元素,该元素是input
元素,其type
属性处于单选按钮状态,并且其value
内容属性存在且等于新值(如果有)。如果没有这样的元素,则改为令element 为 null。
如果element 不为 null,则将其选中状态设置为 true。
HTMLOptionsCollection
接口所有当前引擎都支持。
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中返回具有ID或name
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
设置器步骤如下
设 current 为集合所表示的节点的数量。
如果给定值大于 current,则
如果给定值小于 current,则
设 n 为 current − value。
从其父节点中移除集合中的最后 n 个节点。
设置 length
永远不会移除或添加任何 optgroup
元素,也不会向现有的 optgroup
元素添加新的子节点(尽管它可以移除其子节点)。
受支持的属性名称包括所有元素所表示的集合的所有 id
和 name
属性的非空值,按照树的顺序,忽略后面的重复项,如果一个元素同时具有 id
和 name
属性,且它们彼此不同,并且两者都不是前面条目的重复项,则该元素的 id
位于其 name
之前。
当用户代理需要设置新索引属性的值或设置现有索引属性的值(对于给定的属性索引 index,设置为新值 value)时,它必须运行以下算法
如果 value 为 null,则使用 index 作为参数调用 remove
方法的步骤,并返回。
设 length 为集合所表示的节点的数量。
设 n 为 index 减去 length。
如果 n 大于零,则追加一个 DocumentFragment
,该片段由 n-1 个新的 option
元素(无属性且无子节点)组成,追加到 select
元素,HTMLOptionsCollection
根植于该元素。
如果 n 大于或等于零,则追加 value 到 select
元素。否则,替换集合中第 index 个元素为 value。
add(element, before)
方法必须根据以下算法执行
如果 element 是 select
元素的祖先,HTMLOptionsCollection
根植于该元素,则抛出一个 "HierarchyRequestError
" DOMException
。
如果 before 是一个元素,但该元素不是 select
元素的后代,HTMLOptionsCollection
根植于该元素,则抛出一个 "NotFoundError
" DOMException
。
如果 element 和 before 是同一个元素,则返回。
如果 before 是一个节点,则设 reference 为该节点。否则,如果 before 是一个整数,并且集合中存在第 before 个节点,则设 reference 为该节点。否则,设 reference 为 null。
如果 reference 不为 null,则设 parent 为 reference 的父节点。否则,设 parent 为 select
元素,HTMLOptionsCollection
根植于该元素。
预插入 element 到 parent 节点,位于 reference 之前。
remove(index)
方法必须根据以下算法执行
如果集合所表示的节点数量为零,则返回。
如果 index 不是一个大于或等于 0 且小于集合所表示的节点数量的数字,则返回。
设 element 为集合中第 index 个元素。
从其父节点中移除 element。
selectedIndex
IDL 属性的行为必须与 select
元素上同名属性相同,HTMLOptionsCollection
根植于该元素。
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
接口支持索引属性。受支持的属性索引是其关联列表的索引。
所有当前引擎都支持。
所有当前引擎都支持。
item(index)
方法的步骤是返回其关联列表中的第 index 个项目,如果 index 加 1 大于其关联列表的大小,则返回 null。
所有当前引擎都支持。
contains(string)
方法的步骤是,如果其关联列表包含 string,则返回 true,否则返回 false。