2009-11-13 23 views
16

我有一個函數將一些HTML附加到元素。它可能會被多次調用,所以我只希望它將HTML添加到尚未添加HTML的元素。使用jQuery NOT選擇器排除具有特定子項的元素。

例子:

<div class="divToAppendTo"></div> 
<div class="divToAppendTo"><span class="myAppendedMarkup"></span></div> 

因此,我想選擇所有.divToAppendTo沒有.myAppendedMarkup

的直接子

我刺傷它似乎不工作:

$(".divToAppendTo:not(>span.myAppendedMarkup)") 

當我調用它時總是附加(從而複製內容)。

回答

17

嘗試

$("div.divToAppendTo:not(:has(span.myAppendedMarkup))") 

$("div.divToAppendTo").filter(function() { 
    return $(this).children('span.myAppendedMarkup').length == 0; 
}); 
+0

Russ。謝謝!並感謝這些變化。 –

5

如果你不介意,我想我可能有一個更容易的解決方案,你正在嘗試做什麼。

每當你添加HTML到.divToAppendTo$(this).removeClass("divToAppendTo"); 這樣你只需要選擇.divToAppendTo,同時確保它不具有附加到它的任何代碼。

如果您正在使用此類別的東西,您可以隨時使用另一個來做到這一點。

+0

Soufiane ...好主意! –

5

,你可以這樣做:

$(".divToAppendTo:not(:has(span.myAppendedMarkup))"); 
+0

這不起作用 – DEfusion

+0

我的不好。我有一個錯字。 –

+0

因爲我投了票,所以沒有注意到錯字,對不起。 – DEfusion

1

如果您不需要離開的className到位去Soufiane的回答,否則這應該工作:

$('div.divToAppendTo').filter(function() { 
    return $(this).html() == ''; 
})); 

或者,如果你希望其他一些HTML在.divToAppendTo的,然後使用此:

$("div.divToAppendTo").filter(function() { 
    return $(this).children('span.myAppendedMarkup').length == 0; 
}); 
2

我喜歡它的可讀性,而且在效率相媲美在其他的答案最快的建議。

var completeSet = $("div.divToAppendTo"); 
var unwantedSet = completeSet.has("span.myAppendedMarkup");  
var wantedSet = completeSet.not(unwantedSet); 
相關問題