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

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 に答える