2009-11-26 7 views
8

Je souhaite améliorer certains fieldsets avec la possibilité d'afficher/masquer leur contenu en cliquant sur leur libellé.jQuery masquer/afficher des ensembles de champs

Actuellement, le HTML ressemble à ceci:

<fieldset> 
    <legend>Fieldset 1</legend> 
    <!-- Some input, p, div, whatever --> 
</fieldset> 
<fieldset> 
    <legend>Fieldset 2</legend> 
    <!-- Some input, p, div, whatever --> 
</fieldset> 

Ainsi, le clic d'un fieldset legend, autre chose que la légende de la clique fieldset parent doit être basculée.

J'ai essayé d'utiliser ceci:

$("fieldset *:not(legend)").hide(); 
$("fieldset legend").click(function(){ 
    $(this).nextAll().slideToggle(); 
}); 

Mais il ne fait rien (même pas cacher le contenu en premier lieu). Bien sûr, je ne veux que basculer la vue sur l'ensemble de champs sur lequel l'utilisateur a cliqué, donc il doit d'une manière ou d'une autre déterminer quelle légende a été cliquée puis masquer le contenu des fieldsets correspondants. Bien sûr, je pourrais leur donner tous les IDs et écrire le code pour chaque fieldset, mais c'est plutôt redondant en voyant qu'il serait toujours le même je pense qu'il doit y avoir un moyen de rendre cette fonctionnalité universelle pour n'importe quel nombre de fieldsets. ..

Quelqu'un a une idée géniale?

Répondre

11

Si je vous je conclurai contenu dans div fieldset, et comme ça:

<script type="text/javascript"> 
     $(function(){ 
      $('legend').click(function(){ 
       $(this).parent().find('.content').slideToggle("slow"); 
      }); 
     }); 
</script> 

<fieldset> 
    <legend>Fieldset 1</legend> 
    <!-- Some input, p, div, whatever --> 
    <div class="content"> 
     this<br /> 
     is<br /> 
     content<br /> 
    </div> 
</fieldset> 
<fieldset> 
    <legend>Fieldset 2</legend> 
    <!-- Some input, p, div, whatever --> 
    <div class="content"> 
     this<br /> 
     is<br /> 
     content<br /> 
    </div> 
</fieldset> 

Alors maintenant, lorsque vous cliquez sur l'étiquette, il glissera le contenu haut/bas et laissez votre étiquette visible.

+0

Ouais, thats bien une façon de le faire bien sûr et ça marchera, c'est encore un hack et nécessite l'édition du code HTML: -/Still, merci. –

+2

Comment cela se passe-t-il comme un hack? ... vous n'avez pas spécifié que vous ne vouliez pas modifier le code HTML. – Mottie

10
$(function(){ 
    $('legend').click(function(){ 
    $(this).siblings().slideToggle("slow"); 
    }); 
}); 

Cela fonctionne. C'est vraiment le même concept, juste l'inverse.

+0

j'ai enveloppé mon contenu dans un div et appelé cette méthode - semble bien fonctionner – RozzA

+0

fonctionne bien. Comment faire en charge fermé? – Dudeist

+0

Si je vous comprends bien, vous pouvez le faire avec CSS en réglant display: none; à tout élément que vous voulez "fermé" onLoad. – creativetim

3

version étendue

HTML (légende contient [-] durée):

<fieldset> 
    <legend>My Area <span>[-]</span></legend> 
    Content of fieldset... 
</fieldset> 

JavaScript (nécessite jQuery):

$(function(){ 
    // Set cursor to pointer and add click function 
    $("legend").css("cursor","pointer").click(function(){ 
     var legend = $(this); 
     var value = $(this).children("span").html(); 
     if(value=="[-]") 
      value="[+]"; 
     else 
      value="[-]"; 
     $(this).siblings().slideToggle("slow", function() { legend.children("span").html(value); }); 
    }); 
}); 
+0

Il ya 3 réponses SO lors de la recherche de "fieldset toggle par légende" et la vôtre était la plus simple + avait bonus round +/- thingy. Merci et +1. –

Questions connexes