3

我在以下树结构中有一些递归 HTML:

分项
 div.content
  输入
  div.container
   分项
    div.content
     输入
     div.container
      分项
       ETC...

这是一个带有工作示例的 jsfiddle:http: //jsfiddle.net/HWHRZ/

我还有一个对象,其中包含对每个.itemdiv 的 jQuery 引用。

我想要做的是,对于任何特定.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

此功能可能会有所帮助:

$.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;
}

它遍历树直到遇到选择器。

于 2015-02-26T10:38:12.023 回答