четверг, 5 марта 2009 г.

Метод getElementById() в IE или "при чем тут name?"

Здравствуйте! Если Вы читаете эту статью, возможно, вы столкнулись с той же проблемой что и я и находитесь в небольшом замешательстве. Я сам когда-то столкнулся с ситуацией когда javascript'овый метод getElementById() возвращал мне ссылку не на тот объект который я запрашивал. Пришлось потратить немного времени чтобы выяснить в чем же всетаки дело.

На сайте http://www.w3schools.com в разделе Javascript черным по белому написано определение метода getElementById(). Выглядит оно так:

The getElementById() method returns a reference to the first object with the specified ID.
Из данных слов понятно, что этот метод возвращает ссылку на обьект с указанным идентификатором. Так оно и есть конечно, не думайте что я пытаюсь это оспорить :). А вот ребята из Microsoft со своим Internet Explorer'ом оспорили.

getElementById возвращает ссылку на объект с указанным name?

Рассмотрим небольшой пример. Создадим несколько элементов у которых бы совпадали атрибуты id и name:
<textarea name="chooseMe"></textarea>
<div id="chooseMe" />

А теперь попробуем вывести на экран сообщение с именем нужной нам ноды (nodeName):

alert(document.getElementById('chooseMe').nodeName);

Выполнение данного скрипта судя по названию метода должно вывести на экран сообщение с текстом DIV во всех браузерах. Жаль что используя IE6 или IE7 мы увидим ничто иное как окошко с текстом TEXTAREA. А какая разница между именем или айди? IE думает, что никакой.

Будьте внимательны используя элементы с совпадающими именами и идентификаторами когда используете браузеры компании Microsoft. Ну а если Вам это так необходимо, просто добавьте приставку значению имени или айди определенного элемента или же учитывайте порядок поиска "сверху вниз".

4 комментария:

Анонимный комментирует...

Сие удивительно!
Столкнулся с той же проблемой! Спасибо.

Анонимный комментирует...

Можно вопрос по поводу IE ? Я на stackoverflow его уже задавал, но не получил ответа...

http://stackoverflow.com/questions/8007068/javascript-changing-disabled-property-in-ie8-causes-component-to-resize-and-th

Ошибка заключается в диком ресайзе компонента. Не знаю как его избежать.

Razor комментирует...

ну вообще правильное свойство атрибута disabled - это disabled!
disabled='disabled' и никак иначе.. работает абсолютно во всех браузерах.

чтобы убрать - el.removeAttribute("disabled");

попробуйте таблице задать свойство css table-layout:fixed; А также задать ширину колонок с помощью тегов col

<table ....>
<col width="40%">
<col width="20%">
<col width="40%">
<tbody>
....
</tbody>
</table>

Анонимный комментирует...

table-layout:fixed; это то что нужно! огромное СПАСИБО!

головоломка месяца решена :-))