Ik werk bij een organisatie waar onder andere statistieken over examenresultaten verzameld worden. Het systeem dat we hiervoor gebruiken, is webbased en heeft zeer lange admin pagina's. Het leek mij daarom handig een library te schrijven waarmee ik de tientallen fieldsets op een pagina kan in- en uitklappen. Een werkend voorbeeld hiervan staat onderaan deze post. Ik denk dat dit een stukje code is dat we allemaal wel kunnen gebruiken 
Nu het klaar is, loop ik tegen het volgende probleem. In de uitgangspositie staan alle fieldsets in een pagina ingeklapt. Je kunt er een of meerdere openklappen en in de inhoud ervan (bij ons textfields en textarea's) aanpassen. Maar nu: als ik een pagina reload (bijvoorbeeld omdat ik wat gegevens opsla / submit), staan alle fieldsets na de reload weer ingeklapt. De staat van de fieldsets (ingeklapt of niet) wordt niet onthouden. Dat is irritanter dan ik dacht.
Ik ben echter meer een amateur dan een professionele javascripter. Onderstaande code heb ik na heel veel moeite geschreven aan de hand van voorbeelden. Ik wilde vragen of er hier mensen zijn die mij op weg kunnen helpen met het implementeren van een systeem dat de status van elke fieldset onthoudt? Dit kan alleen via een cookie. Ik heb al twee cookie functies erbij gestopt. Ik vraag me alleen het volgende af:
Nu het klaar is, loop ik tegen het volgende probleem. In de uitgangspositie staan alle fieldsets in een pagina ingeklapt. Je kunt er een of meerdere openklappen en in de inhoud ervan (bij ons textfields en textarea's) aanpassen. Maar nu: als ik een pagina reload (bijvoorbeeld omdat ik wat gegevens opsla / submit), staan alle fieldsets na de reload weer ingeklapt. De staat van de fieldsets (ingeklapt of niet) wordt niet onthouden. Dat is irritanter dan ik dacht.
Ik ben echter meer een amateur dan een professionele javascripter. Onderstaande code heb ik na heel veel moeite geschreven aan de hand van voorbeelden. Ik wilde vragen of er hier mensen zijn die mij op weg kunnen helpen met het implementeren van een systeem dat de status van elke fieldset onthoudt? Dit kan alleen via een cookie. Ik heb al twee cookie functies erbij gestopt. Ik vraag me alleen het volgende af:
- Waarschijnlijk moet ik een cookie maken met als titel "collapsed", en daar een array met ingeklapte fieldsets stoppen. Als een fieldset dan uitgeklapt wordt, moet ik de fieldset uit de cookie verwijderen. Mijn vraag is hoe ik een array in een cookie stop en hoe ik de fieldsets uniek kan onderscheiden? Ik zit te denken aan onderscheiden op de 'legend'
- Op welk moment in de code is het een goed moment om de cookie-functies te laten lopen? Ik heb een idee aangegeven in de code
- hoe kan ik het beste de functie collapseAutoAttach aanpassen om door de array met ingeklapte fieldsets te lopen en de goede fieldsets een 'collapsed' class mee te geven c.q. te verwijderen?
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
| <script>
function eregReplace(search, replace, subject) {
return subject.replace(new RegExp(search,'g'), replace);
}
function setCookie(sName, sValue){
document.cookie = sName + '=' + escape(sValue) + '; expires=Fri, 31 Dec 2030 23:59:59 GMT; path=/';
}
function getCookie(sName) {
var aCookie = document.cookie.split('; '), i = aCookie.length, aCrumb;
while (i--) {
aCrumb = aCookie[i].split('=');
if (sName == aCrumb[0]) {
return typeof aCrumb[1] != 'undefined'? unescape(aCrumb[1]) : null;
}
}
return null;
}
function hasClass(node, className) {
if (node.className == className) {
return true;
}
var reg = new RegExp('(^| )' + className + '($| )')
if (reg.test(node.className)) {
return true;
}
return false;
}
function addClass(node, className) {
if (hasClass(node, className)) {
return false;
}
node.className += ' ' + className;
return true;
}
function removeClass(node, className) {
if (!hasClass(node, className)) {
// legend = node.getElementsByTagName('legend');
// hier aan cookie toevoegen
return false;
}
node.className = eregReplace('(^| )' + className +'($| )', '', node.className);
return true;
}
function toggleClass(node, className) {
if (!removeClass(node, className) && !addClass(node, className)) {
return false;
}
return true;
}
function removeNode(node) {
if (typeof node == 'string') {
node = $(node);
}
if (node && node.parentNode) {
return node.parentNode.removeChild(node);
}
else {
return false;
}
}
function collapseAutoAttach() {
var fieldsets = document.getElementsByTagName('fieldset');
var legend, fieldset;
for (var i = 0; fieldset = fieldsets[i]; i++) {
legend = fieldset.getElementsByTagName('legend');
legend = legend[0];
var a = document.createElement('a');
a.href = '#';
a.onclick = function() {
toggleClass(this.parentNode.parentNode, 'collapsed');
this.blur();
return false;
}
a.innerHTML = legend.innerHTML;
while (legend.hasChildNodes()) {
removeNode(legend.childNodes[0]);
}
legend.appendChild(a);
}
}
</script>
<style>
fieldset {margin-bottom: 15px;}
fieldset.collapsed {border-bottom-width: 0; border-left-width: 0; border-right-width: 0; margin-bottom: 0;}
fieldset.collapsed * {display: none;}
fieldset.collapsed table *, fieldset.collapsed legend, fieldset.collapsed legend * {display: inline;}
fieldset.collapsible legend a {padding-left: 25px; background: url("http://melati.org/melati-static/admin/minus.gif") 0 50% no-repeat;}
fieldset.collapsed legend a {background-image: url("http://www.netonews.co.il/IOS/Img/FrontIcons/plus.jpg");}
fieldset.collapsible legend a {display: block;}
</style>
<fieldset class="collapsible collapsed">
<legend>Bedrijfsbeschrijving</legend>
<div>Hier een heleboel interessante info!!</div>
</fieldset>
<fieldset class="collapsible collapsed">
<legend>Persoonsbeschrijving</legend>
<div>Hier een heleboel interessante info!!</div>
</fieldset>
<fieldset class="collapsible collapsed">
<legend>Dingbeschrijving</legend>
<div>Hier een heleboel interessante info!!</div>
</fieldset>
<script>
collapseAutoAttach();
</script> |