Записки самоучки

Декабрь 22, 2006

У атрибутов id и name общее пространство имен в Opera`е и IE`е

Filed under: DOM,Броузеры,Глюки,HTML,JavaScript — 4matic @ 12:28 дп

Представим ситуацию. У вас сложная форма с достаточно большим количеством элементов. Для доступа к некоторым элементам в скрипте вы используете тривиальную конструкцию document.getElementById(). К своему удивлению вы обнаруживаете, что атрибуты объекта отличаются от тех, которые вы ожидаете увидеть. Возможно причина в том, что у вас совпадают значения атрибута id одного объекта и атрибута name другого объекта. Пример:

<input type=»text» name=»test» id=»bad_id»>
<input type=»button» id=»test» onclick=’alert(document.getElementById(«test»).id)’>

Так вот, если мы кликнем по кнопке, то должны получить сообщение «test». НО. Вы получите ожидаемый результат только в Firefox, а вот в Opera и IE вы получите неожиданный результат в виде сообщения «id_test».

Согласно документации getElementById() возвращает первый найденный объект с искомым id. Согласно той же документации id должен быть уникальным, а вот name может повторяться.

В примере мы делаем все правильно и получаем некорректный результат. Скорее всего проблема в том, что в Opera и IE для name и id отведено общее пространство имён. А этого быть не должно. Немного погугилив я нашёл достаточно большое количество ссылок по озвученному вопросу. Показательными я считаю вот эти две:

  1. document.getElementById() returns element with name equal to id specified
  2. Element Name vs Id

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

Как решить проблему?

Очень просто. Давать атрибутам id и name логичные значения. Ситуации, когда два разных объекта могут называться одинаково нужно еще поискать.

Если с логикой туго, то давать всем объектам уникальные id и name, уникальные в общем пространстве имен.

А еще лучше разработчикам браузеров устранить баг.

P.S. Нужно будет поэксперементировать с js-фреймворками.

8 комментариев »

  1. Ну ничего себе! Уж чего, а такого не ожидал от браузероклепателей!

    комментарий от Dmytro Shteflyuk — Декабрь 22, 2006 @ 2:54 дп

  2. Добавлю еще, что теперь становится понятно, какого лешего ASP.NET генерит имена по абсолютно разным схемам для name и ID при том, что и та, и другая схема может использоваться и для той, и для другой цели:

    name: cont$pnlNews$txtName
    ID: cont_pnlNews_txtName

    комментарий от Dmytro Shteflyuk — Декабрь 22, 2006 @ 2:57 дп

  3. Мда, единства в браузерах не будет никогда. Впрочем, это хлеб для нас, разработчиков :)))

    комментарий от Vlad — Декабрь 22, 2006 @ 12:14 пп

  4. Дело не в единстве браузеров, а в том, что иногда браузеры не поддерживают единые стандарты. И единство браузреов — это уже следствие. В заметке вообще описан баг. А для разработчиков — это неприятность, а иногда и неприятная неожиданность, когда разработчик тестил все в Лисе, а у заказчика стоит версия древного ИЕ.

    комментарий от 4matic — Декабрь 22, 2006 @ 1:05 пп

  5. С данным багом столкнулся лично, бился головой об стену, думал «меня глючит», в голову тогда не укладывалось что такое возможно, правда тогда мы решели, что это глюк какой-то, связанный с неправильным парсеньем разметки (там в проэкте очемь много вложенных таблиц куча форм и т.п. на странице)

    комментарий от standov — Март 24, 2007 @ 12:01 дп

  6. Какой это баг? Про общее пространство имен написано аж в 1999 году.
    Note that this attribute shares the same name space as the id attribute.
    Ссылка http://www.w3.org/TR/html401/struct/links.html#adef-name-A.

    Мне совершенно непонятно, почему люди не хотят читать то, что напрямую относится к теме…

    комментарий от Петров — Сентябрь 26, 2007 @ 11:18 пп

  7. За ссылку спасибо, но я уже давно нашел приведенную вами фразу в мане, но озвучить этот момент в блоге забыл.

    комментарий от 4matic — Сентябрь 27, 2007 @ 9:29 дп

  8. Все-таки баг, ф-ия getElementById, а берется элемент с таким name, в опере кстати исправили, только в IE осталось😦

    комментарий от sc — Сентябрь 25, 2008 @ 5:12 дп


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: