我今天在IE8的DOM select元素的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'属性视为一个对象,而不是特别是一个数组吗?

这不是选择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

  

HTMLOptionsCollection是一个列表   表示HTML选项的节点   元件。单个节点可以是   通过序数索引或   节点的名称或id属性。

     

注意:HTML DOM中的集合是   假设是活的意思是他们   当时自动更新   基础文件已更改。

从技术上讲,没有任何阻止 HTMLSelectElement 等于其 HTMLOptionsCollection (至少在DOM L2规范中)。只要符合标准行为(即元素可通过索引或名称/ id访问,接口属性/方法 - 例如 item length - 实现,实现就完全符合要求如指定的那样。)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top