class wijzigen mbv javascript
Ik heb een pagina met een aantal div's welke standaard een blauwe achtergrondkleur hebben. Door er op te klikken moet de betreffende div wit worden. Standaard bij openen van de pagina is de eerste div wit. Het wisselen van kleuren werkt maar de eerste div blijft wit als je een andere aanklikt tenzij je de eerste div al aangeklikt hebt. Hoe verander ik dit?
<style type="text/css">
body{
font-family: Arial, Helvetica, sans-serif;
}
.deselected{
width:200px;
height:200px;
display:block;
border:1px solid black;
background-color:#09F;
color:#FFF;
float:left;
margin-right:10px;
}
.selected{
width:200px;
height:200px;
display:block;
border:1px solid black;
background-color:#FFF;
color:#000;
float:left;
margin-right:10px;
}
p{
margin:10px;
font-size:20px;
}
</style>
<script type="text/javascript">
var Lst;
function CngClass(obj){
if (Lst) Lst.className='deselected';
obj.className='selected';
Lst=obj;
}
</script>
</head>
<body>
<div class="selected" onclick="CngClass(this);"><p>vak 1</p></div>
<div class="deselected" onclick="CngClass(this);"><p>vak 2</p></div>
<div class="deselected" onclick="CngClass(this);"><p>vak 3</p></div>
<div class="deselected" onclick="CngClass(this);"><p>vak 4</p></div>
</body>
</html>
<style type="text/css">
body{
font-family: Arial, Helvetica, sans-serif;
}
.deselected{
width:200px;
height:200px;
display:block;
border:1px solid black;
background-color:#09F;
color:#FFF;
float:left;
margin-right:10px;
}
.selected{
width:200px;
height:200px;
display:block;
border:1px solid black;
background-color:#FFF;
color:#000;
float:left;
margin-right:10px;
}
p{
margin:10px;
font-size:20px;
}
</style>
<script type="text/javascript">
var Lst;
function CngClass(obj){
if (Lst) Lst.className='deselected';
obj.className='selected';
Lst=obj;
}
</script>
</head>
<body>
<div class="selected" onclick="CngClass(this);"><p>vak 1</p></div>
<div class="deselected" onclick="CngClass(this);"><p>vak 2</p></div>
<div class="deselected" onclick="CngClass(this);"><p>vak 3</p></div>
<div class="deselected" onclick="CngClass(this);"><p>vak 4</p></div>
</body>
</html>
Vak 1 staat als class al standaard op selected.
Zodra iemand klikt op een ander vak pas je mbv javascript alleen dat vak aan, daar gaat het "fout".
Zodra iemand klikt op een ander vak pas je mbv javascript alleen dat vak aan, daar gaat het "fout".
Mijn eerste reactie is om het zo ongeveer te doen
EDIT: blijkbaar geeft document.getElementsByClassName problemen met IE < 9.
Intussen aangepast, met een custom getElementsByClassName
---
Je kan eventueel de gemeenschappelijke css verhuizen naar
.vak {}
Het lijkt me stabieler als enkel de kleuren veranderen en de grootte en positionering niet wordt aangepast
EDIT: blijkbaar geeft document.getElementsByClassName problemen met IE < 9.
Intussen aangepast, met een custom getElementsByClassName
Code (php)
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
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
...
<script type="text/javascript">
function CngClass(obj) {
var vakken = getElementsByClassName('vak'); // wegens IE > 9 ... geen documents.getElementsByClassName, maar een custom functie
for(var i=0; i<vakken.length; i++) {
if(vakken[i] == obj) {
// het geklikte object
if(hasClass(obj, 'deselected')) {
removeClass(obj, 'deselected');
}
if(!hasClass(obj, 'selected')) {
addClass(obj, 'selected');
}
}
else {
// al de rest
if(hasClass(vakken[i], 'selected')) {
removeClass(vakken[i], 'selected');
}
if(!hasClass(vakken[i], 'deselected')) {
addClass(vakken[i], 'deselected');
}
}
}
}
/**
* IE < 9 kent document.getElementsByClassName blijkbaar niet. Dan maar een custom functie
* @see http://stackoverflow.com/questions/4404154/getelementsbyclassname-ie-resolution-issue
*/
function getElementsByClassName(findClass, parent) {
parent = parent || document;
var elements = parent.getElementsByTagName('*');
var matching = [];
for(var i = 0, elementsLength = elements.length; i < elementsLength; i++){
if ((' ' + elements[i].className + ' ').indexOf(findClass) > -1) {
matching.push(elements[i]);
}
}
return matching;
}
/**
* @see http://www.avoid.org/?p=78
*/
function hasClass(el, name) {
return new RegExp('(\\s|^)'+name+'(\\s|$)').test(el.className);
}
function addClass(el, name) {
if (!hasClass(el, name)) { el.className += (el.className ? ' ' : '') +name; }
}
function removeClass(el, name) {
if (hasClass(el, name)) {
el.className=el.className.replace(new RegExp('(\\s|^)'+name+'(\\s|$)'),' ').replace(/^\s+|\s+$/g, '');
}
}
</script>
</head>
<body>
<div class="vak selected" onclick="CngClass(this);"><p>vak 1</p></div>
<div class="vak deselected" onclick="CngClass(this);"><p>vak 2</p></div>
<div class="vak deselected" onclick="CngClass(this);"><p>vak 3</p></div>
<div class="vak deselected" onclick="CngClass(this);"><p>vak 4</p></div>
</body>
</html>
<script type="text/javascript">
function CngClass(obj) {
var vakken = getElementsByClassName('vak'); // wegens IE > 9 ... geen documents.getElementsByClassName, maar een custom functie
for(var i=0; i<vakken.length; i++) {
if(vakken[i] == obj) {
// het geklikte object
if(hasClass(obj, 'deselected')) {
removeClass(obj, 'deselected');
}
if(!hasClass(obj, 'selected')) {
addClass(obj, 'selected');
}
}
else {
// al de rest
if(hasClass(vakken[i], 'selected')) {
removeClass(vakken[i], 'selected');
}
if(!hasClass(vakken[i], 'deselected')) {
addClass(vakken[i], 'deselected');
}
}
}
}
/**
* IE < 9 kent document.getElementsByClassName blijkbaar niet. Dan maar een custom functie
* @see http://stackoverflow.com/questions/4404154/getelementsbyclassname-ie-resolution-issue
*/
function getElementsByClassName(findClass, parent) {
parent = parent || document;
var elements = parent.getElementsByTagName('*');
var matching = [];
for(var i = 0, elementsLength = elements.length; i < elementsLength; i++){
if ((' ' + elements[i].className + ' ').indexOf(findClass) > -1) {
matching.push(elements[i]);
}
}
return matching;
}
/**
* @see http://www.avoid.org/?p=78
*/
function hasClass(el, name) {
return new RegExp('(\\s|^)'+name+'(\\s|$)').test(el.className);
}
function addClass(el, name) {
if (!hasClass(el, name)) { el.className += (el.className ? ' ' : '') +name; }
}
function removeClass(el, name) {
if (hasClass(el, name)) {
el.className=el.className.replace(new RegExp('(\\s|^)'+name+'(\\s|$)'),' ').replace(/^\s+|\s+$/g, '');
}
}
</script>
</head>
<body>
<div class="vak selected" onclick="CngClass(this);"><p>vak 1</p></div>
<div class="vak deselected" onclick="CngClass(this);"><p>vak 2</p></div>
<div class="vak deselected" onclick="CngClass(this);"><p>vak 3</p></div>
<div class="vak deselected" onclick="CngClass(this);"><p>vak 4</p></div>
</body>
</html>
---
Je kan eventueel de gemeenschappelijke css verhuizen naar
.vak {}
Het lijkt me stabieler als enkel de kleuren veranderen en de grootte en positionering niet wordt aangepast
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.deselected {
color:#FFF;
background-color:#09F;
}
.selected {
color:#000;
background-color:#FFF;
}
.vak {
width:200px;
height:200px;
display:block;
border:1px solid black;
float:left;
margin-right:10px;
}
color:#FFF;
background-color:#09F;
}
.selected {
color:#000;
background-color:#FFF;
}
.vak {
width:200px;
height:200px;
display:block;
border:1px solid black;
float:left;
margin-right:10px;
}
Gewijzigd op 03/10/2012 17:54:08 door Kris Peeters
Het werkt! Bedankt. Ik ben nog niet zo thuis in javascript dus het is even uitvogelen hoe e.e.a. precies werkt. Het bovenste deel begrijp ik maar waarom is het 2e deel (vanaf /** IE <9 ....) nog nodig? In Chrome werkt het ook niet zonder het tweede deel.
De andere browsers hebben de functie
document.getElementsByClassName
IE < 9 kent die functie niet, waardoor ik dus een custom getElementsByClassName moest zoeken.
Met Chrome kan je dus (de aanroep van) die custom functie vervangen door document.getElementsByClassName
document.getElementsByClassName
IE < 9 kent die functie niet, waardoor ik dus een custom getElementsByClassName moest zoeken.
Met Chrome kan je dus (de aanroep van) die custom functie vervangen door document.getElementsByClassName




