Domanda

Voglio migliorare alcuni set di campi con l'opzione per mostrare / nascondere i loro contenuti facendo clic sulla loro etichetta.

Attualmente, l'HTML è simile al seguente:

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

Quindi, facendo clic su una legenda fieldset , tutto tranne la legenda cliccata del fieldset genitore dovrebbe essere attivata / disattivata.

Ho provato a usare questo:

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

Ma non fa nulla (nemmeno nascondere i contenuti in primo luogo). Ovviamente voglio solo cambiare la vista sul campo stesso su cui l'utente ha fatto clic, quindi deve in qualche modo determinare quale legenda è stata cliccata e quindi nascondere il contenuto dei corrispondenti set di campi.

Certo, potrei dare loro tutti gli ID e scrivere il codice per ogni fieldset, ma è piuttosto ridondante visto che sarebbe sempre lo stesso penso che ci debba essere un modo per rendere universale questa funzionalità per qualsiasi quantità di set di campi. .

Qualcuno ha un'idea chiara?

È stato utile?

Soluzione

Se fossi in te avvolgerei il contenuto di fieldset in div, e in questo modo:

<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>

Quindi ora quando fai clic sull'etichetta, il contenuto verrà spostato su / giù e lascerà l'etichetta visibile.

Altri suggerimenti

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

Funziona. In realtà è lo stesso concetto, proprio l'inverso.

Versione estesa

HTML (la legenda contiene [-] span):

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

JavaScript (richiede 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); } );
    });
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top