Array - zählt IE falsch?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array - zählt IE falsch?

    Hi,
    bastel mir gerade eine Ausklapp Funktion für ein News Archive.
    Damit bei abgeschalteten Javascript trotzdem alles angezeigt wird, wird das Menu beim Laden der Seite eingeklappt:
    PHP-Code:
    function initNewsArchive(){
     try{
        
    target document.getElementById('right_column_newsarchive_box').firstChild.childNodes;
             for(
    i=0itarget.length 1i++){
                    
    target[i].firstChild.nextSibling.style.display "none";
             }
    }catch(
    e){alert(e);}   

    Das klappt auch erstmal, aber!
    Wenn ich in der for Bedingung nur:
    target.length
    schreibe werfen mir FF und Opera einen Out Of Index Fehler aus, deshalb das
    target.length - 1

    So wird aber im IE das letzte Element nicht auf display=none; gesetzt.
    Lasse ich die - 1 weg gehts im IE, aber die anderen Browser moseren.

    Mein jetziger Notbehelf wäre:
    }catch(e){ /* es gibt einen Fehler */}

    aber das ist ja nicht unbedingt sauber.
    Weiß einer eine bessere Lösung bzw. was mache ich falsch?
    Zuletzt geändert von mcmurphy; 24.11.2006, 16:43.
    "I don't want to belong to any club that would accept me as a member."

    Groucho Marx

  • #2
    Re: Array - zählt IE falsch?

    Was für Knoten(-Typen) enthält target denn überhaupt ...?

    ("Beachten sie" bzgl. childNodes in SELFHTML beachtet?)
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hier der Rest vom Code:
      PHP-Code:

      function toggleNewsArchive(obj){
              try{
                  
      parentLI obj.parentNode;
                  
      parentUL parentLI.parentNode;
                  for(
      i=0parentUL.childNodes.length 1i++){
                      
      parentUL.childNodes[i].firstChild.nextSibling.style.display "none";   
                  }
                  
      obj.nextSibling.style.display "block";
              }catch(
      e){alert(e);}     
      }
      </
      script>            
      <
      div  class="right_column_box  clearfix" id="right_column_newsarchive_box">
       <
      ul>
        <
      li><a href="#" onclick="toggleNewsArchive(this); return false;">2006</a>
          <
      ul>
            <
      li><a href="#" onfocus="if(this.blur)this.blur();">Januar</a></li>
            <
      li><a href="#" onfocus="if(this.blur)this.blur();">Februar</a></li>
      <!-- 
      etcKommentare stehen im Quellcode nicht drin-->
          </
      ul>
        </
      li>
         <
      li><a href="#"  onclick="toggleNewsArchive(this); return false;">2005</a>
              <
      ul>
                 <
      li><a href="#" onfocus="if(this.blur)this.blur();">Januar</a></li>
                 <
      li><a href="#" onfocus="if(this.blur)this.blur();">Februar</a></li>
      <!-- 
      etc -->
              </
      ul>
          </
      li>
           <
      li><a href="#"  onclick="toggleNewsArchive(this); return false;">2004</a>
               <
      ul>
                   <
      li><a href="#" onfocus="if(this.blur)this.blur();">Januar</a></li>
                   <
      li><a href="#" onfocus="if(this.blur)this.blur();">Februar</a></li>
                   <
      li><a href="#" onfocus="if(this.blur)this.blur();">März</a></li>
      <!-- 
      etc -->
               </
      ul>
            </
      li>                 
       </
      ul>
      <
      script type="text/javascript">initNewsArchive();</script>
      </
      div
      SelfHtml:
      "Der Netscape 6.1 und der Internet Explorer 5.0 Macintosh Edition interpretieren im body-Element und in allen untergeordneten Knoten bereits einen Zeilenumbruch oder ein Leerzeichen im Quelltext zwischen Elementknoten als einen eigenen Kindknoten mit dem Namen #text. Auch HTML-Kommentare bilden eigene Knoten und werden als Knoten mit dem Namen #comment behandelt."

      ist aber der Explorer 6.0...
      werde trotzdem mal alle Umbrüche zwischen den Tag's rausnehmen..

      P.S.: sind meine ersten Übungen in DOM ..
      Zuletzt geändert von mcmurphy; 23.11.2006, 20:10.
      "I don't want to belong to any club that would accept me as a member."

      Groucho Marx

      Kommentar


      • #4
        Warum nutzt du nicht einfach getElementsByTagName, wenn du alle Knoten mit einem bestimmten Knotennamen unterhalb eines Knotens haben willst?
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Warum nutzt du nicht einfach getElementsByTagName, wenn du alle Knoten mit einem bestimmten Knotennamen unterhalb eines Knotens haben willst?
          Wie wäre denn da die Syntax?
          Ich will ja auch nicht alle ul ausblenden.....

          Und auch wenn ich diese Lösung nehme:
          merkwürdig ist das unterschiedliche Zählverhalten immer noch...
          "I don't want to belong to any club that would accept me as a member."

          Groucho Marx

          Kommentar


          • #6
            Wenn ich in der for Bedingung nur:
            target.length
            schreibe werfen mir FF und Opera einen Out Of Index Fehler aus, deshalb das
            target.length - 1
            Dürfte dasselb sein wie in php in einer for-Schleife bis count(array). Arrays beginnen nun mal beim Element 0 und der count wird dir trotzdem eine 1 zurückgeben. Wenn du durch ein Array gehst dann musst du immer bis zu count(array) -1 gehen. Das ist durchaus normal.

            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              Wenn du durch ein Array gehst dann musst du immer bis zu count(array) -1 gehen. Das ist durchaus normal.
              Jau, das kenne ich aber der IE 6 anscheinend nicht ...
              "I don't want to belong to any club that would accept me as a member."

              Groucho Marx

              Kommentar


              • #8
                Jau, das kenne ich aber der IE 6 anscheinend nicht ...
                Kann mir beim besten Willen nicht vorstellen, dass beim IE Arrays beim Element 1 beginnen würden. Vlllt wirft der IE nur keinen Fehler

                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  Kann mir beim besten Willen nicht vorstellen, dass beim IE Arrays beim Element 1 beginnen würden.
                  Tut er auch nicht, aber er scheint length anders zu händeln als die anderen Browser.

                  mit array.length zählt er durch, mit array.length - 1 läßt er mir das letzte Element weg
                  Hiermit
                  PHP-Code:
                  for(i=0itarget.length 1i++){
                                  
                  target[i].firstChild.nextSibling.style.display "none";
                                  
                  alert(target[i].firstChild.nextSibling.nodeType);
                           } 
                  gibt er mir auch nur zweimal eine Alert Box mit einer 1 (=Elementknoten) aus, er verhaspelt sich also auch an keinem Leerzeichen / Kommentar etc. (3 / 8)

                  Hat einer von euch den Code mal ausprobiert?

                  P.S.:
                  Das hier:
                  PHP-Code:
                  var Zahlen = new Array(1248163264128256);
                      for(
                  i=0iZahlen.length i++){
                          
                  alert(Zahlen[i]);
                      } 
                  macht ja alle Browser gleich ....
                  Zuletzt geändert von mcmurphy; 24.11.2006, 11:06.
                  "I don't want to belong to any club that would accept me as a member."

                  Groucho Marx

                  Kommentar


                  • #10
                    Original geschrieben von mcmurphy
                    Jau, das kenne ich aber der IE 6 anscheinend nicht ...
                    Ich vermute immer noch, dass du nicht berücksichtigt hast, mit welcher Art von Kindelement du es jeweils zu tun hast. (Mein "Beachten Sie", auf das ich hinaus wollte, ist übrigens ein leicht anderes als dein zitiertes - mal 'ne aktuelle SELFHTML-Version ziehen?)
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Ich vermute immer noch, dass du nicht berücksichtigt hast, mit welcher Art von Kindelement du es jeweils zu tun hast
                      Das wollte ich ja hiermit:
                      PHP-Code:
                      for(i=0itarget.length 1i++){
                                      
                      target[i].firstChild.nextSibling.style.display "none";
                                      
                      alert(target[i].firstChild.nextSibling.nodeType);
                               } 
                      rausbekommen.

                      Aber Wahsaga hat wie (fast )immer recht (mein SelfHtml ist 8.0, aktuell ist 8.1.1):
                      habe im Code jetzt mal sämtliche Umbrüche rausgenommen, jetzt geht's ohne length - 1.
                      Da scheint der IE mal als einziger Standard konform zu arbeiten

                      Aber so kann der Code nicht bleiben, diese ellenlange Zeile kann ja keinMensch warten.

                      Suche mal die explizite Stelle und werde das Ergebniss hier posten.
                      "I don't want to belong to any club that would accept me as a member."

                      Groucho Marx

                      Kommentar


                      • #12
                        Also, wenn es interessiert:
                        Statt:
                        PHP-Code:
                              </ul>
                            </
                        li>
                          </
                        ul>
                         <
                        script type="text/javascript">initNewsArchive();</script>
                        </
                        div
                        PHP-Code:
                              </ul>
                            </
                        li></ul><!-- -->
                         <
                        script type="text/javascript">initNewsArchive();</script>
                        </
                        div
                        Frage an Wahsaga:
                        das hätten mir die Browser aber doch mit dem Code schnipsel aus meinem letzten Post anzeigen müssen (>> nodeType)
                        Gemäß dem DOM stellt bereits ein Zeilenumbruch oder ein Leerzeichen im Quelltext zwischen Elementknoten einen eigenen Text-Kindknoten dar.
                        Text-Kindknoten >> nodeType == 3
                        "I don't want to belong to any club that would accept me as a member."

                        Groucho Marx

                        Kommentar


                        • #13
                          Ich verstehe immer noch nicht, warum du's dir so kompliziert machst.

                          Wozu überhaupt jedes Mal alle in Frage kommenden Knoten durchlaufen?
                          Da merke ich mir doch lieber, welches Element ich zuletzt sichtbar gemacht habe - und wenn dann ein neues sichtbar gemacht werden soll, mache ich dabei das vorherige wieder unsichtbar.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Da merke ich mir doch lieber, welches Element ich zuletzt sichtbar gemacht habe
                            müßte ich dafür nicht id's vergeben?
                            Genau das wollte ich vermeiden....
                            Aber es klappt ja jetzt ...
                            Fand auch den Ansatz einfacher:
                            - Resete alles
                            - Mach das ausgewählte sichtbar

                            BTW: THX
                            "I don't want to belong to any club that would accept me as a member."

                            Groucho Marx

                            Kommentar


                            • #15
                              Original geschrieben von mcmurphy
                              müßte ich dafür nicht id's vergeben?
                              Nein - nur die Elementreferenzen merken. (Schrieb ich dir das nicht letztens schon mal - oder war's bei jemand anderem?)
                              Fand auch den Ansatz einfacher:
                              - Resete alles
                              - Mach das ausgewählte sichtbar
                              Finde ich nicht merkbar einfacher - abgesehen davon, dass es natürlich weniger perfomant ist (auch wenn sich das hier kaum bemerkbar machen dürfte).
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X