Georg K.: FOR EACH Problem in IE Browsern

Hallo, habe folgendes Problem:
Es geht darum anhand einer Checkbox die anderen Checkboxen zu checken bzw. unchecken. Dazu habe ich eine codesparende Variante und eine sehr lange.
In FF funktionieren beide, im IE nur die lange. Warum?

Hier der Code der kurzen, die NICHT funktioniert im IE:

  
function toggle_modules(source) {  
  checkboxes = document.getElementsByName('module[]');  
  for each(var checkbox in checkboxes)  
    checkbox.checked = source.checked;}  

Und hier die lange, funktionierende Variante:

  
function checkAllModules(cbx){  
if (cbx.checked===true)  
{  
	document.getElementById('AB').checked=true;  
	document.getElementById('CD').checked=true;  
	document.getElementById('EF').checked=true;  
	document.getElementById('GH').checked=true;  
  
     }  
     else  
     {  
	document.getElementById('AB').checked=false;  
	document.getElementById('CD').checked=false;  
	document.getElementById('EF').checked=false;  
	document.getElementById('GH').checked=false;  
     }  
}  

Danke im Voraus!

  1. In FF funktionieren beide, im IE nur die lange. Warum?

    Weil der IE kein for each kann.

    Struppi.

    1. Weil der IE kein for each kann.

      Nicht im Ernst oder? Was ist das denn mal wieder für eine schwache Leistung.
      Gibt es was ähnliches, was er dann auch kann?
      Mir geht es darum möglichst wenig code zu haben.

      1. Hi,

        Gibt es was ähnliches, was er dann auch kann?

        ja. for ( i in myarray ) langt völlig.

        Mir geht es darum möglichst wenig code zu haben.

        Siehste, hast Du ein each gespart.

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
  2. EDIT:

    JSLint sagt dass eine "(" fehlt nach "for" bzw. vor "each".

    Meiner Meinung nach ist aber "for each" korrekt, sonst würde es ja im FF nicht funktionieren.

    1. Hi,

      JSLint sagt dass eine "(" fehlt nach "for" bzw. vor "each".

      Meiner Meinung nach ist aber "for each" korrekt, sonst würde es ja im FF nicht funktionieren.

      for each haben m.W. einige Browserhersteller auf eigene Faust eingeführt.

      Für Arrays kann es recht einfach über prototypische Erweiterung des Objektes auch im IE ergänzt werden. Aber die getElementsBy-Methoden liefern bekanntlich keine Arrays - und ob man deren Typen auch derart erweitern kann, weiss ich aktuell nicht, müsste man ausprobieren.

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  3. Hi,

    Es geht darum anhand einer Checkbox die anderen Checkboxen zu checken bzw. unchecken. Dazu habe ich eine codesparende Variante und eine sehr lange.

    Die „lange” Version hast du aber auch unnötig lang gemacht.

    Und hier die lange, funktionierende Variante:

    function checkAllModules(cbx){
    if (cbx.checked===true)
    {
    document.getElementById('AB').checked=true;
    document.getElementById('CD').checked=true;
    document.getElementById('EF').checked=true;
    document.getElementById('GH').checked=true;

    }
         else
         {
    document.getElementById('AB').checked=false;
    document.getElementById('CD').checked=false;
    document.getElementById('EF').checked=false;
    document.getElementById('GH').checked=false;
         }
    }

      
    Warum hier Zugriff über die IDs der Checkboxen, und warum für true und false zwei einzelne Anweisungsblöcke?  
      
    Was spricht analog zu  
    
    > ~~~javascript
    
      checkboxes = document.getElementsByName('module[]');  
    
    >   for each(var checkbox in checkboxes)  
    >     checkbox.checked = source.checked;}  
    > 
    
    

    dagegen, es mit einer simplen for-Schleife zu machen, die über die Items der NodeList, die getElementsByName liefert, iteriert?

    Das wären nur mal zwei Möglichkeiten, es simpel für alle Browser kompatibel umzusetzen:

    for(var i=0, checkBoxes=document.getElementsByName("module[]"), l=checkBoxes.length; i<l; i++) {  
      checkBoxes[i].checked = source.checked;  
    }  
    // oder  
    for(var i=0,checkBox; checkBox=document.forms[...].elements["module[]"][i++]; checkBox.checked = source.checked);
    

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]