Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.12.2008, 02:08
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

Последний раз редактировалось Андрей Параничев, 25.12.2008 в 04:28.
Ответить с цитированием
  #2 (permalink)  
Старый 25.12.2008, 03:25
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

?
и вправду странно
более того могу сказать что у меня в опере(9.10) аналогичная байда
Ответить с цитированием
  #3 (permalink)  
Старый 25.12.2008, 04:24
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

По крайней мере в Opera 9.51 такого безобразия нету.
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2008, 11:39
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

ВОзможно.
в старой опере JS вообще, глючный.
на основании выдачи гугла интуитивно пришел к еще такому.
Если использовать другие теги(не относящиеся к форме), то осел начинает их обрабатывать нормально.
А вот опера моя все еще репенится.
ОСел с помощью этой ф-кции ищет сначала в неймах всяких форм, и только потом в остальных местах
как-то так.
большего пока не нагуглил.
есть предположение что можно поигратся с DOCTYPE, но к сожалению я даже понятия не имею какие варианты там допустимы
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2008, 12:36
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

В IE8 в QuirksMode тоже так, а в Standart Compliance Mode все нормально Остальные ведут себя одинаково плохо в обоих режимах.
Ответить с цитированием
  #6 (permalink)  
Старый 25.12.2008, 16:11
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Я долго ловил эту багу. Ну не как не мог понять, почему поле ввода логина (получаемое по 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, так и имя элемента.
Ответить с цитированием
  #7 (permalink)  
Старый 25.12.2008, 16:22
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

Последний раз редактировалось Андрей Параничев, 25.12.2008 в 16:27.
Ответить с цитированием
  #8 (permalink)  
Старый 25.12.2008, 16:27
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Ну просто в ИЕ id и name равнозначны.
Ответить с цитированием
  #9 (permalink)  
Старый 02.08.2010, 16:43
Новичок на форуме
Отправить личное сообщение для tolyavrn Посмотреть профиль Найти все сообщения от tolyavrn
 
Регистрация: 02.08.2010
Сообщений: 1

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

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


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

Последний раз редактировалось tolyavrn, 02.08.2010 в 16:44. Причина: некоректное описание
Ответить с цитированием
  #10 (permalink)  
Старый 23.10.2011, 19:54
UDN UDN вне форума
Аспирант
Отправить личное сообщение для UDN Посмотреть профиль Найти все сообщения от UDN
 
Регистрация: 18.06.2009
Сообщений: 55

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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dojo и Opera Idb Dojo toolkit 4 25.06.2009 09:43
Возникает глюк при использовании двух плагинов dummer jQuery 5 23.12.2008 20:26
Очередной глюк SunYang Общие вопросы Javascript 10 04.09.2008 17:26
глюк с getElementById Antonio Events/DOM/Window 2 28.05.2008 14:25