2016-07-06 28 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