2016-07-06 5 views
1

私は以下のアルゴリズムをDOMツリーにDFSしようとしましたが、動作しません! DOMツリーの最初のパスをチェックするだけです。なぜ?!なぜこのDOM DFSアルゴリズムが機能しないのですか?

function DFS(P) // (ScanRegion, Elem, MCF) 
{ 
    P.Elem.setAttribute("Checked", "1"); 

    Children = P.Elem.querySelectorAll("*"); 

    for(I = 0, L = Children.length; I < L; I++) 
     DFS 
     (
      { 
       ScanRegion : P.ScanRegion, 
       Elem  : Children[I] , 
       MCF  : P.MCF 
      } 
     ); 

    return; 
} 

DFS 
(
    { 
     ScanRegion : document.body, 
     Elem  : document.body, 
     MCF  : "Not important in this question :D" 
    } 
); 

デバッグの日後、私は最終的に問題を発見しました。私は以下のコードを試してみましたが、DOMツリーの最初の葉とブラウザがリカーシブ関数の最初の 'return'を実行した後、親関数の 'L'変数はその値を失い、 0 'である。私はそれはあなたが知っているので、子関数の 'L'が '0'(葉に子がないので:D)と親関数に影響すると思うので、JSの可変範囲問題のためだと思います。ここ

は、私が試したデバッグコードです:

function DFS(P) // (ScanRegion, Elem, MCF) 
{ 
    P.Elem.setAttribute("Checked", "1"); 

    Children = P.Elem.querySelectorAll("*"); 

    L = Children.length; alert(L); // * New 

    for(I = 0; I < L; I++) 
     DFS 
     (
      { 
       ScanRegion : P.ScanRegion, 
       Elem  : Children[I] , 
       MCF  : P.MCF 
      } 
     ); 

    alert(L); // * New 

    return; 
} 

DFS 
(
    { 
     ScanRegion : document.body, 
     Elem  : document.body, 
     MCF  : "Not important in this question :D" 
    } 
); 

いずれかが問題を知っているか、真のコードを持っている場合、私は感謝される:)

+0

ホールドでは、両方のコードが正しく動作しません。私は、第2のコードではうまくいかないことについてちょっと混乱しています。 – Xufox

+1

2番目はデバッグ用のバージョンであり、さらに2つのアラートしかありません。 – Arvin

+0

とにかくあなたの注意のためにありがとう:) – Arvin

答えて

1

varを使用してローカル変数を宣言します!現状では、Iです。です。 Lと同じです。そのため、再帰呼び出しは親の反復を混乱させます。

は、関数の先頭に

var I, L; 

を追加します。 (変数名には小文字を使用することを検討してください; JavaScriptコードではもっと一般的です)

+0

ありがとう、私のプロジェクトで本当に助けてくれました:-D – Arvin

+0

プラス、私は子供のためにもvarを使用する必要があります。 – Arvin

+0

@Arvinはい私はそれを逃した:) – Pointy

関連する問題