0

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

    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();
4

2 回答 2

4

each接受一个函数作为参数,你正在传递它undefined——因为你首先调用函数,然后它的返回值就是each()得到的。

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

于 2012-07-25T22:55:06.873 回答
1

第一个deepest是变量body,它是一个 jQuery 对象。后来,当你给 deepest 赋值时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 演示

于 2012-07-25T23:04:09.010 回答