Javascript show/hide meerdere divs

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 27-07 20:40
Beste Leden,

Ik ben een hobbiest met enige HTML, CSS en PHP kennis. Helaas behoort Javascript hier niet toe. Tot op heden heb ik hier ook nauwelijks gebruik van gemaakt waardoor mijn kennis nihil is.

Het kan zijn dat ik niet de juiste zoekworden heb gebruikt, maar het aantal snippets op het internet was nogal gering. De meeste scripts waren zeer eenvoudige show/hide functies zoals je ziet bij FAQ pagina's (uitklappen van een antwoord). In mijn geval wil ik de content van één div aansturen d.m.v. een onClick functie uit het hoofdmenu.

Bijv:
- Hoofdmenu: (1)leden (2)wedstrijden
- Context div: (1) Leden ovezicht - Lid aanmaken (2) Wedstrijden overzicht - Wedstrijd aanmaken

Vanuit de topbar kan er dus een item (leden of wedstrijden) aangeklikt worden. Vervolgens toont het submenu de bijbehorende links. Het probleem is echter dat als je op de huidige link uit het hoofdmenu klikt én actief is, de subbar verdwijnt, dit is lelijk voor de opmaak en voelt vreemd aan. Zodra je het niet-geselecteerde item uit het hoofdmenu aanklikt, dan is er geen probleem.

De gewenste oplossing zou zijn:
- Indien de huidige link uit het hoofdmenu reeds is geselecteerd, de onClick functie ongedaan maken zodat de functie niet aangeroepen wordt (HTML)
- De link blijft klikbaar maar de functie detecteert allereerst of deeze reeds is geselecteerd en zodra deze gelijk zijn, dan return false (JS).

Mijn voorkeur gaat uit naar de laatsgenoemde oplossing, dus een controlle inbouwen in de JS. Kan iemand mij in de juiste richting helpen?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function menuContext (target)
{
    
    var artz = document.getElementsByClassName('ribbon_context_item');
    var targ = document.getElementById(target);  

    var isVis = targ.style.display == 'block';
      
    for(var i=0; i <artz.length; i++)
    {
        artz[i].style.display = 'none';
    }

    targ.style.display = isVis ? 'none' : 'block';
  }


Hoofd menu
code:
1
2
3
4
 <div class="ribbon_item" onClick="menuContext('leden(')">
        <img src="../IMG/icons/ribbon/relations.png">
        <p>Ledenbeheer</p>
    </div>


Sub-menu
code:
1
2
3
    <div id="leden" class="ribbon_context_item" style="display: block">
        Overzicht | Lid toevoegen | Statistieken
    </div>


Ik hoop iets te leren dus een linkje in de goede richting zou mij enorm helpen :)

Beste antwoord (via Bas112 op 14-03-2021 20:06)


  • RM-rf
  • Registratie: September 2000
  • Laatst online: 15:19

RM-rf

1 2 3 4 5 7 6 8 9

je wil dus de variabele 'target' opslaan in een globale variabele (bv genaamd 'active_target') en dan voor het uitvoeren van die functie controleren of misschien 'target' en 'active_target' gelijk zijn


code:
1
2
3
4
5
6
7
8
var active_target = false;
function menuContext (target)
{
    if (active_target === target)   return;
    else active_target = target;

     /// ... rest van je code
  }

[ Voor 30% gewijzigd door RM-rf op 14-03-2021 19:29 ]

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen

Alle reacties


Acties:
  • 0 Henk 'm!

  • thlst
  • Registratie: Januari 2016
  • Niet online
Staat dit ook in het origineel ?

code:
1
"menuContext('leden(')"

Acties:
  • 0 Henk 'm!

  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 27-07 20:40
Hi,

Nee. Ik heb voor dit topic last-minute een wijziging doorgevoerd in de naamgeving zodat het overeenkomt met het voorbeeld. De single quote staat goed.

De functie wordt bij een onClick aangeroep en doet wat het moet doen, maar nog niet naar mijn wens.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 15:19

RM-rf

1 2 3 4 5 7 6 8 9

je wil dus de variabele 'target' opslaan in een globale variabele (bv genaamd 'active_target') en dan voor het uitvoeren van die functie controleren of misschien 'target' en 'active_target' gelijk zijn


code:
1
2
3
4
5
6
7
8
var active_target = false;
function menuContext (target)
{
    if (active_target === target)   return;
    else active_target = target;

     /// ... rest van je code
  }

[ Voor 30% gewijzigd door RM-rf op 14-03-2021 19:29 ]

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 27-07 20:40
RM-rf,

Ah, zeer eenvoudig maar ontzettend bedankt!

Mochten er mensen nog op zoeken, bijgaand de code voor de volledigheid:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var active_target = false;

function menuContext (target)
{
    if (active_target === target)   
    {
        return;
    }
    else 
    {
        active_target = target;
        
        var artz = document.getElementsByClassName('ribbon_context_item');
        var targ = document.getElementById(target);  

        var isVis = targ.style.display == 'block';
        
        for(var i=0; i <artz.length; i++)
        {
            artz[i].style.display = 'none';
        }

        targ.style.display = isVis ? 'none' : 'block';
    }
}

