Вот небольшой документ:
<ul id="menu"> <li>Главная страница</li> <li>Форум</li> <li>Магазин</li> </ul>
1. Что выведет следующий код (простой вопрос)?
var lis = document.body.getElementsByTagName('li');
document.body.innerHTML = '';
alert(lis.length);
2. А такой код (вопрос посложнее)?
var lis = document.getElementById('menu').getElementsByTagName('li');
document.body.innerHTML = '';
alert(lis.length);
1. Ответ на первый вопрос - 0, пустая коллекция.
<ul id="menu">
<li>Главная страница</li>
<li>Форум</li>
<li>Магазин</li>
</ul>
<script>
var lis = document.body.getElementsByTagName('li');
document.body.innerHTML = '';
alert(lis.length);
</script>
Это потому, что все элементы из BODY удаляются, а коллекция - живая.
2. Ответ на второй вопрос - 3, коллекция не изменилась:
<ul id="menu">
<li>Главная страница</li>
<li>Форум</li>
<li>Магазин</li>
</ul>
<script>
var lis = document.getElementById('menu').getElementsByTagName('li');
document.body.innerHTML = '';
alert(lis.length);
</script>
В отличие от предыдущего примера, теперь коллекция привязана не к BODY, а к элементу, в котором идет поиск, т.е. к <ul id="menu">.
Присвоение document.body.innerHTML='' удаляет узлы из document.body, почему же они остались в коллекции?
Дело в том, что удаленные узлы остаются «в живых» до тех пор, пока есть ссылка на них из какого-нибудь объекта или переменной.
В данном случае к узлу <ul id="menu"> привязана коллекция, на которую ссылается переменная lis:
lis -> коллекция -> узел <ul id="menu">
Поэтому узел UL остается в памяти, и все потомки в месте с ним. Как следствие, длина коллекции по-прежнему равна 3.