# Checkbox status speichern



## messmar (26. April 2008)

Hallo,

wie kann man den Status eins Checkboxes merken bzw.irgendwie speichern und dann anzeigen lassen.

Ich habe das Problem, dass wenn der User einen Checkbox auf eine Seite aktiviert und zur nächsten Seite navigiert, aber wieder die vorherige Seite aufruft, dass der vorher aktivierte Checkbox wieder inaktiv ist, was eigentlich nicht passieren darf.

Ich entschuldige mich, falls die Beschreibung meines Problems nicht gut ist aber, ich hoffe dass Ihr versteht, was ich sagen will...

Danke und Gruß
Messmar


----------



## Maik (26. April 2008)

Hi,

hierfür gibt es die checked-, sowie defaultChecked-Eigenschaft des Radiobuttons und der  Checkbox.


----------



## messmar (26. April 2008)

Hi,

danke schon Mal für die Antwort...dieses Attribute kenne ich schon. es geht eigentlich um eine Pagination, wo ich am Ende jedes Datensatzes einen Checkbox habe, den der User anklicken kann. Dein Vorschlage würde hier leider überhaupt nicht helfen...

Danke und Gruß
Messmar


----------



## Sven Mintel (26. April 2008)

Du könntest den Status der Checkbox(en) in einem Cookie speichern, und ihn dann beim Laden der Seite *mit JS* auslesen und setzen.


----------



## Maik (26. April 2008)

messmar hat gesagt.:


> Dein Vorschlage würde hier leider überhaupt nicht helfen...


Ich habe lediglich auf deine Eingangsfrage geantwortet, wie du den Status der Checkbox abfragen kannst - eben mit Hilfe der beiden genannten Objekteigenschaften. 

Dass die angehängten Beispiele in dem Kapitel sich nicht mit deinem Fall decken, sollte sich eigentlich von selbst verstehen. Alles andere wäre der pure Zufall, dass du dort einen maßgeschneiderten Codeschnipsel für dein Problem vorfindest.


----------



## messmar (27. April 2008)

hi,

wird für den Cookie einen HttpRequest gebraucht oder nicht? das Problem ist das es beim navigieren zu den anderen Seiten bzw. anzeigen der restlichen Daten keinen submit bzw. keinen Request an Server geschickt.

Es werden einfach zunächst die Daten gesammelt und am Ende wird ein Formular an den Server geschickt.

Gruß
Messmar


----------



## Sven Mintel (27. April 2008)

Es wird kein Request benötigt, da Cookies ja beim Clienten gespeichert werden.
Einfach den Cookie setzen, entweder nach jeder Checkbox-Änderung, oder in einem Rutsch beim onunload.


----------



## messmar (27. April 2008)

Hi,

Vielen Dank.... ich habe offen gesagt keinen Plan, wie ich das mit dem Cookie realisieren kann, aber ich google Mal und versuche diesbezüglich was zu finden.

Ich wäre aber auch sehr dankbar, falls Ihr einen Link oder Referenz für sowas habt und  posten würdet.

Gruß
Messmar


----------



## Maik (27. April 2008)

Bitte schön, ein Keks zu später Stunde: cookie


----------



## messmar (27. April 2008)

Hallo Sven,

danke danke...den Link hatte schon. Mir fehlt es an die logik mit der ich den Status mehrerer dynamischen Checkboxen in dem Cookie speichere.

Ich werde googeln und schauen, was ich da, diesbezüglich finde.

Vielen Dank noch Mal für eure Hilfe und Tipps ;-)

Gruß
Messmar


----------



## Maik (27. April 2008)

messmar hat gesagt.:


> Hallo Sven,
> 
> danke danke...den Link hatte schon.


Sven hat hier doch noch keinen einzigen Link gepostet :suspekt:


----------



## Sven Mintel (27. April 2008)

Hier mal ne Beispielfunktion, welche das tut:

```
<script type="text/javascript">
<!--
window.onload=window.onunload=function(event)
{
  e=(window.event)?window.event:event;
  a=document.getElementsByTagName('input');
  for(i=0;i<a.length;++i)
    {
      if(a[i].type=='checkbox' && a[i].name)
        {
          switch(e.type)
            {
              case 'load':
               a[i].checked=(get_cookie(a[i].name)==1)?true:false;
                break;
              case 'unload':
                set_cookie(a[i].name,(a[i].checked)?1:0,1);
                break;
            }
        }
    }
}
//-->
</script>
```

