Глюк IE c document.getElementById
Комментарии, по моему, излишни:
<html> <head> <title></title> <script> onload = function() { alert(document.getElementById("username").id); } </script> <body> <input id="notausernameatall" name="username" size="25" value="id = notausernameatall" /> <input id="username" name="login" size="25" value="id = username" /><br /> <p> Выполняется alert(document.getElementById("username").id). Ну не идиотизм ли? </p> </body> </html> |
?
и вправду странно более того могу сказать что у меня в опере(9.10) аналогичная байда |
По крайней мере в Opera 9.51 такого безобразия нету.
|
ВОзможно.
в старой опере JS вообще, глючный. на основании выдачи гугла интуитивно пришел к еще такому. Если использовать другие теги(не относящиеся к форме), то осел начинает их обрабатывать нормально. А вот опера моя все еще репенится. ОСел с помощью этой ф-кции ищет сначала в неймах всяких форм, и только потом в остальных местах как-то так. большего пока не нагуглил. есть предположение что можно поигратся с DOCTYPE, но к сожалению я даже понятия не имею какие варианты там допустимы |
В IE8 в QuirksMode тоже так, а в Standart Compliance Mode все нормально :) Остальные ведут себя одинаково плохо в обоих режимах.
|
Я долго ловил эту багу. Ну не как не мог понять, почему поле ввода логина (получаемое по id) всегда пустое, причем только в IE. Оказалось есть в шапке поле ввода с именем, которое совпадает с этим id, из-за чего находилось оно, а не то, которое нужно было мне.
По поводу природы этого бага: как все знают, в MSDOM все элементы попадают в коллекции, например document.all, где они становятся доступны по своему id или имени. Например, в случае моего примера из первого поста, оба поля доступны через: alert(document.all.username[0].id); // "notausernameatall" alert(document.all.username[1].id); // "username" Есть вероятность, что функция document.getElementById в IE стоит на костыле, который основан на MSDOM. Причем из коллекции берут только первый элемент, не проверяя по id ли он записан, или по имени. Других рациональных объяснений я не вижу. Кстати подобный глюк есть с HTMLCollection.namedItem, где IE одинаково воспринимает как id, так и имя элемента. |
Кстати такая же ситуация со всеми поисками DOM. И не зависит от типа элементов.
<html> <head> <title></title> <script> onload = function() { alert(document.getElementsByName("username")[0].tagName); // "A" } </script> <body> <a id="username" href="#">Что-то</a> <input name="username" size="25" value="" /> </body> </html> |
Ну просто в ИЕ id и name равнозначны.
|
Как не парадоксально это звучит, при использовании переменных помогает выкрутиться абревиатура var.
person = document.getElementById('person').value; var phone = document.getElementById('phonexxx').value; Первая строчка работала без вопросов, а вот вторая без var начала глушить IE8. |
1) Идиотизмом обладают объекты наделенные интеллектом, но никак не субъекты.
2) getElementBy(Id|Name) - возвращают первый элемент колекции 3) Id и Name - нужны для совместимости со старыми версиями броузеров 4) Объекты это своего рода массивы объектов, отсюда слудует elements['name'], а не elements['id=name'] или elements['name="name"'] Создавая элементы с одинаковыми уникальными именами вы создаете коллекцию объектов, это значит что в вашем случае username.length=2 <html> <head> <title></title> <script> onload = function() { alert(["username.length",username.length+"\nusername.value ",username.value+"\nusername[0].value ",username[0].value+"\nusername[1].value ",username[1].value]); } </script> </head> <body> <input id="notausernameatall" name="username" size="25" value="id = notausernameatall" /> <input id="username" name="login" size="25" value="id = username" /><br /> <p> Выполняется alert(document.getElementById("username").id). Ну не идиотизм ли? </p> </body> </html> |
Часовой пояс GMT +3, время: 10:52. |