IE8 JavaScript:select.options行为

我今天在IE8的DOM选择元素的
JavaScript‘选项’属性的实现中发现了一些奇怪的行为.

给出以下HTML:

<select id="sel"><option value="val">An option</option></select>

和javascript:

var sel = document.getElementById('sel');
alert(sel === sel.options); //alerts 'true' in IE8

显然,在IE8上编写select实现的聪明人已经在select元素上编写了一个索引器,然后让它将自己暴露为JavaScript自己的’options’属性.

我的问题是:根据JavaScript语言规范,这是预期的功能吗?这是一个已知的错误?我应该继续将’options’属性视为对象,而不是特别是Array吗?

这不是选择DOM元素在Firefox 3.5,Chrome 1.0或Safari 3.1下的行为,其中’options’属性作为JavaScript数组公开…

作为参考,当我将’options’属性传递给jQuery构造函数以包装其元素时,我遇到了这个问题.我没有使用带有X元素的jQuery对象的预期结果(使用Firefox,Chrome和Safari),而是返回了一个带有1个元素的jQuery对象(select元素本身).

最佳答案 首先,这与JavaScript语言无关,而是与DOM相关:)

除了挑剔之外,DOM L2例如将HTMLSelectElement定义为具有options属性的对象.该属性定义为HTMLOptionsCollection类型,表示 – “此元素包含的OPTION元素集合”.

现在,引用HTMLOptionsCollection:

An HTMLOptionsCollection is a list of
nodes representing HTML option
element. An individual node may be
accessed by either ordinal index or
the node’s name or id attributes.

Note: Collections in the HTML DOM are
assumed to be live meaning that they
are automatically updated when the
underlying document is changed.

从技术上讲,没有什么可以阻止HTMLSelectElement等于其HTMLOptionsCollection(至少在DOM L2规范中).只要符合标准行为(即元素可通过索引或名称/ id访问,并且接口属性/方法 – 例如项目和长度 – 按指定实现),实现就完全符合要求.

坦率地说,我不明白为什么你会关心这种特殊性.如果按索引/名称访问元素有效,那么哪个选项相等无关紧要.一如既往,最好的办法是以符合标准的方式设计脚本(然后才能解决任何已知的缺陷).

点赞