Toon posts:

[js] Expanding/collapsing menu, maar nu opschonen!

Pagina: 1
Acties:
  • 54 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik heb met veel gepruts en gepriegel een script geschreven voor een verticaal expanding/collapsing menu dat op het moment precies doet wat ik wil. Hieronder vind je een sample van de code (zowel HTML als javascript).

Bij een klik op een trigger wordt het betreffende submenu geopend en worden alle overige menus gesloten (als deze al open stonden). Er is dus ten allen tijden maar 1 submenu geopend, tenzij het een sub-submenu betreft, dan blijft de directe parent uiteraard ook open.

Deze code werkt dus naar believen, maar is erg lang en omslachtig. Is het mogelijk hetzelfde te doen met minder en beter te onderhouden code?

(Er is trouwens bewust gekozen om geen inline clicks te gebruiken, en om de submenus met javascript te verbergen en niet dmv de stylesheet - beiden ivm toegankelijkheid.)

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
30
            <ul>
              <li><a href="#" id="trigger-submenu1" title="">Submenu1</a>
                <ul id="navigation-submenu1">
                  <li><a href="#" title="">Optie</a></li>
                  <li><a href="#" title="">Optie</a></li>
                  <li><a href="#" title="">Optie</a></li>
                </ul>
              </li>
              <li><a href="#" id="trigger-submenu2" title="">Submenu2</a>
                <ul id="navigation-submenu2">
                  <li><a href="#" id="trigger-subsubmenu1" title="">Subsubmenu1</a>
                    <ul id="navigation-subsubmenu1">
                      <li><a href="#" title="">Optie</a></li>
                      <li><a href="#" title="">Optie</a></li>
                      <li><a href="#" title="">Optie</a></li>
                    </ul>
                  </li>
                  <li><a href="#" id="trigger-subsubmenu2" title="">Subsubmenu2</a>
                    <ul id="navigation-subsubmenu2">
                      <li><a href="#" title="">Optie</a></li>
                      <li><a href="#" title="">Optie</a></li>
                      <li><a href="#" title="">Optie</a></li>
                    </ul>
                  </li>
                  <li><a href="#" title="">Optie</a></li>
                  <li><a href="#" title="">Optie</a></li>
                  <li><a href="#" title="">Optie</a></li>
                </ul>
              </li>
            </ul>


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// This function shows an id
function showId(id) {
    if ( document.getElementById ) {
        document.getElementById(id).style.display = 'block';
    }
}

// This function hides an id
function hideId(id) {
    if ( document.getElementById ) {
        document.getElementById(id).style.display = 'none';
    }
}

// This function shows or hides ('flips') an id, depending on the current display value
function flipId(id) {
    if ( document.getElementById ) {
        if ( document.getElementById(id).style.display == 'block' ) {
            hideId(id);

        }
        else {
            showId(id);
        }
    }
}

// This function hides all submenus
function navigationHideAll() {
    hideId('navigation-submenu1');
    hideId('navigation-submenu2');
        hideId('navigation-subsubmenu1');
        hideId('navigation-subsubmenu2');
}

// This function controls the actual navigation behaviour
function navigation() {
    if ( document.getElementById ) {
        // Submenu 1
        document.getElementById('trigger-submenu1').onclick = function() {
            // onclick, flip the following id's
            flipId('navigation-submenu1');
            // onclick, hide the following id's
            hideId('navigation-submenu2');
                hideId('navigation-subsubmenu1');
                hideId('navigation-subsubmenu2');
        }
        // Submenu2
        document.getElementById('trigger-submenu2').onclick = function() {
            // onclick, flip the following id's
            flipId('navigation-submenu2');
            // onclick, hide the following id's
            hideId('navigation-submenu1');
            hideId('navigation-subsubmenu1');
            hideId('navigation-subsubmenu2');
        }
        // Subsubmenu1
        document.getElementById('trigger-subsubmenu1').onclick = function() {
            // onclick, flip the following id's
            flipId('navigation-subsubmenu1');
            // onclick, hide the following id's
            hideId('navigation-submenu1');
            hideId('navigation-subsubmenu2');
            // Do not hide the direct parent (submenu2)
        }
        // Subsubmenu2
        document.getElementById('trigger-subsubmenu2').onclick = function() {
            // onclick, flip the following id's
            flipId('navigation-subsubmenu2');
            // onclick, hide the following id's
            hideId('navigation-algemeen');
            hideId('navigation-subsubmenu1');
            // Do not hide the direct parent (submenu2)
        }

    }
}

function loadNavigation {
    navigation();
    navigationHideAll();
}
window.onload = loadNavigation;

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 14 december 2005 @ 18:25:
Deze code werkt dus naar believen, maar is erg lang en omslachtig. Is het mogelijk hetzelfde te doen met minder en beter te onderhouden code?
Ja dat is mogelijk.
En nu? Moeten wij het voor je gaan schrijven? ;)

Wat heb je zelf al geprobeerd? Wat werkte er niet? enz. enz.

Paar hints:
• Je zou lussen (loops) kunnen gebruiken om items 1 voor 1 na te lopen in plaats van ze allemaal apart te doen.
• Je hebt veel stukken dezelfde code; maak daar eens functies voor?
• Recursie :Y)
Dat zijn al 3 hints/tips ;)

...en dan maak je nog niet eens optimaal gebruik van je DOM-tree ;)

[ Voor 125% gewijzigd door RobIII op 14-12-2005 18:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Dat zou niet eens zo'n slechte oplossing zijn, RobIII.

...

Maar eerlijk gezegd zit ik met de handen in het haar.
Ik ben absoluut niet thuis in javascript en weet écht even niet hoe te werk te gaan.

Het lijkt mij dat ik de id van het op een bepaald moment geopende submenu kan vangen in een variabele, om bij een onclick van een andere trigger alleen dat submenu te sluiten - de huidige methode sluit immers een x-tal submenus die toch al gesloten zijn.

Verder moet dit stuk code herbruikbaar te maken zijn, maar ook dat is me tot op heden niet gelukt.

code:
1
2
3
4
5
6
7
8
        document.getElementById('trigger-subsubmenu2').onclick = function() {
            // onclick, flip the following id's
            flipId('navigation-subsubmenu2');
            // onclick, hide the following id's
            hideId('navigation-algemeen');
            hideId('navigation-subsubmenu1');
            // Do not hide the direct parent (submenu2)
        }

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je bent absoluut niet thuis in Javascript, maar produceert wel deze code? ;)

Je hebt 3 opties:

[list=1]
• Laat de code zo (if it's not broken, don't fix it)
• Vraagt degene die dit heeft gemaakt om het te optimaliseren, want wij doen niet aan script-requests ;)
• Ga zelf JS leren en stel hier je beter uitgelegde vragen.


Tot die tijd, zet ik hier even een slotje op ;)

[ Voor 4% gewijzigd door BtM909 op 14-12-2005 19:07 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Dit topic is gesloten.