Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.08.2014, 11:46
Новичок на форуме
Отправить личное сообщение для grafvonfabercastel Посмотреть профиль Найти все сообщения от grafvonfabercastel
 
Регистрация: 27.08.2014
Сообщений: 2

getElementsByTagName область видимости?
добрый день!

прошу вашей помощи в связи с вот чем:

к хтмл странице с несколькими заголовками h1 цепляется внешний скрипт.
если в скрипте код 1, то показывается второй заголовок h1 (то есть все ок). если в скрипте код 2, то в консоли undefined. Если в скрипте код №3, то a содержит массив из заголовков h1(что тоже верно). объясните, пожалуйста, в какую сторону у меня кривые руки и почему getElementsByTagName ведет себя по-разному.

заранее большое спасибо!

код №1

window.onload=function(){
var a = document.getElementsByTagName ("h1") [1];
console.log(a);
}

код №2
var a = document.getElementsByTagName ("h1") [1];
console.log(a);

код №3
var a = document.getElementsByTagName ("h1");
console.log(a);

Последний раз редактировалось grafvonfabercastel, 27.08.2014 в 11:51.
Ответить с цитированием
  #2 (permalink)  
Старый 27.08.2014, 12:43
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

getElementsByTagName возвращает NodeList - живую коллекцию элементов, не массив.
Соответственно:
код 1: всё ок, вы получаете коллекцию элементов уже после загрузки страницы когда все они уже присутствуют, берёте второй по счёту и передаёте на вывод console.log. console.log выводит его.

код 2: вы получаете коллекцию элементов до загрузки страницы, потому на момент вызова пустую, берёте второй элемент пустой коллекции(поскольку его нет то undefined) и передаёте на вывод console.log. console.log выводит undefined.

код 3: вы получаете коллекцию элементов до загрузки страницы, потому на момент вызова пустую, и передаёте оную на вывод console.log. Тут кроется подвох. Передаётся коллекция в console.log ссылкой а не копией, и поскольку когда вы смотрите в консоль страница уже успела загрузиться - коллекция успевает к тому времени заполниться элементами загруженной страницы. Потому вы и видите в консоли её элементы.
На момент вызова же она также пуста как и в коде 2.
Чтобы это увидеть можно преобразовать код 3 к след. виду:
var a = Array.prototype.slice.call( document.getElementsByTagName ("h1") ); //преобразуем живой NodeList в статичный массив
console.log(a);


P.S. Лично мне не слишком нравится такой подход в реализации console.log - удобнее и логичнее было бы при выводе делать полные копии переданных объектов на момент передачи. Наверное такой поход приводил к излишним расходам памяти или просто противоречил стилю js. Так или иначе теперь уже ничего не попишешь, просто надо учитывать, что в консоли мы увидим самое последнее состояние объекта, а не промежуточное.
__________________
29375, 35

Последний раз редактировалось Aetae, 27.08.2014 в 12:51.
Ответить с цитированием
  #3 (permalink)  
Старый 27.08.2014, 13:04
Новичок на форуме
Отправить личное сообщение для grafvonfabercastel Посмотреть профиль Найти все сообщения от grafvonfabercastel
 
Регистрация: 27.08.2014
Сообщений: 2

большое спасибо за подробное разъяснение!)))
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пож с JSON, передача id ссылки. wisma jQuery 22 10.02.2014 15:36
Область видимости переменной ацкий Общие вопросы Javascript 3 27.08.2011 14:09
область видимости Ultimatum Общие вопросы Javascript 2 19.06.2011 10:47
область видимости переменных в prototype (тупой вопрос)) stnw Общие вопросы Javascript 3 11.02.2011 19:25
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 07:11