17

私は次のJSを作成し、IE10で実行します。

function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length);
    for (var j = 0; j < nodes.length; j++) {   <=== THIS LINE!
        document.writeln(j.toString());
        }
    document.writeln("abc");
}

しかし、マークされた行に対して「無効な呼び出しオブジェクト」エラーが発生し続けました。

なんで?

そして、これが私のページソースです:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>This is JS fun!</title>
        <script type="text/javascript" language="javascript" src="test.js">
        </script>
    </head>
    <body>
        <h1>1111</h1>   
        <h1>2222</h1>   
        <h1>3333</h1>   
        <h1>4444</h1>   
            <input type="button" onclick="test()" value="click me!" />
    </body>
</html>

以下は私のスクリーンショットです:

ここに画像の説明を入力してください

4

3 に答える 3

12

ページが完了した後にコードを実行しているため、エラーが発生します。

最初のdocument.writeln呼び出しでは、文字列のみを含む新しいドキュメントが作成されます。これは、のコレクションが無効になったことを意味しnodesます。これは、もはや存在しないドキュメント内の要素のコレクションであるため、コレクションのプロパティ(などlength)を使用できなくなります。

ページの作成中にコードを実行すると、正常に機能します:http: //jsfiddle.net/Guffa/4w949/

于 2012-10-20T16:13:38.190 に答える
3

OK、私はそれを理解したかもしれません。

私はこれを試しました:

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になります。最初の書き込みの後、完全なページコンテンツが再構築されるため、新しく構築されたページには<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");
}

これで、MARKED行から予想される長さ1が得られました。これは、新しく作成されたドキュメントに新しい<h1>タグを挿入したためです。

無効な呼び出し元オブジェクトエラーについて。ドキュメントはwritelnで再構築されるため、以前に無効化された古いドキュメントオブジェクトで取得されたすべてのDOMオブジェクトも無効になると思います。

重要なのは、document.writelnメソッドによる新しいドキュメントの暗黙的な作成です。

私が間違っている場合は訂正してください。

洞察を与えてくれたGuffaに感謝します。

于 2012-10-21T03:52:48.540 に答える
-7

jは可変カウンターであり、オブジェクトではありません。

あなたが必要ですnodes.item(j).toString();

于 2012-10-20T16:02:22.110 に答える