I’ve today discovered some strange behaviour in IE8’s implementation of the DOM select element’s JavaScript ‘options’ property.
Given the following HTML:
<select id="sel"><option value="val">An option</option></select>
And the javascript:
var sel = document.getElementById('sel');
alert(sel === sel.options); //alerts 'true' in IE8
Obviously, the clever fellow writing the select implementation on IE8 has written an indexer on the select element, and then had it expose itself as its own ‘options’ property to JavaScript.
My question is: is this expected functionality, according to the JavaScript language spec? Is this a known bug? Should I continue to treat the ‘options’ property as an object, rather than specifically an Array?
This is not how the select DOM element behaves under Firefox 3.5, Chrome 1.0, or Safari 3.1, where the ‘options’ property is exposed as a JavaScript array…
For reference, I came across this when I passed the ‘options’ property to the jQuery constructor in order to wrap its elements. Rather than the expected result of a jQuery object with X elements (as occured using Firefox, Chrome and Safari), I was returned a jQuery object with 1 element (the select element itself).
First of all, this is not related to JavaScript language, but rather to DOM 🙂
Nitpicking aside, DOM L2, for example, defines
HTMLSelectElementas an object havingoptionsproperty. That property is defined to be of typeHTMLOptionsCollectionand represents – “The collection of OPTION elements contained by this element.”Now, to quote
HTMLOptionsCollection:Technically, there’s nothing preventing
HTMLSelectElementbeing equal to itsHTMLOptionsCollection(not in DOM L2 specs, at least). Implementation is fully compliant as long as it matches standard behavior (i.e. elements are accessible by index or name/id and interface properties/methods – such asitemandlength– are implemented as specified).Frankly, I don’t see why you would care about this peculiarity. If accessing elements by index/name works, it shouldn’t matter what
optionsis equal to. As always, best bet is to design scripts in standard-compliant manner (and only then work around any known deficiencies).