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() использует именно этот хэш.

Комментариев: 5

5 Responses to “Internet Explorer id & name bug?”

Комментарии:

  1. chizar

    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 не сказано ничего.

  2. vadim

    Спасибо за ссылку.

    а вот что говорит по этому поводу 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?
    Может все-таки поправили?

  3. Михаил

    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

  4. vadim

    Ушел изучать приведенные ссылки.

    Михаил, откуда такие точные, почти дословные, знания спецификаций?

  5. Михаил

    Просто проблема уже давняя, я с ней столкнулся год-два тому. Тогда и разбирался, что к чему. Нужные ссылки сохранил в букмарках.

Leave a Reply