HTML
code:
1
2
3
4
5
6
7
8
9
<div class="ribbon_item" onClick="menuContext('leden')">
        <img src="../IMG/icons/ribbon/relations.png">
        <p>Ledenbeheer</p>
    </div>


  <div id="leden" class="ribbon_context_item" style="display: block">
        Overzicht | Lid toevoegen | Statistieken
    </div>

Acties:
  • 0 Henk 'm!

  • S_paul
  • Registratie: November 2020
  • Laatst online: 15-03-2021
Hallo,

Wat een toeval! Ik zit met een soortgelijk probleem, maar helaas is de hier getoonde oplossing voor mij niet bruikbaar. :-( Ik wil nl. met 1 klik meerdere li's zichtbaar/onzichtbaar maken. Geen div's dus, want ik werk met een responsief ontwerp en de lijst met li's die uitgeklapt wordt, moet na elke regel kunnen worden afgebroken (en overlopen in een volgende kolom). Dus:

Aarde
Item 1.1
Item 1.2
Item 1.3
Astronomie
Item 2.1
Item 2.2
Item 2.3
Etc.

De begintoestand is:

Aarde
Astronomie
Etc.

Klikken op Aarde moet geven:

Aarde
Item 1.1
Item 1.2
Item 1.3
Astronomie
Etc.

Daarna moet klikken op Astronomie opleveren:

Aarde
Astronomie
Item 2.1
Item 2.2
Item 2.3
Etc.

De items van Astronomie moeten dus zichtbaar worden EN de items van Aarde moeten verdwijnen.

Ik weet dat ik de afzonderlijk li's zichtbaar kan/moet maken met:
document.getElementsByClassName()

Dit is wat ik tot nu toe heb (en dat kan vast korter):

code:
1
2
3
4
5
<style>
.aarde, .astronomie, .universum
    {
    display: none;}
</style>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<script>
function showAarde()
    {
    var x = document.getElementsByClassName("aarde");
    var i;
    for (i = 0; i < x.length; i++)
        {
        x[i].style.display = "block";}
}

function showAstronomie()
    {
    var x = document.getElementsByClassName("astronomie");
    var i;
    for (i = 0; i < x.length; i++)
        {
        x[i].style.display = "block";}
}

function showUniversum()
    {
    var x = document.getElementsByClassName("universum");
        document.getElementsByClassName('aarde')[0].style.visibility = 'hidden';
    var i;
    for (i = 0; i < x.length; i++)
        {
        x[i].style.display = "block";}
}
</script>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<a href="#" onClick="showAarde();">Aarde</a>

<li class="aarde">Aarde 01</li>
<li class="aarde">Aarde 02</li>
<li class="aarde">Aarde 03</li>
<li class="aarde">Aarde 04</li>
<li class="aarde">Aarde 05</li>

<a href="#" onClick="showAstronomie();">Astronomie</a>

<li class="astronomie">Astronomie 01</li>
<li class="astronomie">Astronomie 02</li>
<li class="astronomie">Astronomie 03</li>
<li class="astronomie">Astronomie 04</li>
<li class="astronomie">Astronomie 05</li>

<a href="#" onClick="showUniversum();">Universum</a>

<li class="universum">Universum 01</li>
<li class="universum">Universum 02</li>
<li class="universum">Universum 03</li>
<li class="universum">Universum 04</li>
<li class="universum">Universum 05</li>


Maar hoe laat ik tegelijkertijd de andere li's verdwijnen? Zou super zijn als iemand mij verder kan helpen. Ik wil geen JQuery gebruiken...

Groetjes, Shelley

Acties:
  • 0 Henk 'm!

  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 27-07 20:40
@RM-rf nog een aanvullende vraag; kan ik bij een window onload detecteren welke id gelijk is aan block (zichtbaar)? Deze zou ik dan ook de status als active_target kunnen geven zodat het probleem zich niet voordoet direct na het inladen van de pagina.

Daarna werkt het perfect... begrijp je wat ik bedoel?

EDIT: ik heb het zelf als volgt opgelost. De eerste div stond standaard op block en de rest op none. Ik heb alle div's nu op none gezet en vanuit een body onLoad zet ik de eerste div nu op block. Hiermee is het opgelost. Dank!

[ Voor 27% gewijzigd door Bas112 op 14-03-2021 23:09 ]


Acties:
  • 0 Henk 'm!

  • S_paul
  • Registratie: November 2020
  • Laatst online: 15-03-2021
Ik ben er inmiddels achter. Voor de liefhebbers: zo laat je meerdere li's of div's ineens verdwijnen:

code:
1
2
3
4
5
    var x = document.querySelectorAll(".aarde,.astronomie,.universum");
    var i;
    for (i = 0; i < x.length; i++)
        {
        x[i].style.display = "none";}

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 14:02
S_paul schreef op maandag 15 maart 2021 @ 09:27:
Ik ben er inmiddels achter. Voor de liefhebbers: zo laat je meerdere li's of div's ineens verdwijnen:

code:
1
2
3
4
5
    var x = document.querySelectorAll(".aarde,.astronomie,.universum");
    var i;
    for (i = 0; i < x.length; i++)
        {
        x[i].style.display = "none";}
Een list item hoort niet op zichzelf te staan, maar onderdeel te zijn van een genummerd of ongenummerde lijst.
https://www.w3schools.com/html/html_lists.asp

Dan hoef je maar één hoofd element aan en uit te zetten.

Sinds de 2 dagen regel reageer ik hier niet meer

Pagina: 1