4

我今天在 IE8 的 DOM 选择元素的 JavaScript 'options' 属性的实现中发现了一些奇怪的行为。

给定以下 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。

我的问题是:根据 JavaScript 语言规范,这是预期的功能吗?这是一个已知的错误?我是否应该继续将“选项”属性视为对象,而不是专门的数组?

这不是在 Firefox 3.5、Chrome 1.0 或 Safari 3.1 下 select DOM 元素的行为方式,其中 'options' 属性作为 JavaScript 数组公开......

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

4

1 回答 1

2

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

抛开吹毛求疵,例如,DOM L2 定义HTMLSelectElement为具有options属性的对象。该属性被定义为类型HTMLOptionsCollection并表示 - “此元素包含的 OPTION 元素的集合”。

现在,引用HTMLOptionsCollection

HTMLOptionsCollection 是代表 HTML 选项元素的节点列表。可以通过序号索引或节点的名称或 id 属性访问单个节点。

注意:假定 HTML DOM 中的集合是实时的,这意味着当基础文档更改时它们会自动更新。

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

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

于 2009-09-17T05:43:41.447 回答