0

私はDOMについてもっと学ぼうとしていて、いくつかのトラバーサルスクリプトを書いています。私が思いついたアルゴリズムは、私がやっていたことの一部ではうまく機能しましたが、それをHTMLドキュメントの本文全体に適用すると、混乱しました。HTMLは次のとおりです。

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>Lumen Tests</title>
        <link rel='stylesheet' href='../../qunit/qunit.css' />
    </head>
    <body>
        <div id='qunit'></div>
        <div id='qunit-fixture'></div>

        <div id='wrapper'>
            <div id='header'></div>
            <div id='content'>
                <p id='para'>Lorem ipsum dolor sit amet.</p>
            </div>
            <div id='footer'></div>
        </div>

        <script src='../../qunit/qunit.js'></script>
        <script src='../lib/traverse.js'></script>
        <script src='../lib/lumen.js'></script>
        <script src='features.js'></script>
    </body>
</html>

そしてJavaScript:

(function () {

    'use strict';

    function toArray(list) {
        var array = [],
            len = list.length,
            i = 0;

        while (i < len) {
            array[i] = list[i];
            i += 1;
        }

        return array;
    }

    function Traverse() {

        var that = this;

        this.allTags = function (node) {
            var context  = node || document.body,
                children = [],
                array = [],
                len,
                i = 0;

            children = toArray(context.childNodes);
            len = children.length;

            while (i < len) {
                if (children[i].nodeType === 1) {
                    array.push(children[i]);
                    array = array.concat(that.allTags(children[i]));
                }

                i += 1;
            }

            return array;
        };

    }

    var foo = new Traverse();
    window.Traverse = foo.allTags;

}());

alert(Traverse());

document.getElementById('wrapper')これで、この設定はトラバーサル関数に渡したときに問題なく機能しますが、使用するためにそのままにしておくと、2つの要素document.bodyしか取得できません。scriptこれをChrome20.0.1132.34、Firefox 11.0、およびIE 9でテストしたところ、すべて同じ結果になりました。テストを通じて、アルゴリズムが何も渡さないことを発見しました。childNodesプロパティdocument.bodyの長さは10で、配列に変換して警告すると、出力はtext、div、text、div、text、div、textになります。 、スクリプト、テキスト、スクリプト。childNodes最後の2つのスクリプトタグを取得しない理由を説明できる人はいますか?ありがとうございました!

4

1 に答える 1

1

トラバーススクリプトを呼び出す時点では、他の2つのスクリプトはまだ存在していません。domreadyでトラバースを呼び出します。

document.addEventListener('DOMContentLoaded', function () {
    console.log(Traverse());
}, false);
于 2012-06-17T07:31:35.550 に答える