Представим ситуацию. У вас сложная форма с достаточно большим количеством элементов. Для доступа к некоторым элементам в скрипте вы используете тривиальную конструкцию 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 отведено общее пространство имён. А этого быть не должно. Немного погугилив я нашёл достаточно большое количество ссылок по озвученному вопросу. Показательными я считаю вот эти две:
Пойдя по первой ссылке мы увидим, что о баге известно уже больше года. Пойдя по второй ссылке мы получим трактование и описание аналогичное моему.
Как решить проблему?
Очень просто. Давать атрибутам id и name логичные значения. Ситуации, когда два разных объекта могут называться одинаково нужно еще поискать.
Если с логикой туго, то давать всем объектам уникальные id и name, уникальные в общем пространстве имен.
А еще лучше разработчикам браузеров устранить баг.
P.S. Нужно будет поэксперементировать с js-фреймворками.



Ну ничего себе! Уж чего, а такого не ожидал от браузероклепателей!
Комментарий от Dmytro Shteflyuk — Декабрь 22, 2006 @ 2:54 дп
Добавлю еще, что теперь становится понятно, какого лешего ASP.NET генерит имена по абсолютно разным схемам для name и ID при том, что и та, и другая схема может использоваться и для той, и для другой цели:
name: cont$pnlNews$txtName
ID: cont_pnlNews_txtName
Комментарий от Dmytro Shteflyuk — Декабрь 22, 2006 @ 2:57 дп
Мда, единства в браузерах не будет никогда. Впрочем, это хлеб для нас, разработчиков
))
Комментарий от Vlad — Декабрь 22, 2006 @ 12:14 пп
Дело не в единстве браузеров, а в том, что иногда браузеры не поддерживают единые стандарты. И единство браузреов – это уже следствие. В заметке вообще описан баг. А для разработчиков – это неприятность, а иногда и неприятная неожиданность, когда разработчик тестил все в Лисе, а у заказчика стоит версия древного ИЕ.
Комментарий от 4matic — Декабрь 22, 2006 @ 1:05 пп
С данным багом столкнулся лично, бился головой об стену, думал «меня глючит», в голову тогда не укладывалось что такое возможно, правда тогда мы решели, что это глюк какой-то, связанный с неправильным парсеньем разметки (там в проэкте очемь много вложенных таблиц куча форм и т.п. на странице)
Комментарий от standov — Март 24, 2007 @ 12:01 дп
Какой это баг? Про общее пространство имен написано аж в 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 пп
За ссылку спасибо, но я уже давно нашел приведенную вами фразу в мане, но озвучить этот момент в блоге забыл.
Комментарий от 4matic — Сентябрь 27, 2007 @ 9:29 дп
Все-таки баг, ф-ия getElementById, а берется элемент с таким name, в опере кстати исправили, только в IE осталось
Комментарий от sc — Сентябрь 25, 2008 @ 5:12 дп