tropenberta: document.getelementbyid gibt null zurück

schönen guten morgen leuts

hab mal wieder ein kleines problem das ich nicht verstehe.

  
<script type="text/javascript">  
var test = window.location.pathname;  
var filename = test.substring(test.lastIndexOf('/')+1);  
if ( filename == "index.php")  
{ document.getElementById('navi1').style.color = 'red';  }  
  
if ( filename == "praxis.php")  
{ document.getElementById('navi2').style.color = 'red'; }  
  
</script>  

wie ihr sicher sehen könnt will ich je nach aufgerufener seite die schriftfarbe verändern.
jetzt bekomme ich aber einen fehler in der konsole :

TypeError: document.getElementById(...) is null

ich versteh nicht wieso. hab sonst auch immer in anderen scripten mit getElementbyId styles in der css verändert. da hatte ich nie das problem.
pls hlp.

gruss tropenberta

  1. Tach!

    TypeError: document.getElementById(...) is null
    ich versteh nicht wieso.

    Ich kann nur raten, weil in deinem gezeigten Code keines der angesprochenen Elemente vorkommt. Vermutlich kennt der Browser zu der Zeit, in der er den Javascript-Code ausführt, die Elemente noch nicht, weil das sie enthaltende HTML erst später kommt. Ein typischer Fall dafür wäre, wenn das Script im head steht. Dann wird es ausgeführt, noch bevor der Rest der Seite bekannt ist. Der Code kann zwar dort oben stehen bleiben, er darf aber erst ausgeführt werden, wenn das DOM ready ist. Für den Hausgebrauch reicht aber auch, das load-Event von body anzuzapfen.

    dedlfix.

    1. hi dedlfix

      vielen dank für deine schnelle antwort.

      deine vermutung ist richtig. hab das script im head stehen und die betroffenen divs kommen erst später. hab das js jetzt mal nach den divs eingefügt und jetzt bekomme ich auch keinen fehler mehr.

      die style color ändert sich aber nicht.

      auschnitt aus meiner navi :

        
      <div id="navi">  
      <div id="navi1" class="navi_pos" style="color:#7F7F7F;"><a href="index.php">Start</a></div>  
      <div id="navi2" class="navi_pos" style="color:#7F7F7F;"><a href="praxis.php">Praxis</a></div>  
      </div>  
      
      

      nochmal mein js :

        
      <script type="text/javascript">  
      var test = window.location.pathname;  
      var filename = test.substring(test.lastIndexOf('/')+1);  
      if ( filename == "index.php")  
      { document.getElementById('navi1').style.color = '#E0077A';  }  
        
      if ( filename == "praxis.php")  
      { document.getElementById('navi2').style.color = '#E0077A'; }  
      </script>  
      
      

      müsste doch eigentlich funzen. pls hlp

      gruss tropenberta

      1. Hallo,

        <div id="navi1" class="navi_pos" style="color:#7F7F7F;"><a href="index.php">Start</a></div>

        <div id="navi2" class="navi_pos" style="color:#7F7F7F;"><a href="praxis.php">Praxis</a></div>

        
        >   
        > ~~~javascript
        
        <script type="text/javascript">  
        
        > var test = window.location.pathname;  
        > var filename = test.substring(test.lastIndexOf('/')+1);  
        > if ( filename == "index.php")  
        > { document.getElementById('navi1').style.color = '#E0077A';  }  
        >   
        > if ( filename == "praxis.php")  
        > { document.getElementById('navi2').style.color = '#E0077A'; }  
        > </script>
        
        

        dein Script setzt die Schriftfarbe für einen der div-Container, aber du vergisst wahrscheinlich, dass der Link darin seine eigene Schriftfarbe definiert. Und nicht nur eine, sondern sogar für jede der Pseudoklassen :link, :hover usw. eine eigene.

        Ciao,
         Martin

        --
        Ein Snob ist ein Mensch, der sich auf ein Stachelschwein setzt, ohne eine Miene zu verziehen - nur weil ihm jemand gesagt hat, das sei ein Designersessel.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hi Martin

          au mann - ich trottel - klar.
          jetzt komm ich der sache schon näher.
          vielen lieben dank.

          gruss micha

          1. Om nah hoo pez nyeetz, tropenberta!

            gruss micha

            ???

            Man sollte vermeiden, inlinestyles mit Javascript zu setzen. Darstellungsinformationen gehören ins CSS. Ändere die Klassenzugehörigkeit entsprechender Elemente.

            Benutze ein Entwicklertool meist über [F12] erreichbar. Dort kannst du sehen, welche Eigenschaften und Werte bei dem entsprechenden Element zur ANwendung kommen, und auch die Eigenschaften zurückverfolgen.

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Mist und Mistral.

            1. hi Matthias

              vielen dank für deine tips. werde in zukunft mehr mit dem entwicklertool arbeiten.
              auch der weg mit klassen find ich gut und werde mich heute mittag mal drüber machen und mein script umschreiben.

              gruss tropenberta

              1. hi leuts

                versuch gerade die class von einem div container mit js zu verändern.

                  
                ...  
                <div class="navi_pos" id="navi1"><center><a href="index.html">Startseite</a></center></div>  
                ...  
                
                
                  
                function change_color()  
                {  
                var x = window.location.pathname;  
                var dateiname = x.substring(x.lastIndexOf('/')+1);  
                  
                if (dateiname == "index.html")  
                  { document.getElementById("navi1").className = "navi_pos2"; }  
                }  
                
                

                wenn ich das so mache ändert sich aber die class nicht.
                es funktioniert eigentlich alles bis auf die zeile mit className.

                gruss tropenberta

                1. Om nah hoo pez nyeetz, tropenberta!

                  ...
                  <div class="navi_pos" id="navi1"><center><a href="index.html">Startseite</a></center></div>
                  ...

                  
                  >   
                  > ~~~javascript
                    
                  
                  > function change_color()  
                  > {  
                  > var x = window.location.pathname;  
                  > var dateiname = x.substring(x.lastIndexOf('/')+1);  
                  >   
                  > if (dateiname == "index.html")  
                  >   { document.getElementById("navi1").className = "navi_pos2"; }  
                  > }  
                  > 
                  
                  

                  wenn ich das so mache ändert sich aber die class nicht.
                  es funktioniert eigentlich alles bis auf die zeile mit className.

                  Prüfe,ob die Bedingung wahr ist, etwa durch alert()

                  Matthias

                  --
                  Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Sandal und Sandalette.

                  1. hi Matthias

                    wenn ich das so mache :

                      
                    function change_color()  
                    {  
                    var x = window.location.pathname;  
                    var dateiname = x.substring(x.lastIndexOf('/')+1);  
                      
                    if (dateiname == "index.html")  
                      {  document.getElementById("navi1").className = "navi_pos2";  
                         alert(document.getElementById("navi1").className);  }  
                    
                    

                    dann bekomm im alert fenster navi_pos2 ausgegeben, also korrekt.
                    wenn ich dann den seitenquellcode bei mozilla aufrufe, ist die class immer noch
                    navi_pos.

                    gruss tropenberta

                    1. Hi,

                      dann bekomm im alert fenster navi_pos2 ausgegeben, also korrekt.
                      wenn ich dann den seitenquellcode bei mozilla aufrufe, ist die class immer noch
                      navi_pos.

                      Bei der Seitenquellcode-Anzeige wird das angezeigt, was der Browser vom Server bekommen hat.

                      Um die Änderungen zu sehen: selektiere den entsprechenden Teil der Seite und wähle aus dem Context-Menu "view selection source" (weiß nicht, wie das auf deutsch heißt, evtl. sowas wie "Quelltext der Auswahl")

                      Oder guck mit Firebug in den DOM-Baum ...

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      O o ostern ...
                      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                      1. hi Andreas

                        yo - element untersuchen heist das bei mir in mozilla.
                        hier wird die class korrekt angezeigt.

                        hab gerade gemerkt das ich nen anderen weg gehen muss.
                        in meiner css hab ich folgendes stehen :

                          
                        .navi_pos  a:link { color:#9F9F9F; text-decoration:none; }  
                        
                        

                        ich möchte jetzt die color ansteuern und verändern.
                        hab aber kp wie ich dort hinkomm.
                        habs mal so probiert - klappt aber nicht :

                          
                        document.getElementById("navi1").link.style.color = "red";  
                        
                        

                        hier noch mal das html :

                          
                        <div class="navi_pos" id="navi1"><center><a href="index.html">Milvi-Reiki</a></center></div>  
                        
                        
                        1. Hallo,

                          yo - element untersuchen heist das bei mir in mozilla.
                          hier wird die class korrekt angezeigt.

                          hab gerade gemerkt das ich nen anderen weg gehen muss.

                          warum das? Soweit ich das bisher verstanden habe, warst du bis eben genau auf dem richtigen Weg.

                          in meiner css hab ich folgendes stehen :
                          .navi_pos a:link { color:#9F9F9F; text-decoration:none; }

                          Genau, das ist die Regel, die auf den ursprünglichen Klassennamen passt.

                          ich möchte jetzt die color ansteuern und verändern.

                          Ja, hab ich verstanden. Und wie MudGuard und Matthias schon ausgeführt haben, ist es schlechter Stil, direkt die CSS-Werte zu ändern; stattdessen gilt es als "best practice", eine Klasse zu ändern (oder hinzuzufügen, oder wegzunehmen), und mit CSS auf diese Veränderung zu reagieren.

                          hab aber kp wie ich dort hinkomm.

                          Indem du eine zweite CSS-Regel notierst, die auf den geänderten Klassennamen passt. Darin kannst du dann nach Belieben Werte ändern. Das hat auch den Vorteil, dass du bei einer eventuellen späteren Änderung des Designs nicht im Javascript-Code suchen musst, wo überall styles gesetzt werden. Stattdessen brauchst du nur im Stylesheet zu "fummeln".

                          Ciao,
                           Martin

                          --
                          Ein Snob ist ein Mensch, der sich auf ein Stachelschwein setzt, ohne eine Miene zu verziehen - nur weil ihm jemand gesagt hat, das sei ein Designersessel.
                          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                          1. warum ich drauf gekommen bin das ich anders machen muss :

                            ich habe in meiner css folgendes angelegt:

                            .navi_pos2 a:link { color:red; text-decoration:none; }

                            nach meiner logik ist es ja so wenn ich die class auf navi_pos2 verändere
                            spricht er ja nicht mehr diese zeile an :

                            .navi_pos a:link { color:#9F9F9F; text-decoration:none; }

                            sondern diese

                            .navi_pos2 a:link { color:red; text-decoration:none; }

                            sprich wenn meine if abfrage true ergibt soll er die klasse ändern.
                            macht er ja auch wie ich bei element untersuchen gesehen habe.
                            komischerweise ändert er aber die farbe nicht und nimmt immer noch die color von .navi_pos.

                            mein gedanke war das wenn ich im seitenquelltext es nicht korrekt sehe und bei element untersuchen schon, das sich hier was beist. selbst wenn das, was bei element untersuchen  steht stimmt, funktioniert es aber leider nicht.

                            bin gerade auf arbeit und switche ständig zwischen scripten hin und her, kann sein das ich noch irgendwas übersehen habe. werde heute nachmittag nochmal mit voller konzentration ran gehen und euch auf dem laufenden halten.

                            gruss tropenberta

                            1. Om nah hoo pez nyeetz, tropenberta!

                              werde heute nachmittag nochmal mit voller konzentration ran gehen und euch auf dem laufenden halten.

                              und uns dann auch einen Link auf die Seite geben, dann lässt sich dir wesentlich effizienter helfen.

                              Matthias

                              --
                              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Öl und Öland.

                              1. @andreas

                                shit - muss leider sagen ich hab deine antwort vom 27. jetzt gerade gelesen. sry. muss ich irgendwie übersehen haben.
                                der grund warum ich mit js arbeite ist, das ich echt wenig ahnung von php habe, noch viel weniger als wie mit js und wenn ein problem da ist überleg ich mir lösungen mit js.
                                musst dir vorstellen hab noch nie gescriptet, erst seit ca. 2 monaten. bin jetzt im ersten lehrjahr und mein chef hat schon angekündigt das ich im 2.lehrjahr auf nen php lehrgang gehen soll.
                                also momentan hab ich nur nen kleinen satz an befehlen die ich kenne, werden fast täglich mehr, aber ich weiß noch nicht einmal was du mit "Nachfahrenselector" meinst.
                                werd ich jetzt erstmal googeln um zu checken was du da am 27. geschrieben hast.
                                habs nochmal durch gelesen, ich versteh wirklich nicht was du meinst sry.
                                was ich verstehe ist ich soll :

                                <body class="milvi-reikiindex"> und das irgendwie in php setzen.

                                @matthias

                                http://webedition.p166753.webspaceconfig.de/milvi-reiki/

                                um mein problem nochmal genauer zu beschreiben.
                                hab ne seite gebastelt und soll die jetzt auf webedition umsetzen. da ich für alle seiten eine navigation template habe, funktioniert es wie ich es vorher in html gemacht habe nicht mehr.
                                in html hab ich einfach je nach seite nen style="color:red" ins jeweilige <a href> gesetzt.
                                also hab ich mir das mit dem js überlegt.

                                schauts euch an.

                                gruss tropenberta

                                1. mahlzeit leuts

                                  yo funktioniert jetzt alles wie ich möchte.

                                  hatte nur
                                  .navi_pos2  a:link { color:#E0077A; text-decoration:none; }
                                  in der css definiert und hab deswegen keine andere farbe gesehen, weil ich ja
                                  die seite bereits besucht hatte.
                                  hab jetzt die restlichen farben definiert und es funzt.
                                  vielen dank an euch alle - habt mich wiedermal weiter gebracht.

                                  gruss tropenberta

                            2. Hi,

                              mein gedanke war das wenn ich im seitenquelltext es nicht korrekt sehe und bei element untersuchen schon, das sich hier was beist.

                              Warum das so ist, habe ich doch bereits geschrieben. Liest Du gar nicht, was wir Dir schreiben?

                              Und wie ich schon am 27. um 20:07 schrieb: ich halte es nicht für sinnvoll, hier überhaupt mit Javascript rumzufummeln.

                              cu,
                              Andreas

                              --
                              Warum nennt sich Andreas hier MudGuard?
                              O o ostern ...
                              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  2. Hi,

    [code lang=javascript]
    <script type="text/javascript">
    var test = window.location.pathname;
    var filename = test.substring(test.lastIndexOf('/')+1);
    if ( filename == "index.php")
    { document.getElementById('navi1').style.color = 'red';  }

    Statt per Javascript eine einzelne Eigenschaft zu setzen, setze im PHP im body-Element eine Klasse (z.B. den Filenamen, ggf. incl. Pfad - ohne das php und ohne die '/').

    Und dann nutze im CSS den Nachfahrenselector:

    .index a:link { color:red; }
    .praxis a:link { color:fuchsia; }

    usw.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.