Почему эта ошибка «неверный вызывающий объект»?

Я пишу следующий JS и запускаю в IE 10:

function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length);
    for (var j = 0; j < nodes.length; j++) {   
 Guffa20 окт. 2012 г., 18:09
@smwikipedia: я запускаю код с открытой консолью, а также пробовал с включенной опцией error. Там нет ошибки, и "2 0 1 abc " заканчивается на странице.
 smwikipedia20 окт. 2012 г., 18:15
Я тоже включил консоль. Пожалуйста, смотрите мой обновленный скриншот.
 smwikipedia21 окт. 2012 г., 05:28
@Joachim, есть ли формальное определение поведения недействительности этого объекта DOM?
 Guffa20 окт. 2012 г., 18:01
Я попробовал ваш код в IE 10.0.9200.16384, и я нене получаю никакой ошибки.jsfiddle.net/Guffa/4w949
 Joachim Isaksson20 окт. 2012 г., 18:17
jsfiddle.net/jTfFe/1 воспроизводит проблему на Chrome тоже. Кажется, что это связано с вызовом writeln (), похоже, он лишает законной силы ваш нодлист, поскольку создает новый документ.
 Yogendra Singh20 окт. 2012 г., 17:56
какие' значение в?nodes.length
 smwikipedia20 окт. 2012 г., 17:58
Это'с 4. у меня 4 < H1> теги на моей странице. На самом деле мой скрипт вывел это число. И после этого появляется диалоговое окно с сообщением об ошибке:Неверный вызывающий объект, (Я включил переключатель IE для отображения каждой ошибки скрипта).
 smwikipedia20 окт. 2012 г., 18:04
Мы используем точно такой же IE. Вы включили переключатель ошибок сценария дисплея?

Ответы на вопрос(3)

Решение Вопроса

потому что вы запускаете код после завершения страницы.

Первыйdocument.writeln call создает новый документ, содержащий только строку. Это означает, что коллекция вnodes больше не действителен Это набор элементов в документе, который небольше не существует, так что вы можетеt использовать любое из свойств (например,length) коллекции больше.

Если вы запускаете код во время создания страницы, он работает нормально:http://jsfiddle.net/Guffa/4w949/

 smwikipedia21 окт. 2012 г., 04:25
Кажется, это связано с действительным временем жизни документа? Не могли бы вы рассказать об этом подробнее?
 smwikipedia21 окт. 2012 г., 05:56
Первый вызов document.writeln создает новый документ, содержащий только строку. Это означает, что коллекция в узлах больше не действительна ". - Я полагаю, что'сидеть.
 smwikipedia21 окт. 2012 г., 04:38
или это связано с временем жизни объекта DOM относительно его содержаниядокумент."

Я попробовал это:

function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length); // 1st writeln
    nodes2 = document.getElementsByTagName("h1");
    alert(nodes2.length);  //  <========= MARK1
    for (var j = 0; j < nodes2.length; j++) {
        alert(j);
            }
    document.writeln("abc");
}

Нет ошибки для приведенного выше кода. ноmark1 линия дает 0. Потому что после1-й писательсодержимое страницы полностью перестроено,там'нет нет H1> тег на вновь созданной странице больше.

И тогда я изменил приведенный выше код на это:

 function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length + "<h1>new h1</h1>");   // ADD a new < h1 > tag
    nodes2 = document.getElementsByTagName("h1");
    alert("node2 length = " + nodes2.length);   //MARKED
    for (var j = 0; j < nodes2.length; j++) {
        alert(j);
            }
    document.writeln("abc");
}

ТеперьОТМЕТИЛИ линия дала мне ожидаемую длину, 1. потому что я поставил новый < H1> тег в недавно построенный документ.

Что касаетсяНеверный вызывающий объект ошибка. Я думаю, что поскольку документ реконструирован с writeln, все объекты DOM, ранее полученные с помощью старого недействительного объекта документа, также будут недействительными.

Ключ - неявное создание нового документа методом document.writeln.

Пожалуйста, поправьте меня, если я ошибаюсь.

Спасибо Guffa за понимание.

j переменный счетчик, а не объект.

Тебе нужноnodes.item(j).toString();

Ваш ответ на вопрос