2012-07-25 95 views
0

如果取消注释body.children().each(calc_deep(1));然后我得到TypeError: Object [object Window] has no method 'attr'parseInt(deepest.attr('deep'))字符串,但不取消注释,你可以检查控制台,你可以拨打deepest.attr('deep')。那是什么?JavaScript的奇怪行为

var deepest; 
    var calc_deep = function(i) 
    { 
     $(this).attr('deep',i); 
     if(i>parseInt(deepest.attr('deep'))) 
      deepest=this; 
     $(this).children().each(calc_deep(i+1)); 
    } 
    var find_deepest = function() 
    { 
     body=$('body').children().eq(0);   
     body.attr('deep',0); 
     deepest=body; 
     //body.children().each(calc_deep(1)); 
    } 
    find_deepest(); 
+0

尝试此处导致错误:http://jsfiddle.net/ – 2012-07-25 22:53:26

回答

1

第一个deepest是变量body,它是一个jQuery对象。稍后,当您将最深的分配给this时,它是一个常规的DOM元素,它没有attr函数。

你有更大的问题 - this没有指出你认为它的元素。请致电$(this).children().each(calc_deep);,而不要使用该函数的参数。为了获得深度,只需从父母那里获取。您正在调用函数calc_deep并将(不存在的)返回值传递给each。你想把函数本身传递给每个函数。

var deepest, index; 
var calc_deep = function() { 
    var $this = $(this); //cache jQuery this 
    var i = $this.parent().data("deep") + 1; 
    $this.data('deep', i); 
    if (i > index) { 
     deepest = $this; 
     index = i; 
    } 
    $this.children().each(calc_deep); 
} 
var find_deepest = function() { 
    body = $('body').children().eq(0); 
    body.data('deep', 0); 
    index = 0; 
    deepest = body; 
    body.children().each(calc_deep); 
} 
find_deepest(); 

jsFiddle demo

+0

你是真棒:)另外,为什么在你的jsFidddle演示'deepest'是数组在最后? – scythargon 2012-07-25 23:28:43

+0

'deepest'是一个jQuery对象,它具有一些类似数组的特性。它包含可以像数组一样访问的0-n DOM元素,在这种情况下'[0]'获得集合中唯一的DOM元素。你也可以做'deepest.attr(“id”)' – Dennis 2012-07-25 23:39:18

4

each需要一个函数的参数,你传递undefined - 因为你第一次调用该函数,然后它的返回值是什么each()得到。

改为使用function() {calc_deep(1);}

+0

感谢很多:) – scythargon 2012-07-25 23:33:35