我今天在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元素本身)。
答案 0 :(得分:2)
首先,这与JavaScript语言无关,而是与DOM相关:)
除了挑剔之外,DOM L2例如将HTMLSelectElement
定义为具有options
属性的对象。该属性被定义为类型HTMLOptionsCollection
并表示 - “此元素包含的OPTION元素的集合。”
现在,引用HTMLOptionsCollection
:
HTMLOptionsCollection是一个列表 表示HTML选项的节点 元件。单个节点可以是 通过序数索引或 节点的名称或id属性。
注意:HTML DOM中的集合是 假设是活的意思是他们 当时自动更新 基础文件已更改。
从技术上讲,没有任何阻止 HTMLSelectElement
等于其HTMLOptionsCollection
(至少在DOM L2规范中)。只要符合标准行为(即元素可通过索引或名称/ id访问,并且接口属性/方法 - 例如item
和length
- 按指定实现),实现就完全符合。
options
等于什么并不重要。与往常一样,最好的办法是以符合标准的方式设计脚本(然后才能解决任何已知的缺陷)。