使用jQuery NOT选择器来排除具有特定子元素的元素。

我有一个函数,它将一些HTML附加到元素。 它可能不止一次被调用,所以我只希望它将HTML附加到尚未添加HTML的元素中。

例:

因此,我想选择没有.myAppendedMarkup的直接孩子的所有.divToAppendTo

我的刺伤似乎不起作用:

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

它总是在我调用它时附加(从而复制内容)。

尝试

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

要么

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

如果你不介意的话,我想我可能会为你想做的事情提供一个更简单的解决方案。

每当你将HTML附加到.divToAppendTo$(this).removeClass("divToAppendTo"); 这样你只需要选择.divToAppendTo同时确保它没有附加任何代码。

如果您将此类用于其他内容,则可以始终使用另一个类来执行此操作。

你可以做:

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

我喜欢它的可读性,它的效率与其他答案中最快的建议相当。

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

如果您不需要保留className,请转到Soufiane的答案,否则这应该有效:

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

或者,如果你期望.divToAppendTo的其他HTML,那么使用:

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