Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Глюк IE c document.getElementById (https://javascript.ru/forum/events/2434-glyuk-ie-c-document-getelementbyid.html)

Андрей Параничев 25.12.2008 02:08

Глюк 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>

Gvozd 25.12.2008 03:25

?
и вправду странно
более того могу сказать что у меня в опере(9.10) аналогичная байда

Андрей Параничев 25.12.2008 04:24

По крайней мере в Opera 9.51 такого безобразия нету.

Gvozd 25.12.2008 11:39

ВОзможно.
в старой опере JS вообще, глючный.
на основании выдачи гугла интуитивно пришел к еще такому.
Если использовать другие теги(не относящиеся к форме), то осел начинает их обрабатывать нормально.
А вот опера моя все еще репенится.
ОСел с помощью этой ф-кции ищет сначала в неймах всяких форм, и только потом в остальных местах
как-то так.
большего пока не нагуглил.
есть предположение что можно поигратся с DOCTYPE, но к сожалению я даже понятия не имею какие варианты там допустимы

Octane 25.12.2008 12:36

В IE8 в QuirksMode тоже так, а в Standart Compliance Mode все нормально :) Остальные ведут себя одинаково плохо в обоих режимах.

Андрей Параничев 25.12.2008 16:11

Я долго ловил эту багу. Ну не как не мог понять, почему поле ввода логина (получаемое по 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, так и имя элемента.

Андрей Параничев 25.12.2008 16:22

Кстати такая же ситуация со всеми поисками 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>

Kolyaj 25.12.2008 16:27

Ну просто в ИЕ id и name равнозначны.

tolyavrn 02.08.2010 16:43

Как не парадоксально это звучит, при использовании переменных помогает выкрутиться абревиатура var.

person = document.getElementById('person').value;
var phone  = document.getElementById('phonexxx').value;


Первая строчка работала без вопросов, а вот вторая без var начала глушить IE8.

UDN 23.10.2011 19:54

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:39.