Peter: Mit JS checkbox-array durchlaufen

Hallo,

irgendwie komme ich nicht weiter und bitte daher um ein wenig Hilfe:

Ich erzeuge mit PHP ein Formular, dieses kann eine variable Anzahl von Checkboxen enthalten.
Um es nicht unnötig aufzublähen, definiere ich die Checkboxen als Array:

  
<input type="checkbox" name="kat[]" value="2" onclick="chkdata()" />  
<input type="checkbox" name="kat[]" value="7" onclick="chkdata()" />  
<input type="checkbox" name="kat[]" value="13" onclick="chkdata()" />  
usw...  

Die Auswertung nach dem Absenden erfolgt durch PHP und ist fehlerfrei.

Da ich aber vor dem Absenden per JS überprüfen möchte, ob mindestens eine Checkbox aktiviert worden ist, möchte ich dieses per Schleife durchführen lassen (siehe Aufruf onclick):

  
function chkdata() {  
	var arrCB = document.newUs.elements['kat[]'];  
	ausgewaehlt="0";  
	for (i = 0; i < arrCB.length; i++) {  
		if(arrCB[i].checked == true) { ausgewaehlt="1"; }  
	}  
}  

Leider ist aber der Status "ausgewaehlt" immer 0...
(und hier liegt mein Problem)

Ich gehe also einmal davon aus, das meine if-Bedingung fehlerhaft ist, nur kann ich nicht nachvollziehen, warum...

Gruss
Peter

  1. Mahlzeit,

    Ich erzeuge mit PHP ein Formular, dieses kann eine variable Anzahl von Checkboxen enthalten.
    Um es nicht unnötig aufzublähen, definiere ich die Checkboxen als Array:

    <input type="checkbox" name="kat[]" value="2" onclick="chkdata()" />

    <input type="checkbox" name="kat[]" value="7" onclick="chkdata()" />
    <input type="checkbox" name="kat[]" value="13" onclick="chkdata()" />
    usw...

    
    > Die Auswertung nach dem Absenden erfolgt durch PHP und ist fehlerfrei.  
      
    das ist ja schon mal viel wert.  
      
    
    > Da ich aber vor dem Absenden per JS überprüfen möchte, ob mindestens eine Checkbox aktiviert worden ist, möchte ich dieses per Schleife durchführen lassen (siehe Aufruf onclick):  
      
    Sinnvoller wäre es IMO, diese Prüfung erst beim Absenden durchzuführen (onsubmit im form-Element). Dann könnte man dort im Fehlerfall das Absenden verhindern und den Nutzer auf die fehlerhafte bzw. fehlende Eingabe hinweisen.  
      
    
    > ~~~javascript
    
    function chkdata() {  
    
    > 	var arrCB = document.newUs.elements['kat[]'];
    
    

    Erster Check hier: Zeigt arrCB jetzt wirklich auf das Array mit den Checkbox-Elementobjekten? Wurde das Formular anhand seines Namens newUs gefunden? Bedenke dabei auch, dass Javascript streng zwischen Groß- und Kleinschreibung unterscheidet.

    ausgewaehlt="0";  
    

    for (i = 0; i < arrCB.length; i++) {
    if(arrCB[i].checked == true) { ausgewaehlt="1"; }
    }
    }

      
    Das ist zwar sehr umständlich formuliert, und für eine Statusvariable einen String zu verwenden, wo ein boolscher Wert das Naheliegende wäre, ist nicht wirklich elegant. Aber vorausgesetzt, arrCB ist richtig initialisiert, sollte das trotzdem zum Erfolg führen. Etwas schöner IMO:  
      
    ~~~javascript
    ausgewaehlt = false;  
    for (i=0; i<arrCB.length; i++)  
       ausgewaehlt |= arrCB[i].checked;
    

    Wenn man möchte, kann man es noch ein wenig kompakter und eleganter schreiben:

    ausgewaehlt = false;  
    for (i=0; i<arrCB.length; ausgewaehlt |= arrCB[i++].checked);
    

    Leider ist aber der Status "ausgewaehlt" immer 0...
    (und hier liegt mein Problem)
    Ich gehe also einmal davon aus, das meine if-Bedingung fehlerhaft ist

    Ich gehe eher davon aus, dass die Initialisierung von arrCB fehlerhaft ist, deswegen wäre das mein erster Prüfpunkt.

    So long,
     Martin

    --
    Lache, und die Welt wird mit dir lachen.
    Schnarche, und du schläfst allein.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hallo Peter,

    und wenn du die in der Schleife ein break einfügst?

    function chkdata() {  
        var arrCB = document.newUs.elements['kat[]'],  
        ausgewaehlt = '0';  
        for (var i = 0; i < arrCB.length; i++) {  
            if(arrCB[i].checked === true) {  
                ausgewaehlt = '1';  
                break;  
            }  
        }  
    }
    

    Gruß Kai

    1. schöner wäre allerdings diese Schreibweise …

      function chkdata() {  
          var arrCB = document.newUs.elements['kat[]'],  
          ausgewaehlt = false;  
          for (var i = 0; i < arrCB.length; i++) {  
              if(arrCB[i].checked === true) {  
                  ausgewaehlt = true;  
                  break;  
              }  
          }  
      }
      
      1. Hallo,

        schöner wäre allerdings diese Schreibweise …

        if(arrCB[i].checked === true)

        nein, nicht wirklich.
        "Wenn es wahr ist, dass ...checked exakt den boolschen Wert wahr hat, ..."

        Einen Wert, von dem man schon genau weiß, dass es ein Boolean ist und somit nur true oder false sein kann, vergleicht man nicht nochmal explizit mit der Boolean-Konstanten true - schon gar nicht typsicher. Ein einfaches

        if (...checked)

        genügt völlig und ist intuitiver lesbar. Davon abgesehen: Das Abbrechen der Schleife mit break, sobald ein Treffer gefunden wurde, ist zwar legitim und korrekt, aber der Performancegewinn sicher nicht messbar, solange wir nicht von Tausenden von Checkboxen ausgehen.

        Ciao,
         Martin

        --
        Die letzten Worte des Polizisten:
        Ich hab mitgezählt, Leute: Sechs Schuss, jetzt hat er keine Munition mehr!
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Das Abbrechen der Schleife mit break, sobald ein Treffer gefunden wurde, ist zwar legitim und korrekt, aber der Performancegewinn sicher nicht messbar, solange wir nicht von Tausenden von Checkboxen ausgehen.

          Das frühe Abbrechen der Schleife ist die korrekte, angemessene Logik. So ist eindeutig für den Interpreter und Menschen, was für eine Operation hier passiert (nämlich any/some auf einer Liste).

          Wenn sich die korrekte Logik ohne weiteres implementieren lässt, sollte man das selbstverständlich tun. Dass es der Performance aktuell nicht messbar schadet, wenn man dies nicht tut, ist kein Argument dagegen.

          Mathias