2009-12-09 8 views
1

Voici mon html:syntaxe du sélecteur jQuery question

<form> 
    <dl> 
     <dt>&nbsp;</dt> 
     <dd><input type="hidden"></dd> 

     <dt>Dont hide this one</dt> 
     <dd><input type="text"></dd> 
    </dl> 
</form> 

J'utilise jQuery pour cacher les éléments dt/dd où le type d'entrée est cachée avec ce code:

$("input[type=hidden]").each(function() { 
    $(this).parent().hide().prev().hide(); 
}); 

Mais je aussi seulement vouloir appliquer à dt s où le texte est &nbsp;. Comment puis-je faire ce genre de sélection?

Mise à jour: Peut-être que je besoin de préciser: Quelques personnes ont posté des réponses où il se cache le dd avant de vérifier si le contenu du dt est également &nbsp;. Les deux conditions doivent être vraies avant de masquer le dt et le dd.

Solution finale: Voici ce que j'ai fini avec:

$('input[type=hidden]').filter(function() { 
    return $(this).closest('dd').prev('dt').html() === '&nbsp;'; 
}).each(function() { 
    $(this).closest('dd').hide() 
      .prev('dt').hide(); 
}); 

Répondre

3
$("input[type=hidden]").filter(function() { 
    return $(this).parent().prev('dt').html() === "&nbsp;"; 
}).each(function() { 
    $(this).parent().hide().prev().hide(); 
}); 

Cela ne sélectionnez <dt>foo&nbsp;bar</dt>

qui contains('&nbsp;') serait.

Plus de façon concise (avec crédit à Emil's answer)

$("input[type=hidden]").filter(function() { 
    return $(this).closest('dd').prev('dt').html() === "&nbsp;"; 
}).closest('dd').hide().prev('dt').hide(); 
+0

Désolé, mal compris ce que vous essayiez de faire. Mis à jour maintenant – cobbal

+0

parfait! Je vous remercie! – Andrew

+0

Comme les gens ont déjà posté des réponses ... et je ne peux pas encore commenter le code de cobbal est manquant ceci: $ ("input [type = hidden]"). Each (function() {$ (this) .parent(). hide(). prev(). filter (fonction() {return $ (this) .html() === " ";}). hide(); }); retourner – Skawful

1
$("input[type=hidden]").each(function() { 
    $(this).closest('dd').hide() 
      .prev('dt').hide(); 
}); 

Ce code trouve le parent le plus proche de l'entrée avec tag dd, le cache, puis cherche un dt bling et le cache aussi bien.

+0

+1 pour le nettoyage de mon code et le rendant plus lisible. =] – Andrew

0

Le sélecteur contient ne correspond pas à tout le contenu, il peut travailler pour vous, mais ne constitue pas une solution idéale. La bonne façon de le faire est d'utiliser la fonction de filtre:

$('input[type=hidden]').filter(function() { 
    return $(this).prev().html() == '&nbsp;' 
}) 
.each(function() { 
    $(this).hide(); 
    $(this).prev().hide(); 
}); 
+0

cela ne fonctionne pas. il finit par cacher tout le dl. J'essaie seulement de cacher le dt et le dd où le dt contient   et le dd contient un élément de forme caché. – Andrew

+0

Oh, je n'ai pas bien compris la question, je suis désolé. J'ai changé le code maintenant. – eWolf

0

Cela fait aussi l'affaire (adapté d'une version antérieure de la réponse de cobbal):

$("input[type=hidden]").each(function() { 
    if ($(this).parent().prev().filter(function() { 
     return $(this).html() === "&nbsp;"; 
    }).hide().length > 0) { 
     $(this).hide(); 
    } 
}); 
+0

Je ne pense pas qu'un ensemble jQuery vide soit faux, l'instruction if ne s'exécuterait-elle pas toujours? – cobbal

+0

D'oh, merci. Fixé maintenant –