Toon posts:

Javascript show/hide meerdere divs

Pagina: 1
Acties:

Vraag


  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 13-03 16:12
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: 19:17

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


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

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

  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 13-03 16:12
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
  • 0Henk 'm!

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

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


  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 13-03 16:12
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>

  • 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

  • Bas112
  • Registratie: Mei 2016
  • Laatst online: 13-03 16:12
@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]


  • 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";}

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 19:38

CurlyMo

www.pilight.org

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.

geen vragen via PM die ook op het forum gesteld kunnen worden.

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee