Свойство объекта или атрибут html элемента
И снова поднимаю на обсуждение проблему связанную с нашим "любимым" Internet Explorer!
Во время работы над эффектом MySelect, Internet Explorer показал ошибку, которую я не сразу смог найти. После долгого разбора своего кода я нашел ошибку и был очень удивлен!
Здесь и возникла ошибка
var elems = document.getElementsByTagName('*');
var length = elems.length;
// результат Internet Explorer [object HTMLInputElement]
// а другие браузеры возвращали число - количество элементов в объекте
alert(length);
По началу, я не мог понять что возвращает мне Internet Explorer и почему вместо цифры выдает input элемент. Проверив атрибут name элемента input я получил результат length
alert(length.name); // результат равнялся length
Тогда я понял, что это был один из input'ов на странице, который имел атрибут name со значением length.
Вывод
Если на странице имеется html элемент с name=length, то при использовании метода getElementsByTagName и при попытке получить количество его элементов с помощью свойства объекта length, Internet Explorer вернет html элемент с name=length, а другие браузеры количество элементов в этом объекте.
Поэтому не следует использовать зарезервированные слова в значениях атрибутов элементов страницы!
<div>текст</div>
<p>еще текста</p>
<input type="text" name="length">
<script language=javascript>
var elems = document.getElementsByTagName('*');
var length = elems.length;
// IE вернет input элемент страницы, а другие браузеры цифру
alert(length);
</script>
|
Вывод недостаточно радикален. Эта проблема имеет отношение ко всем браузерам и всем языкам программирования. Мораль на самом деле такова: не следует использовать метки, совпадающие с зарезервированными словами языка; сие всегда может таить в себе опасность.
А что, обращение к элементам нодлиста по имени — это нормальное поведение? Я сейчас серьезно спрашиваю. Как тогда узнать количество элементов в нем?
torbasow, спасибо, не смог выразить свою мысль! И если честно я тоже задался вопросом, а как можно узнать количество элементов в Internet Explorer'e?
Неужели выходом будет
На самом деле выход гораздо проще. Не использовать имена нод, совпадающих с названиями свойств :-) Не думаю, например, что кто то будет баловаться id="undefined", так и здесь. Рекомендацией w3c не предусмотренно поведение в этой ситуации. К тому же другие обозреватели тоже по логике поступают не правильно. Почему они не возвращают запрошенный элемент? В данном случае это не баг internet explorer, а баг вашего кода. Удачи.
А я бы просто не исполнялся в глобальной области.
И что же в глобальной области не так? Что даст углубление на один scope? Никакого отношения "глобальная область" к данной проблеме не имеет.