vak geselecteerd houden bij volgende datum

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rene Zwolsman

Rene Zwolsman

13/10/2012 21:55:36
Quote Anchor link
Ik heb een pagina met grafieken gebouwd waar je door op de knop links en rechts van de grafiek een dag voor of achteruit kan. De knop zorgt voor een aanvulling in de url met de datum van morgen of gisteren. Ik heb echter een grafiek voor 2 variabelen. Standaard is variabele 1 geselecteerd en door op het vak van variabele 2 te klikken wordt de grafiek van variabele 2 weergegeven. Maar als je dan een dag voor of achteruit gaat wordt standaard weer de garfiek van variabele 1 weergegeven. Hoe zorg ik er voor dat je ook voor variabele 2 voor en achteruit kan bladeren zonder steeds van variabele moet wisselen?

Ik heb het versimpeld in onderstaande code samengevat:

<html>
<head>
<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 == 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, 'selected')) {
removeClass(vakken, 'selected');
}
if(!hasClass(vakken, 'deselected')) {
addClass(vakken, '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.className + ' ').indexOf(findClass) > -1) {
matching.push(elements);
}
}
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>

<style type="text/css">
.knop{
width:20px;
height:100px;
float:left;
}
#datumvak{
width:200px;
height:100px;
background-color:#09F;
float:left;
margin-left:5px;
margin-right:5px;
margin-bottom:0px;
}
.vak{
width:80px;
height:80px;
border:1px solid black;
margin:2px;
padding:10px;
float:left;
}

.selected{
background-color:#FFF;
color:#000;
}

.deselected{
background-color:#F3F;
color:#FFF;
}
</style>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if (isset($_GET['datum'])) {//variabele datum in URL
$datum = $_GET['datum'];
}

else{
    $datum = date("Y-m-d",time());
}


$terug = date("Y-m-d",(strtotime($datum)-86400));
$vooruit = date("Y-m-d",(strtotime($datum)+86400));
?>


</head>

<body>

<a href="test3.php?datum=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $terug; ?>
"><input type="button" class="knop" value="<" /></a>

<div id="datumvak">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "de datum is $datum";
?>

</div>
<a href="test3.php?datum=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $vooruit; ?>
"><input type="button" class="knop" value=">" /></a>
<div class="vak selected" onclick="CngClass(this)";>vak 1</div>
<div class="vak deselected" onclick="CngClass(this)";>vak 2</div>

</body>
</html>
 
PHP hulp

PHP hulp

28/04/2024 19:56:00
 
Kris Peeters

Kris Peeters

15/10/2012 12:02:48
Quote Anchor link
Hey,
Ik zal je het zelfde principe voorstellen als dit hier:
http://www.phphulp.nl/php/forum/topic/run-functies-op-pagina-loadrefresh/87080/
Je herkent de gelijkaardige vraag.
Meer uitleg over het principe vind je daar ook

---
In jouw geval: de href van de links "previous" en "next" krijgen een extra stukje url, met een # en daar een extra variabele rechts van. De inhoud daarvan is de index (0 ofwel 1) van het geselecteerde vak.

Bij het laden van de pagina wordt die index gelezen uit de url en wordt CngClass() aangeroepen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<html>
<head>
<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');
        // nu gaan we ook de links 'previous' / 'next' aanpassen, zodat ze deze keuze meenemen naar de andere pagina
        addHash2Links (i);
      }
    }
    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;
}
/**
*  Deze functie geeft past de link aan; ...
*/
function addHash2Links (index) {
  var prev = document.getElementById('prev_link');
  var next = document.getElementById('next_link');
  var prev_link = prev.href.split('#');
  var next_link = next.href.split('#');
  prev.href = prev_link[0] + '#' + index;
  next.href = next_link[0] + '#' + index;
}
function readHash() {
  var url = window.location.toString().split('#');
  if (typeof url[1] != 'undefined' && Number(url[1]) > 0) {
    // Er staat in de url iets na het # teken
    var vakken = getElementsByClassName('vak');    
    CngClass(vakken[Number(url[1])]);
  }
}

