3

コミュニティに恩返しするスキルレベルがまだないと感じているので、ここに投稿するのを延期しましたが、これには完全に困惑しています.

ノード ツリー内のすべての id 要素と name 要素の末尾にカウンターを追加する再帰的な JavaScript 関数があります。この機能は FF、Chrome、Safari、IE9 で動作しますが、IE8 では動作しません。

function counterAppend(nodes,counter)
{
    var newField = nodes.childNodes;
    for (var i=0;i<newField.length;i++)
    {
        var theName = newField[i].name;
        if (theName)
        {
            newField[i].name = theName + counter;
        }
        var theId = newField[i].id;
        if (theId)
        {
            newField[i].id = theId + counter;
        }

        //recursive part
        if(newField[i].childNodes.length>0)
        {
            newField[i] = counterAppend(newField[i],counter);
        }
    }
    return nodes;
}

次の行にエラーが表示されます: newField[i] = counterAppend(newField[i],counter);

デバッグでは、次のように表示されます:JSランタイムエラーで中断 - オブジェクトはこのプロパティまたはメソッドをサポートしていません

IE8 と他のブラウザーの違いは何ですか? また、これを変更してエラーを回避するにはどうすればよいですか?

4

2 に答える 2

1

関数の戻り値を に戻すのはなぜnewField[i]ですか? あなたがこれに何を期待しているのか、私にはわかりません。コードが ID/名前を変更するだけの場合、戻り値は必要ありません。IE を混乱させているのはこれだと思うべきですが、他のブラウザを混乱させない理由がわかりません...

于 2012-12-14T23:23:45.207 に答える
0

質問:また、エラーが発生したときに確認しましたか? エラーが発生するまでに、もしあるとすれば何回ループしますか? いくつかの出力ステートメントを試してください。

DOM をウォークするためのいくつかの代替アルゴリズム: getElementsByTagName() は textNodes に相当します。

以下のような問題が発生する可能性があることに注意してください。

IE は、他のブラウザーのように、childNodes nodeList に空白のみのテキスト ノードを含めません。代わりに getElementsByTagName() を使用することをお勧めします。そうすれば、コード内のノードのすべてのレベルを手動でトラバースする必要もありません。

http://www.quirksmode.org/dom/w3c_core.html経由

ほとんどのブラウザーは、タグとタグの間のギャップなど、空白がレンダリングされない場合でも、タグ間の空白を、空白文字 (スペース、改行、タブなど) のみを含むテキスト ノードとして正しく表示します。タグまたはその間の空白のギャップ

タグ。ただし、一部のブラウザー (主に Internet Explorer 8 以降、および互換モードの 9 以降) では、この空のスペースがテキスト ノードとしてまったく表示されません。

http://www.howtocreate.co.uk/tutorials/javascript/dombasics経由

于 2012-12-14T23:13:13.913 に答える