Christian Heermann: DIVs / Layer in Schleife durchlaufen

Hallo zusammen,

ich habe ein kleine Problem, bei dem ich hoffe, daß Ihr mir helfen könnt, sonst würde ich ja hier auch nicht posten ;-)

---------------------------------------------------------------------
function closeall(){ //BEGINN FUNCTION CLOSEALL
if(document.layers){ // Netscape
 for(i=0; i<=document.layers.length; i++){
  _name=parent.document.layers[i].name;
  if(_name != 'title'){closelayer(_name);}
 }
}
if(document.all){ // Internet Explorer
 for(i=0; i<=document.all.length; i++){
  _name=document.getElementsByTagName("div")[i].id;
  if(_name != 'title'){closelayer(_name);}
 }
}
}//END FUNCTION CLOSEALL

---------------------------------------------------------------------

Mit dieser Funktion will ich alle Divs, die ich auf der Page definiert habe, wieder unsichtbar machen. Für den Netscape funktioniert das auch gut, da er die alle Divs nach der Reihe abarbeitet und sie auf "hide" setzt.
Der IE scheint mit dem Befehl "getElementsByTagName" Probleme zu haben, es sei kein Object und ein Fehler sei auf der Seite aufgetreten.
Nun möchte ich aber der Reihenfolge nach alle DIVS durchlaufen, das Attribute ändern, ohne jedes einzelne DIV anzusprechen, sondern das ganze schick über eine "for(.....)"-Schleife durchführen.
Welche Möglichkeit habe ich da???

Danke im Voraus

Christian

  1. Moin!

    Mit dieser Funktion will ich alle Divs, die ich auf der Page definiert habe, wieder unsichtbar machen. Für den Netscape funktioniert das auch gut, da er die alle Divs nach der Reihe abarbeitet und sie auf "hide" setzt.

    Richtig, Netscape 4 (!!!) setzt die Visibility-Attribute "hide" und "show" ein, alle anderen Browser dagegen "visible" und "hidden".

    Der IE scheint mit dem Befehl "getElementsByTagName" Probleme zu haben, es sei kein Object und ein Fehler sei auf der Seite aufgetreten.

    Wenn du im Skript auf "document.all" testest, dann aber mit dem DOM arbeitest, dann ist das, gelinde gesagt, Blödsinn. Entweder Zugriff via document.all, oder Test auf DOM-Kapazität (was alle Browser außer Netscape 4 und IE 4 können). Ich tendiere zu letzerem. :)

    Nun möchte ich aber der Reihenfolge nach alle DIVS durchlaufen, das Attribute ändern, ohne jedes einzelne DIV anzusprechen, sondern das ganze schick über eine "for(.....)"-Schleife durchführen.
    Welche Möglichkeit habe ich da???

    Dir kann natürlich passieren, daß der IE noch ein wenig doof ist und getElementsByTagName nicht kennt. Wozu ist eigentlich getElementsByName da? Ist zumindest verbreiteter und würde vielleicht besser funktionieren. Außerdem kannst du dann noch andere Layer benutzen, die durch deine Funktion nicht versteckt werden.

    Die ganz simple Lösung: Jeder Layer kriegt eine ID, und die IDs kommen in ein Array, und das Array wird durchlaufen und jede gespeicherte ID versteckt.

    Nicht unbedingt kreativ, die Lösung, aber effektiv. :)

    - Sven Rautenberg

    1. Hallo,

      Richtig, Netscape 4 (!!!) setzt die Visibility-Attribute "hide" und "show" ein, alle anderen Browser dagegen "visible" und "hidden".

      Auch Netscape 4.x kommt problemlos mit visible und hidden klar (siehe meinen Tipp 27).

      Dir kann natürlich passieren, daß der IE noch ein wenig doof ist und getElementsByTagName nicht kennt.

      Warum postest Du solche Sprueche ohne den Wahrheitsgehalt selbst zu pruefen?
      Der IE war AFAIK der erste Browser (ab IE5 seit 1999), der die DOM-Methode getElementsByTagName() unterstuetzte.

      Wozu ist eigentlich getElementsByName da? Ist zumindest verbreiteter und würde vielleicht besser funktionieren.

      Ist auch nicht verbreiteter als andere Methoden. Siehe http://www.styleassistant.de/tips/tip45.htm und die beiden Beispiele.

      MfG, Thomas

  2. ich habe ein kleine Problem, bei dem ich hoffe, daß Ihr mir helfen könnt, sonst würde ich ja hier auch nicht posten ;-)

    if(document.all){ // Internet Explorer
    for(i=0; i<=document.all.length; i++){
      _name=document.getElementsByTagName("div")[i].id;
      if(_name != 'title'){closelayer(_name);}
    }
    }
    }//END FUNCTION CLOSEALL

    Hallo Christian,
    ich habe mit mal in einem leeren Dokument (ohne DIVs)
    alert(document.all.length) ausgeben lassen.
    Ergebnis war 6. D. h. es werden nicht nur DIVs, sondern
    sämtlicher Krimskrams gezählt. Deshalb musst Du
    das anders machen, z.B. so:

    if(document.all){ // Internet Explorer
      i=0;
      while (document.getElementsByTagName("div")[i]){
       _name=document.getElementsByTagName("div")[i].id;
       if(_name != 'title'){closelayer(_name);}
       i++;
      }
     }
    }

    Gruß Lutz

  3. Hallo,

    if(document.all){ // Internet Explorer
    for(i=0; i<=document.all.length; i++){
      _name=document.getElementsByTagName("div")[i].id;
      if(_name != 'title'){closelayer(_name);}
    }
    }
    }//END FUNCTION CLOSEALL

    Frage if(document.getElementsByTagName) {...} ab und Du schließt auch andere DOM-faehige Browser ein.

    Die Schleife darf natuerlich nur bis i<document.all.length durchlaufen werden, weil das Array mit den DIVs nur von 0 bis n-1 reicht.

    Es ist auch nicht sinnvoll, alle Elemente des Dokuments zu durchlaufen, sondern nur die DIVs:

    var obj, l;
    obj=document.getElementsByTagName("div");
    l=obj.length;
    for(i=0;i<l;i++)
    {
      _name=obj[i].id;
      if(_name != 'title'){closelayer(_name);}
    }
    usw.

    MfG, Thomas

    1. Nachtrag:

      Die Schleife darf natuerlich nur bis i<document.all.length durchlaufen werden, weil das Array mit den DIVs nur von 0 bis n-1 reicht.

      Sollte lauten:
      ... weil die document.all-Collection (das Array aller Seitenelemente) nur von 0 bis n-1 reicht - das gilt sinngemaeß auch fuer alle DIVs.

      MfG, Thomas

  4. Danke Jungs, habt mir geholfen!!

    Bis denne

    Christian