/**
*  @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>

...

<body onload="readHash();">
  <a href="?datum=<?php echo $terug; ?>" id="prev_link"><input type="button" class="knop" value="<" /></a>
  <div id="datumvak">
  <?php
  echo "de datum is $datum";
  ?>

  </div>
  <a href="?datum=<?php echo $vooruit; ?>" id="next_link"><input type="button" class="knop" value=">" /></a>
  <div class="vak selected" onclick="CngClass(this)";>vak 1</div>
  <div class="vak deselected" onclick="CngClass(this)";>vak 2</div>
</body>
</html>




Toevoeging op 15/10/2012 12:04:11:

Kris Peeters op 15/10/2012 12:02:48:
Hey,
Ik zal je het zelfde principe voorstellen als dit hier:
http://www.phphulp.nl/php/forum/topic/run-functies-op-pagina-loadrefresh/87080/
Je herkent de gelijkaardige vraag.
Meer uitleg over het principe vind je daar ook

---
In jouw geval: de href van de links "previous" en "next" krijgen een extra stukje url, met een # en daar een extra variabele rechts van. De inhoud daarvan is de index (0 ofwel 1) van het geselecteerde vak.

Bij het laden van de pagina ( <body onload="readHash();"> )wordt die index gelezen uit de url en wordt CngClass() aangeroepen (met het juiste object).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<html>
<head>
<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');
        // nu gaan we ook de links 'previous' / 'next' aanpassen, zodat ze deze keuze meenemen naar de andere pagina
        addHash2Links (i);
      }
    }
    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;
}
/**
*  Deze functie geeft past de link aan; ...
*/
function addHash2Links (index) {
  var prev = document.getElementById('prev_link');
  var next = document.getElementById('next_link');
  var prev_link = prev.href.split('#');
  var next_link = next.href.split('#');
  prev.href = prev_link[0] + '#' + index;
  next.href = next_link[0] + '#' + index;
}
function readHash() {
  var url = window.location.toString().split('#');
  if (typeof url[1] != 'undefined' && Number(url[1]) > 0) {
    // Er staat in de url iets na het # teken
    var vakken = getElementsByClassName('vak');    
    CngClass(vakken[Number(url[1])]);
  }
}

