3

次のツリー構造に再帰的なHTMLがあります。

div.item
 div.content
  入力
  div.container
   div.item
    div.content
     入力
     div.container
      div.item
       等...

これが実際の例を含むjsfiddleです:http://jsfiddle.net/HWHRZ/

また、各divへのjQuery参照を持つオブジェクトもあります.item

私がやりたいのは、特定の場合、より深い要素や要素.itemの入力を除いて、すぐ下の入力のみを選択することです。.container.item

物事をより複雑にするために、すべて.itemが入力に関して同じレイアウトを持っているわけではありません。入力が他のdiv要素にある場合もあるため、単純なものでそれらを選択すると、.find('> .content :input')常に機能するとは限りません。

私は解決策を見つけましたが、大きな木では非効率的で、まったくエレガントではありません:( $(':input', $item).not($('.container :input', $item)).toggleClass('changed'); これ$itemは私がオブジェクトに保持している参照です)。このソリューションは正常に機能しますが、十分に大きなツリー構造には非効率的でありnot()、多くのノードを処理する必要があります。

つまり、特定の他の子ノード内にない特定の子ノードを選択する必要があります。

誰かがこれを行うためのより効率的な方法を知っていますか?

4

2 に答える 2

1

おもう

$.each($($(".item")[0]).children(".changed"),function(){
$(this).removeClass("changed")
})

動作するはずです。

于 2012-04-17T13:28:24.357 に答える
0

This function might help:

$.fn.childrenUntil = function( selector, result)
{
    result = typeof result !== 'undefined' ? result : new $();
    this.children().each( function(){
       var thisObject = $( this );
        if( thisObject.is( selector ) ) 
            result.push( this );
        else
            thisObject.childrenUntil( selector, result );
    });
    return result;
}

It traverses the tree until it encounters the selector.

于 2015-02-26T10:38:12.023 に答える