2009-11-13 10 views
16

私は要素にいくつかのHTMLを追加する関数を持っています。これは複数回呼び出されるかもしれないので、HTMLをまだ追加していない要素にHTMLを追加したいだけです。jQuery NOT selectorを使用して、特定の子を持つ要素を除外します。

例:このよう

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

、私は.myAppendedMarkup

の直接の子を持たないすべての.divToAppendToを選択したいと思います

動作していないように私の刺し傷:

$(".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

あなたが気にしないなら、あなたがやろうとしていることに対してより簡単な解決策があると思います。

あなたは.divToAppendToにHTMLを追加するたびに$(this).removeClass("divToAppendTo"); に、それはそれに追加任意のコードを持っていないことを確認しながら、あなたが.divToAppendToを選択するだけで必要がありますこの方法を実行します。

このクラスを他の目的で使用している場合は、このクラスを使用して他の操作を行うことができます。

+0

スウィアン...良いアイデア! –

5

あなたが行うことができます:あなたはそれ以外の場合は、この、Soufianeの答えのために行く場所でクラス名を残すために必要がない場合

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

これは動作しません – DEfusion

+0

私の悪い。私はタイプミスがありました。 –

+0

私はそれゆえ投票を試してみましたが、誤字に気付かなかった、申し訳ありません。 – DEfusion

1

を試してみてくださいはたらくはずです:

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

それとも、.divToAppendTo年代に他のいくつかのHTMLを期待する場合は、この使用:

$("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); 
関連する問題