Sie geht alle Checkboxen beim onload und beim onunload durch und speichert den Status  bzw. liest ihn aus und aktiviert die Boxen bei Bedarf.
Pro Checkbox wird ein Cookie gesetzt...Name==Name der Checkbox,Wert:1 oder 0, jenachdem.

Müsste man natürlich noch etwas modifizieren, wenn du mehrere gleichnamige Checkboxen hast...und bedenke, dass diese Cookies in allen Dokumenten der Domain existieren, nicht nur in dem, wo sie gesetzt wurden.

Dazu benötigst du noch des Weiteren die Funktionen get_cookie() bzw. set_cookie()...diese findest du in diesem Thema: http://www.tutorials.de/forum/javascript-ajax/215012-probleme-mit-cookies.html


----------



## Sven Mintel (27. April 2008)

Maik hat gesagt.:


> Sven hat hier doch noch keinen einzigen Link gepostet :suspekt:



 Da muss der BND wohl noch mehr überwachen ausser afghanische Ministerien, wenn schon im Vorraus bekannt ist, dass ich einen Link posten werde :suspekt:


----------



## Maik (27. April 2008)

Sven Mintel hat gesagt.:


> Da muss der BND wohl noch mehr überwachen ausser afghanische Ministerien, wenn schon im Vorraus bekannt ist, dass ich einen Link posten werde :suspekt:


Nachtigall, ick hör dir trappsen


----------



## messmar (28. April 2008)

Hi Sven,



Sven Mintel hat gesagt.:


> Hier mal ne Beispielfunktion, welche das tut:
> Sie geht alle Checkboxen beim onload und beim onunload durch und speichert den Status  bzw. liest ihn aus und aktiviert die Boxen bei Bedarf.



Vielen vielen Dank für den Codeschnipssel... das werde ich natürlich erweitern und testen.

Gruß
Messmar


----------



## messmar (28. April 2008)

Hallo,



Sven Mintel hat gesagt.:


> Hier mal ne Beispielfunktion, ...



Es funkt. einwandfrei ;-)

Ich habe dazu 9 Text Felder vom Type: "hidden", die je nach aktiviertem Checkbox, mit einer Zahl befüllt werden.

d.h. in jedem Checkbox, habe ich das Attribute: "title" mit der entsprechenden AutoMarke aus der Datenbank vorbelegt. 
Es kann aber innerhalb einer Seite z.B. drei Checkboxen mit unterschiedlichem Namen geben, allerdings mit dem gleichen Title (brand).

z:B.

```
<input name="Avensis" title="Toyota" alt="22222222" value="Avensis" lang="18285 - 20135" type="checkbox">
<input name="Corolla" title="Toyota" alt="22222222" value="Corolla" lang="15290 - 18150" type="checkbox">
<input name="Focus CC" title="Ford" alt="66666666" value="Focus CC" lang="16810 - 20275" type="checkbox">
<input name="A3" title="Audi" alt="88888888" value="A3" lang="19215 - 21430" type="checkbox">
<input name="Scion" title="Toyota" alt="22222222" value="Avensis" lang="18285 - 20135" type="checkbox">
```

Ich will also erreichen, wenn es mindestens einer der Checkboxen von Toyota z.B. aktiviert ist, dass das hidden Textfeld im Formular mit der Zahl: "22222222" belegt wird, und nur wenn keiner der drei aktiviert ist, dann soll/muss das hidden Feld für Toyota leer sein.

ich will es auch in dem Cookie speichern und zwar folgendermaßen, aber es haut nicht hin:

```
<script>
window.onload=window.onunload=function(event)
{
	e=(window.event)?window.event:event;
	a=document.getElementsByTagName('input');
	for(i=0;i<a.length;++i)
	{
	     if(a[i].type=='checkbox' && a[i].name)
		{
		     switch(e.type)
			{
			      case 'load':
			      a[i].checked=(get_cookie(a[i].name)==1)?true:false;
			      alert(a[i].name + "-->>>>" + a[i].checked + "Brandname -->>>" + a[i].title);
				if(a[i].checked=='true' && a[i].title == 'Toyota'){
					alert('Toyota Checkbox'); 
									     document.getElementById('gidToyota').value=a[i].alt;
								   }else{document.getElementById('gidToyota').value='';}
		              break;
			      case 'unload':
		              set_cookie(a[i].name,(a[i].checked)?1:0,1);
			      alert(a[i].checked);
		              break;
		              }
		         }
		}
	}
//-->
</script>
```

