IE8 JavaScript: поведение select.options - PullRequest
4 голосов
/ 17 сентября 2009

Сегодня я обнаружил странное поведение в реализации IE8 свойства «параметров» JavaScript элемента выбора DOM.

С учетом следующего 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

Очевидно, умный сотрудник, пишущий реализацию select на IE8, написал индексатор на элементе select, а затем предоставил JavaScript в качестве своего собственного свойства 'options'.

Мой вопрос : это ожидаемая функциональность, согласно спецификации языка JavaScript? Это известная ошибка? Должен ли я продолжать обрабатывать свойство 'options' как объект, а не как массив?

Это не то, как элемент select DOM ведет себя в Firefox 3.5, Chrome 1.0 или Safari 3.1, где свойство 'options' представлено в виде массива JavaScript ...

Для справки, я столкнулся с этим, когда передал свойство 'options' конструктору jQuery, чтобы обернуть его элементы. Вместо ожидаемого результата объекта jQuery с элементами X (как это было сделано с использованием Firefox, Chrome и Safari) мне был возвращен объект jQuery с 1 элементом (сам элемент select).

1 Ответ

2 голосов
/ 17 сентября 2009

Прежде всего, это не связано с языком JavaScript, а скорее с DOM:)

Не обращая внимания, например, DOM L2 определяет HTMLSelectElement как объект, обладающий свойством options. Это свойство определено как тип HTMLOptionsCollection и представляет - «Коллекция элементов OPTION, содержащихся в этом элементе».

Теперь, чтобы процитировать HTMLOptionsCollection:

Коллекция HTMLOptionsCollection представляет собой список узлы, представляющие опцию HTML элемент. Отдельный узел может быть доступ по порядковому индексу или атрибуты имени или идентификатора узла.

Примечание. Коллекции в HTML DOM Предполагается, что в прямом эфире означает, что они автоматически обновляются, когда базовый документ изменен.

Технически, ничто не мешает HTMLSelectElement быть равным HTMLOptionsCollection (по крайней мере, не в спецификации DOM L2). Реализация полностью совместима, если она соответствует стандартному поведению (то есть элементы доступны по индексу или по имени / идентификатору, а свойства / методы интерфейса - такие как item и length - реализованы, как указано).

Честно говоря, я не понимаю, почему вы заботитесь об этой особенности. Если доступ к элементам по индексу / имени работает, не должно иметь значения, чему равен options. Как всегда, лучше всего разрабатывать сценарии в соответствии со стандартами (и только тогда обходить все известные недостатки).

...