/**
*  @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>

...

<body onload="readHash();">
  <a href="?datum=<?php echo $terug; ?>" id="prev_link"><input type="button" class="knop" value="<" /></a>
  <div id="datumvak">
  <?php
  echo "de datum is $datum";
  ?>

  </div>
  <a href="?datum=<?php echo $vooruit; ?>" id="next_link"><input type="button" class="knop" value=">" /></a>
  <div class="vak selected" onclick="CngClass(this)";>vak 1</div>
  <div class="vak deselected" onclick="CngClass(this)";>vak 2</div>
</body>
</html>


 
Rene Zwolsman

Rene Zwolsman

21/10/2012 16:22:50
Quote Anchor link
Ik ben flink aan het stoeien geweest om het in mijn echte pagina te implementeren. Dat is uiteindelijk gelukt... Maar... Nu wil ik de grafiek behorende bij het geselecteerde vak weergeven. Dus als vak 1 geselecteerd is doe "bla" en als vak 2 geselecteerd is, doe "blabla".

Ik heb dit geprobeerd door in de vakken een link op te nemen welke een variabele voor het betreffende vak in de url toevoegt. Op deze manier kan ik de variabele uit de url halen en de juiste grafiek weergeven. Ik heb dit in de vereenvoudigde weergave als tekst in het blauwe vak opgenomen. Er komt hier te staan welk vak geselecteerd is. Dit werkt goed maar de kleur en dus de class van de selectievakken 1 en 2 springen weer terug naar vak 1 geselecteerd. Is dit wel de juiste manier of kan ik met Javascript een variabele toekennen aan het klikken op het vak? (ik ben meer bekend met php dan met javascript)

Dit heb ik er nu van gemaakt:

<html>
<head>
<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 == obj) {
// het geklikte object
if(hasClass(obj, 'deselected')) {
removeClass(obj, 'deselected');
}
if(!hasClass(obj, 'selected')) {
addClass(obj, 'selected');
// nu gaan we ook de links 'previous' / 'next' aanpassen, zodat ze deze keuze meenemen naar de andere pagina
addHash2Links (i);
}
}
else {
// al de rest
if(hasClass(vakken, 'selected')) {
removeClass(vakken, 'selected');
}
if(!hasClass(vakken, 'deselected')) {
addClass(vakken, '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.className + ' ').indexOf(findClass) > -1) {
matching.push(elements);
}
}
return matching;
}
/**
* Deze functie geeft past de link aan; ...
*/
function addHash2Links (index) {
var prev = document.getElementById('prev_link');
var next = document.getElementById('next_link');
var prev_link = prev.href.split('#');
var next_link = next.href.split('#');
prev.href = prev_link[0] + '#' + index;
next.href = next_link[0] + '#' + index;
}
function readHash() {
var url = window.location.toString().split('#');
if (typeof url[1] != 'undefined' && Number(url[1]) > 0) {
// Er staat in de url iets na het # teken
var vakken = getElementsByClassName('vak');
CngClass(vakken[Number(url[1])]);
}
}

/**
* @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>
<style type="text/css">
.knop{
width:20px;
height:100px;
float:left;
}
#datumvak{
width:200px;
height:100px;
background-color:#09F;
float:left;
margin-left:5px;
margin-right:5px;
margin-bottom:0px;
}
.vak{
width:80px;
height:80px;
border:1px solid black;
margin:2px;
float:left;
}

.selected{
background-color:#FFF;
color:#000;
}

.deselected{
background-color:#F3F;
color:#FFF;
}

.link{
display:block;
padding:30px 10px 30px 20px;
}

a{
text-decoration:none;
}
</style>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if (isset($_GET['datum'])) {//variabele datum in URL
$datum = $_GET['datum'];
}

else{
    $datum = date("Y-m-d",time());
}

if (isset($_GET['vak'])) {//variabele vak in URL
$vak = $_GET['vak'];
}

else{
    $vak = 1;
}



$terug = date("Y-m-d",(strtotime($datum)-86400));
$vooruit = date("Y-m-d",(strtotime($datum)+86400));
?>

</head>

<body onLoad="readHash();">
<a href="test4.php?datum=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $terug; ?>
" id="prev_link"><input type="button" class="knop" value="<" /></a>
<div id="datumvak">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
  if(!isset($vak)){
      $vak = "0";
  }
  
  echo "de datum is $datum <br> en vak $vak is geselecteerd";  
  ?>

</div>
<a href="test4.php?datum=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $vooruit; ?>
" id="next_link"><input type="button" class="knop" value=">" /></a>
<div class="vak selected" onClick="CngClass(this)";><a class="link" href="test4.php?datum=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $datum . "&vak=1"; ?>
">vak 1</a></div>
<div class="vak deselected" onClick="CngClass(this)";><a class="link" href="test4.php?datum=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $datum . "&vak=2"; ?>
">vak 2</a></div>
</body>
</html>
 
Rene Zwolsman

Rene Zwolsman

22/10/2012 19:46:43
Quote Anchor link
Ik ben er uit. Ik heb aan de readHash() nog een functie gevoegd welke aangeroepen wordt op het moment dat op het vak wordt geklikt. Er wordt dan een variabele ingesteld welke ik elders weer uitlees om te bepalen welke grafiek ik moet genereren. De link heb ik uit het vak verwijderd. Voor zover opgelost!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.