2012-04-17 64 views
3

我在下面的樹結構的一些遞歸的HTML:jQuery的選擇只有孩子,直到特定類

 
div.item 
div.content 
    input 
    div.container 
    div.item 
    div.content 
    input 
    div.container 
     div.item 
     etc... 

這裏有一個工作示例的jsfiddle:http://jsfiddle.net/HWHRZ/

我也有jQuery的引用一個對象每個.item divs。

我想要做的是,對於任何特定的.item,只選擇立即在下面的輸入,不包括任何更深的.container.item元素中的輸入。

爲了使事情更加複雜,並不是每個.item在輸入方面都具有相同的佈局。有時輸入可能在其他div元素中,因此用簡單的.find('> .content :input')選擇它們並不總是有效。

我發現了一個解決方案,但它對大樹效率不高,並且根本不優雅: $(':input', $item).not($('.container :input', $item)).toggleClass('changed');$item是我保留在對象中的引用)。這個解決方案的工作原理應該如此,但對於任何足夠大的樹結構而言效率太低,not()將不得不處理大量的節點。

簡而言之:我需要選擇不在特定其他子節點內的特定子節點。

有沒有人知道這樣做的更有效的方法?

+1

所以,你有沒有封閉的'div'標籤,大多數(如果不是全部的話)'輸入'標籤沒有自閉合斜線,沒有關閉的'select'元素,多個具有相同'id'的元素...... – 2012-04-17 13:35:44

+0

你可以發佈你的HTML jsfiddle,真的有幫助 – Jayanga 2012-04-17 14:31:09

+0

@DavidThomas。是。你幾乎認爲它只是爲了顯示樹結構而不是實際的HTML。我會設置一個jsfiddle來幫助你更好地理解。 – Martijn 2012-04-17 18:14:43

回答

1

我覺得

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

應該工作。

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

它遍歷樹,直到它遇到的選擇。