Internet Explorer id & name bug?
Рубрика: Development, JavaScript/Ajax | 4 December 2006, 15:21 |
Vadim Voituk
Такую интересную ошибку нашел в JavaScript-обработчике InternetExplorer.
Предположим в документе есть элемент с name=”imp1″ и за ним идет элемент с id=”imp1″.
При попытке получить второй обьект по с помощью getElementById(“imp1″) InternetExplorer возвращает первый элемент (тобишь тот у которого name=”imp1″).
Пример:
[xml] <input type="text" name="imp1" value="Неправильно! id=imp2, name=imp1" id="imp2" /> <input type="text" name="blah" value="Правильно! id=imp1" id="imp1" /> <input type="button" onClick="alert(document.getElementById(str).value);" value="Тест id=imp1" /> [/xml]
Если открыть этот документ в FireFox, то при нажатии на кнопку получим текст “Правильно! id=imp1″
Если же в Internet Explorer – то “Неправильно! id=imp2, name=imp1″
Причина скорее всего кроется в том, что IE использует один хэш document.all для хранения ссылок по id и по name, а getElementById() использует именно этот хэш.
Tweet
http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getelementbyid.asp
По этой документации 100% баг.
“Returns the first object with the same ID attribute as the specified value.”
должен возвращать первый объект у которого ID равен указанному значению. Про аттрибут name не сказано ничего.
Спасибо за ссылку.
а вот что говорит по этому поводу w3c:
getElementById introduced in DOM Level 2
Returns the Element whose ID is given by elementId. If no such element exists, returns null. Behavior is not defined if more than one element has this ID.
Note: The DOM implementation must have information that says which attributes are of type ID. Attributes with the name “ID” are not of type ID unless so defined. Implementations that do not know whether attributes are of type ID or not are expected to return null.
http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/core.html
А кто-то пробовал проверить на IE7?
Может все-таки поправили?
w3c также говорит, что в HTML4 – “The id and name attributes share the same name space” http://www.w3.org/TR/html4/struct/links.html#anchors-with-id
а FF говорит, что у DOM-Level-2 круче HTML4 ;-), и поэтому их реализация getElementById соответствует DOM-спецификации http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-getElBId, да и вообще, про “id and name attributes namespace” было написано в секции “12.2 The A element”, и применять это ко всем тегам (а не только тегу A), явно не сказано ;-)
Так что это не баг в IE или Opera (которая имеет такое же поведение).
Но я бы также и не назвал это багом FF – это просто такая особенность, о которой следует помнить.
Равно как и помнить об особенностях getElementsByName в той же DOM-спецификации – http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-71555259
Ушел изучать приведенные ссылки.
Михаил, откуда такие точные, почти дословные, знания спецификаций?
Просто проблема уже давняя, я с ней столкнулся год-два тому. Тогда и разбирался, что к чему. Нужные ссылки сохранил в букмарках.