Das Schreiben in dem hidden Feld funkt. beim ersten Mal, aber wenn ich zur nächsten Seite bzw. nächste Vier oder 5 Datensätze navigiere, dann ist es wieder leer. Irgendwie schaffe ich es nicht den Inhalt des Hiddenfelds in dem Cookie zu speichern und dessen Inhalt im Laufe der ganzen Applikation zu behalten.

Für Jede weitere/weiteren Hilfe/Tipp, bin ich sehr dankbar.

Danke und gruß
Messmar


----------



## Sven Mintel (29. April 2008)

Naja....erstmal jenes:

```
a[i].checked=='true'
```

...das haut so nicht hin, true gehört da ohne Anführungzeichen geschrieben, da dort ein boolescher Wert gesucht wird und keine Zeichenkette.

Weiterhin:
	
	
	



```
else{document.getElementById('gidToyota').value='';}
```

Angenommen, du hast Avensis gecheckt, Corolla aber nicht...dann leerst du das Feld ja beim Corolla wieder, obwohl es gefüllt bleiben soll(zumindest hab ich dich so verstanden)...lasse den else-Zweig einfach weg.

Was den Cookie für das versteckte input betrifft..ich sehe da nicht, wo du den setzt bzw. abfragst :-(


----------



## messmar (29. April 2008)

Sven Mintel hat gesagt.:


> ...da dort ein boolescher Wert gesucht wird und keine Zeichenkette



Du hast Recht ;-( Tipfehler bzw. Denkfehler



> ...lasse den else-Zweig einfach weg.



...das werde ich versuchen bzw. probieren...hoffe dass es hinhaut.


> Was den Cookie für das versteckte input betrifft..ich sehe da nicht, wo du den setzt bzw. abfragst :-(



;-(( hmmm Wieso nicht? das hidden Feld ist im Laufe der ganzen Applikation mit dem Namen: "gidToyota"  vorhanden... sein Inhalt kann doch in dem Cookie gesetzt und bei Bedarf angezeigt werden.

Danke und Gruß
Messmar


----------



## Sven Mintel (29. April 2008)

messmar hat gesagt.:


> ;-(( hmmm Wieso nicht? das hidden Feld ist im Laufe der ganzen Applikation mit dem Namen: "gidToyota"  vorhanden... sein Inhalt kann doch in dem Cookie gesetzt und bei Bedarf angezeigt werden.
> 
> Danke und Gruß
> Messmar



Jo, kann....und wie hast du es gemacht, dass es nicht ging?
.....


> Irgendwie schaffe ich es nicht den Inhalt des Hiddenfelds in dem Cookie zu speichern und dessen Inhalt im Laufe der ganzen Applikation zu behalten.


----------



## messmar (30. April 2008)

Hi Sven,



Sven Mintel hat gesagt.:


> Jo, kann....und wie hast du es gemacht, dass es nicht ging?
> .....



Folgendermaßen:

```
if(a[i].type=='hidden' && a[i].name){
   switch(e.type){
     case 'load':
     a[i].value=(get_cookie(a[i].name)=='gidFord')?true:false;
     alert(a[i].name + "::::::::::: " + a[i].value);
     break;
     case 'unload':
     set_cookie(a[i].name,(a[i].value)?1:0,1);
     break;
  }
}
```

Ich weiß aber, dass ich z.B. den String:"gidFord" durch ne Variable, die den Status des Checkboxes enthält ersetzen muss, aber da komme ich nicht drauf...weiterhin musste ich diese Abfrage innerhalb der anderen Checkboxen Abfrage, die den CheckboxStatus im Cookie setzt, einfügen etc.

Mir würde auch reichen, wenn ich es hin bekomme, dass ein Hiddenfeld, das ein Checkbox entspricht (für Toyota, Renault oder VW etc.), den Wert true enthält, solange es mindesten ein Checkbox dieser Marke aktiviert ist bzw. gechecked ist.

Da ich am Ende der Pagination, diese, in den Hiddenfeldern gespeicherten, Daten per Request (Formular Submit) an den Server schicke.

Gruß
Messmar


----------



## Sven Mintel (30. April 2008)

messmar hat gesagt.:


> Ich weiß aber, dass ich z.B. den String:"gidFord" durch ne Variable, die den Status des Checkboxes enthält ersetzen muss



Ich weiss nicht, ob du darauf hinauswillst, aber du kannst per match()auch den Namen der versteckten Felder prüfen, ob er mit gid beginnt, und falls ja, die Automarke daraus extrahieren.

Ich glaube aber insgesamt, dass du das ganze speichern in den Cookies etwas anders machen solltest, um da Ordnung hineinzubekommen....sonst geht da alles Querbeet, jenachdem in welcher Reihenfolge sich die Formularelemente befinden.

Denkbar wäre bspw. Folgendes:
Du speicherst 1 Cookie pro Automarke, darin legst du, separiert durch Komma o.ä., den Namen des Modells ab, sofern die dazugehörige Checkbox aktivert ist(ist sie nict aktiviert, musst du natürlich das zugehörige Modell aus dem Cookie entfernen).

Das versteckte Feld brauchst du dann überhaupt nicht, da du einfach nur nachgucken musst, ob sich in dem Cookie überhaupt etwas befindet.


----------



## messmar (30. April 2008)

Hi, danke schon Mal.



Sven Mintel hat gesagt.:


> Ich weiss nicht, ob du darauf hinauswillst, aber du kannst per match()auch den Namen der versteckten Felder prüfen, ob er mit gid beginnt, und falls ja, die Automarke daraus extrahieren.



Ja, sowas habe ich mir auch gedacht, und zwar muss ich den String spliten und daraus den Namen der Automarke abfragen.



> ....sonst geht da alles Querbeet, jenachdem in welcher Reihenfolge sich die Formularelemente befinden.



das befürchte ich, aber es kann sein dass das die sauberere und bessere Lösung wäre.



> Denkbar wäre bspw. Folgendes:
> ...sofern die dazugehörige Checkbox aktivert ist(ist sie nict aktiviert, musst du natürlich das zugehörige Modell aus dem Cookie entfernen).



hießt das, den cookie muss ich am Anfang erstellen und dann pro aktivierter Checkbox den Inhlat von dem: "title" Attribute in dem entsprechenden cookie schireben?

Gruß
Messmar


----------



## Sven Mintel (30. April 2008)

messmar hat gesagt.:


> hießt das, den cookie muss ich am Anfang erstellen und dann pro aktivierter Checkbox den Inhlat von dem: "title" Attribute in dem entsprechenden cookie schireben?
> 
> Gruß
> Messmar



Jo, so hätte ich mir das gedacht.


----------



## messmar (30. April 2008)

Hi,



Sven Mintel hat gesagt.:


> Jo, so hätte ich mir das gedacht.



dann wäre das hier ein Anfang...das ist zwar nicht elegant, aber ein Ansatzpunkt, glaube ich, und es funktioniert zum Teil auch außer dass die Werte dann verloren gehen, wenn ich weiter navigiere...Ist auch logisch, da die Werte nicht in dem Cookie gespeichert sind.

```
window.onload=window.onunload=function(event)
{
  e=(window.event)?window.event:event;
  a=document.getElementsByTagName('input');
  for(i=0;i<a.length;++i)
    {
      if(a[i].type=='checkbox' && a[i].name)
        {
          switch(e.type)
            {
              case 'load':
               a[i].checked=(get_cookie(a[i].name)==1)?true:false;
			   alert(a[i].name + "-->>>>" + a[i].checked + "Brandname -->>>" +  a[i].title);
			   if(a[i].checked==true && a[i].title == 'Toyota'){
				   alert('Toyota Checkbox'); 
				   document.getElementById('gidToyota').value=a[i].alt;
			   }
			   if(a[i].checked==true && a[i].title == 'Ford'){
				   alert('Ford Checkbox'); 
				   document.getElementById('gidFord').value=a[i].alt;
			   }
			   if(a[i].checked==true && a[i].title == 'Renault'){
				   alert('Renault Checkbox'); 
				   document.getElementById('gidRenault').value=a[i].alt;
			   }
			   if(a[i].checked==true && a[i].title == 'Vw'){
				   alert('Vw Checkbox'); 
				   document.getElementById('gidVw').value=a[i].alt;
			   }
                break;
              case 'unload':
                set_cookie(a[i].name,(a[i].checked)?1:0,1);
				
                break;
            }
        }
    }
}
```

Das Einzige und auch entscheidende, was es noch gemacht werden muss ist, den:

```
document.getElementById('gidToyota').value=a[i].alt;
```

durch die Funktion für das Setzen von dem Cookie für das entsprechende Hidden Feld.

Frage: Wie kann ich jetzt die Funktion für das Setzen des Cookies des Hiddenfelds hier verschachteln bzw. einbinden/aufrufen, so dass es auch funkt.?

Danke und Gruß
Messmar


----------



## messmar (1. Mai 2008)

Sven Mintel hat gesagt.:


> Jo, so hätte ich mir das gedacht.



was ist mit dem hier, dieser Versuch gibt mir nicht das gewünschte Ergebnis:

```
<script>
window.onload=window.onunload=function(event)
{
 e=(window.event)?window.event:event;
 a=document.getElementsByTagName('input');
 k=document.getElementsByTagName('input');
 for(i=0;i<a.length;++i)
   {
     if(a[i].type=='checkbox' && a[i].name)
       {
         switch(e.type)
           {
             case 'load':
              a[i].checked=(get_cookie(a[i].name)==1)?true:false;
	      alert(a[i].name + "-->>>> " + a[i].checked + "Brandname -->>> " +  a[i].title);
			   
	       if(a[i].checked==true && a[i].title == 'Toyota'){
	            alert('Toyota Checkbox'); 
		    for(k=0;k<a.length;++k)
			   {
		            if(a[k].type=='text' && a[k].name)
			        {
			          a[k].value=(get_cookie(a[k].name)=='gidToyota')?a[i].title:'';
			          alert('HIDDEN LOAD:-->' + a[k].name + ':' + a[k].value);
					
			        }
			   }
			}
			break;
			   
	                   case 'unload':
	                   set_cookie(a[i].name,(a[i].checked)?1:0,1);
			   
			   if(a[i].checked==1 && a[i].title == 'Toyota'){
			   alert('-----------------> Toyota Checkbox'); 
			   for(k=0;k<a.length;++k)
			    {
			     if(a[k].type=='text' && a[k].name)
			        {
			          set_cookie(a[k].name,(a[k].value)?a[i].title:'',1);
				  alert('HIDDEN UNLOAD:-->' + a[k].name + ':' + a[k].value);
			                
			        }
			      }
			   }
			  //alert(a[i].checked);
               break;
           }
       }
   }
}
</script>
```

Gruß
Messmar


----------



## Sven Mintel (1. Mai 2008)

```
<script type="text/javascript">
<!--
c=[];
window.onload=window.onunload=function(event)
{
  
  e=(window.event)?window.event:event;
  a=document.getElementsByTagName('input');
  for(i=0;i<a.length;++i)
    {
      if(a[i].type=='checkbox' && a[i].name)
        {
          pattern=new RegExp('\\b'+a[i].name+'\\b','g');
          switch(e.type)
            { 
              case 'load':
              if(typeof c[a[i].title]=='undefined')
                      {
                        c[a[i].title]=[(get_cookie(a[i].title))?get_cookie(a[i].title):'',a[i].alt];             
                      }
               if(c[a[i].title][0]!='' )
                  {
                    a[i].checked=(c[a[i].title][0].match(pattern))?true:false;
                  }
                break;
              case 'unload':
                c[a[i].title][0]=(a[i].checked)
                                ?(
                                  (!c[a[i].title][0].match(pattern))
                                      ? c[a[i].title][0]+','+ a[i].name
                                      : c[a[i].title][0]
                                  )
                                 :c[a[i].title][0].replace(pattern,'');
                break;
            }
        }
    }
    
    for(var k in c)
      {
        switch(e.type)
          {
            case 'load':
                    h=document.createElement('input');
                    h.name='gid'+k;
                    h.type='text';
                    if(c[k][0].match(/\w/)){h.value=c[k][1]}
                    document.forms[0].appendChild(h);   
                    break; 
            case 'unload':
                    c[k][0]=c[k][0].replace(/,+/g,',');
                    set_cookie(k,c[k][0],1)
          }
      }
}
//-->
</script>
<form>
<input name="Avensis" title="Toyota" alt="22222222" value="Avensis" lang="18285 - 20135" type="checkbox">
<input name="Corolla" title="Toyota" alt="22222222" value="Corolla" lang="15290 - 18150" type="checkbox">
<input name="Focus CC" title="Ford" alt="66666666" value="Focus CC" lang="16810 - 20275" type="checkbox">
<input name="A3" title="Audi" alt="88888888" value="A3" lang="19215 - 21430" type="checkbox">
<input name="Scion" title="Toyota" alt="22222222" value="Avensis" lang="18285 - 20135" type="checkbox">
</form>
```

Den Rest musste jetzt aber selbst hinkriegen, ich bin erstmal ein wenig auf Herrentagstour


----------



## messmar (2. Mai 2008)

Hi Sven,

vielen Dank...das ist ja klasse ;-)

You're the man



Sven Mintel hat gesagt.:


> Den Rest musste jetzt aber selbst hinkriegen, ich bin erstmal ein wenig auf Herrentagstour



ja klar (werde ich versuchen zumindest), und viel Spaß bei deiner Tour.

Gruß
Messmar


----------

