2009-11-13 4 views
16

J'ai une fonction qui ajoute du HTML à un élément. Il peut être appelé plus d'une fois, donc je veux seulement qu'il ajoute le HTML aux éléments qui n'ont pas déjà eu le HTML ajouté.Utilisation de jQuery NOT sélecteur pour exclure des éléments avec des enfants particuliers.

Exemple:

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

En tant que tel, je voudrais tout sélectionner .divToAppendTo qui n'ont pas un enfant immédiat de .myAppendedMarkup

Mon coup de couteau à ne semble pas fonctionner :

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

Il est toujours ajouté lorsque je l'appelle (dupliquant ainsi le contenu).

Répondre

17

essayer

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

ou

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

Russ. Merci! Et merci pour les variations, aussi. –

5

Si cela ne vous dérange pas, je pense que je peux avoir une solution plus facile pour ce que vous essayez de faire.

Chaque fois que vous ajoutez HTML à un .divToAppendTo faire un $(this).removeClass("divToAppendTo"); cette façon, vous aurez juste besoin de sélectionner .divToAppendTo tout en étant sûr qu'il n'a pas de code qui y est annexé.

Si vous utilisez cette classe pour autre chose, vous pouvez toujours en utiliser une autre pour ce faire.

+0

Soufiane ... bonne idée! –

5

pouvez-vous faire:

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

Cela ne fonctionne pas – DEfusion

+0

mon mauvais. J'ai eu une faute de frappe. –

+0

Je l'ai essayé d'où le vote vers le bas, n'a pas remarqué la faute de frappe, désolé. – DEfusion

1

Si vous n'avez pas besoin de quitter le className en place aller pour la réponse de Soufiane, sinon ce devrait fonctionner:

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

Ou si vous vous attendez à un autre HTML dans les .divToAppendTo « s, utilisez ceci:

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

J'aime cela pour sa lisibilité, et il est comparable en efficacité à la suggestion la plus rapide dans d'autres réponses.

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