2016-07-06 71 views
1

我嘗試下面的算法到DFS的DOM樹,但它不工作!它可以檢查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樹的第一個葉子後,瀏覽器運行遞歸函數的第一個「返回」後,父函數的「L」變量將丟失其值並更改爲「 0' 。我猜這是因爲JS中的變量範圍問題,因爲如你所知,子函數的'L'是'0'(因爲葉子沒有孩子:D),我認爲它會影響父函數。

這裏的調試代碼我想:

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

堅持,兩個代碼都不起作用,對吧?我對第二個代碼中不起作用有些困惑。 – Xufox

+1

第二個只是一個調試版本,只有兩個警報。 – Arvin

+0

無論如何感謝您的關注:) – Arvin

回答

1

var聲明你的局部變量,我將不勝感激!因爲它,I全球。與L相同。正因爲如此,遞歸調用弄亂了父節點的迭代。

添加

var I, L; 

到函數的頂部。 (也可以考慮使用小寫字母來表示變量名稱;它在JavaScript代碼中更常見)。

+0

非常感謝你,你真的幫我在我的項目中:-D – Arvin

+0

另外,我還需要爲兒童使用var。 – Arvin

+0

@是的,我錯過了那個:) – Pointy