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.)
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; |