KD-one: Seltsamer Js-Fehler auf meiner Seite...

Hallo an alle,

Wenn der Link "Gästebuch gewählt wird, tritt im IE 6, im Opera 7.2 und Mozilla 1.5 folgende Fehlermeldung auf:

IE:

Zeile 64:
Fehler:'document.all[...].style ist null oder kein Objekt'
Der MS-Debugger markiert eine Zeile in der das Script hide_it()[onMouseOut] auf dieser Seite zum 4.male!!! (bei divMenu2) aufgerufen wird. ein für mich unverständlicher Vorgang.
Syntaktisch ist alles in Ordnung, ich habe das Script x-mal kontrolliert, sowie auch den Aufruf.

Opera:

Event thread: onmouseover
Error:
name: TypeError
message: Statement on line 62: Expression evaluated to null or undefined and is not convertible to Object: document.getElementById(id)
Backtrace:
  Line 62 of linked script http://faq.united-web.at/_test/scripte/faq.js
    document.getElementById(id).style.visibility = "hidden";
  In unknown script
    hide_it("divMenu1");
  Line 74 of linked script http://faq.united-web.at/_test/scripte/faq.js
    eval("hide_it('divMenu" + cnt[i] + "');");
  In unknown script
    clean(1, 2, 3, 5);
  At unknown location
    {event handler trampoline}

Mozilla 1.5

Fehler: document.getElementById(id) has no properties
Quelldatei: http://faq.united-web.at/_test/scripte/faq.js
Zeile: 62

Die betroffenen Funktionen:

function hide_it(id)
  {
    if(window.opera || (document.getElementById && !document.all))
      document.getElementById(id).style.visibility = 'hidden';
    else if(document.all)
      document.all[id].style.visibility = 'hidden';
    else if(document.layers)
      document.layers[id].visibility = 'hide';
  }

function clean()
  {
    var i,cnt=clean.arguments;
    for(i=0;i<cnt.length;i++)
      {
        eval("hide_it('divMenu"+cnt[i]+"');");
      }
  }

Ich vermute mal, daß irgendwas zum Zeitpunkt des Einlesens der Layer noch nicht geladen ist, der Fehler tritt_nur_bei diesem_einen_Link auf.
Kann man den Fehler irgendwie verhindern oder aber, wenn nicht, abfangen, sodaß keine Fehlermeldung erscheint?
Nach Laden der Seite funktioniert ja alles wie gewünscht und es gibt auch keine Fehlermeldungen mehr.
Firebird 0.7 hat übrigens keine Probleme mit dem Link.

Gruß

Kurt

--
"Es geht nicht darum, ob es Gott gibt; es geht darum, an Gott zu glauben. Nicht Gottes wegen, sondern des Glaubens wegen."  (Moriartes, gr. Philosoph, 314-244 v. Chr.)
http://elektro-dunzinger.at
http://shop.elektro-dunzinger.at
  1. Hallo an alle,

    Wenn der Link "Gästebuch gewählt wird, tritt im IE 6, im Opera 7.2 und Mozilla 1.5 folgende Fehlermeldung auf:

    IE:

    Zeile 64:
    Fehler:'document.all[...].style ist null oder kein Objekt'
    Der MS-Debugger markiert eine Zeile in der das Script hide_it()[onMouseOut] auf dieser Seite zum 4.male!!! (bei divMenu2) aufgerufen wird. ein für mich unverständlicher Vorgang.
    Syntaktisch ist alles in Ordnung, ich habe das Script x-mal kontrolliert, sowie auch den Aufruf.

    Sorry, der MS-Debugger markiert den 12. Aufruf der Funktione change() bei onmouseOut in divMenu2

    die Funktion:

    function change(id,klasse)
      {
        if(window.opera || (document.getElementById && !document.all))
          document.getElementById(id).className = klasse;
        else if(document.all)
          document.all[id].className = klasse;
        else if(document.layers)
          document.layers[id].className = klasse;
      }

    Wie gesagt, die Fehlermeldung weist auf die Funktion hide_it(es wird der Aufruf von document.all[...].style bemängelt), der Debugger markiert aber den Aufruf von change(). ???
    Gruß

    Kurt

    --
    "Der Mensch kann viel ertragen, solange er sich selbst ertragen kann."  (Axel Munthe; schwed. Arzt u. Schriftsteller; 1857-1949)
    http://elektro-dunzinger.at
    http://shop.elektro-dunzinger.at
    1. Gugugg,

      entweder ich bin blind, oder ich kann keinen Link Gästebuch auf deiner HP entdecken. Anmeckern tun doch alle dasselbe: Nämlich dass das Element mit der übergebenen id nicht existiert. Da du ja die id mit this.id übergibst, solltest du vielleicht mal gucken, was denn das Gästebuch tatsächlich für eine id hat und ob es eine hat. Und ob da nicht vielleicht irgendein fieses kleines Anführungszeichen fehlt oder ähnliches.

      Gruß, Uschi

      1. Hallo Uschi,

        Gugugg,

        entweder ich bin blind, oder ich kann keinen Link Gästebuch auf deiner HP entdecken. Anmeckern tun doch alle dasselbe: Nämlich dass das Element mit der übergebenen id nicht existiert. Da du ja die id mit this.id übergibst, solltest du vielleicht mal gucken, was denn das Gästebuch tatsächlich für eine id hat und ob es eine hat. Und ob da nicht vielleicht irgendein fieses kleines Anführungszeichen fehlt oder ähnliches.

        Sorry, hier der Link: http://faq.united-web.at/_test/index.php?body=1&content=guestbook
        Tatsächlich geht es ja um den Relauch der Site, die ist zur Zeit noch in einem Testverzeichnis.
        this.id spricht ja nur das div an, das das Menü enthält. Das Gästebuch oder auch sonstiger anderer Content ist ja nicht von dem JS betroffen, die Seite wird serverseitig zusammengestellt.
        Die Scripte dienen alleine dazu, die Divs des JS-Menüs anzuzeigen,bzw. zu verbergen.
        Nochmals sorry, daß ich den Link vergessen habe.

        Gruß

        Kurt

        --
        "Man sieht nur mit dem Herzen gut. Das Wesentliche ist fuer die Augen unsichtbar."  (Antoine de Saint-Exupéry; fr. Schriftsteller u. Kampfflieger; 1900-1944)
        http://elektro-dunzinger.at
        http://shop.elektro-dunzinger.at
        1. Verflixt und zugenäht,

          ich suche jetzt auch schon eine halbe Stunde und Finde den Bock nicht. Ich habe mir den Kram auf die Platte gezogen, mit Mozi 1.3 getestet (kein Fehler).

          Der IE6 liefert hier lokal auch keinen Fehler. Die anzuzeigenden Elemente existieren tatsächlich alle. Gehe ich aber online auf die Seite, kriege ich Fehlermeldungen, allerdings völlig erratisch, mal ja, mal nein.

          Wenn es aber lokal geht, und online nicht ist es vielleicht Timer-Problem? Ich bin ratlos. Aber wenn, sollte man die Fehlermeldungen dadurch abfangen können, dass du in in change, show_it und hide_it das ändern, verstecken etc nur ausführt, wenn das Element nach Ansicht des Browsers existiert, also z.B.

          function hide_it(id)
            {
              if(window.opera || (document.getElementById && !document.all))
                if(document.getElementById(id)) {
                  document.getElementById(id).style.visibility = 'hidden';
                }
              else if(document.all) {
                if(document.all[id]) {
                  document.all[id].style.visibility = 'hidden';
                }
              } else if(document.layers) {
                if(document.layers['id']) {
                  document.layers[id].visibility = 'hide';
                }
              }
            }

          Gruß, Uschi

          1. Hallo Uschi Renziehausen,

            Verflixt und zugenäht,

            Ja, was denkst du, hab ich dazu gesagt. ;-)

            ich suche jetzt auch schon eine halbe Stunde und Finde den Bock nicht. Ich habe mir den Kram auf die Platte gezogen, mit Mozi 1.3 getestet (kein Fehler).

            Der IE6 liefert hier lokal auch keinen Fehler. Die anzuzeigenden Elemente existieren tatsächlich alle. Gehe ich aber online auf die Seite, kriege ich Fehlermeldungen, allerdings völlig erratisch, mal ja, mal nein.

            Wenn es aber lokal geht, und online nicht ist es vielleicht Timer-Problem? Ich bin ratlos.

            Ja, ich auch. Inzwischen konnte ich vermutlich die Fehlerquelle eingrenzen [pref:t=66542&m=379888].

            Aber wenn, sollte man die Fehlermeldungen dadurch abfangen können, dass du in in change, show_it und hide_it das ändern, verstecken etc nur ausführt, wenn das Element nach Ansicht des Browsers existiert, also z.B.

            function hide_it(id)
              {
                if(window.opera || (document.getElementById && !document.all))
                  if(document.getElementById(id)) {
                    document.getElementById(id).style.visibility = 'hidden';
                  }
                else if(document.all) {
                  if(document.all[id]) {
                    document.all[id].style.visibility = 'hidden';
                  }
                } else if(document.layers) {
                  if(document.layers['id']) {
                    document.layers[id].visibility = 'hide';
                  }
                }
              }

            Jau, das wäre eine Idee!
            Ich muss jetzt weg, aber abends werde ich das ganze gleich mal testen.
            Ich habe ja auch schon an das try-catch http://www.selfhtml.teamone.de/javascript/beispiele/fehlerbehandlung_try_catch.htm Statement gedacht, das scheint mir aber bei meinen Kenntnissen doch etwas schwierig zu werden.
            Ich versuche erst mal deinen Weg! :-)
            Danke für die Mühe, die du dir gemacht hast!

            Gruß

            Kurt

            --
            "Kraft wird aus dem Zwang geboren und stirbt an der Freiheit."  (Leonardo da Vinci; it. Universalgenie; 1452-1519)
            http://elektro-dunzinger.at
            http://shop.elektro-dunzinger.at
          2. Hallo Uschi,

            Mit deinem workaroun funktioniert es nun in Opera7.2, Firebird 0.7 und Mozilla 1.5, aber dafür steigt der IE 6 aus.
            Da funktioniert das Menü als Ganzes nicht mehr.
            Werde mich dann doch wohl an die Try-catch Methode ranwagen müssen... :-(

            Gruß

            Kurt

            --
            "Die Sentimentalitaet ist das Alibi der Hartherzigen."  (Arthur Schnitzler; oest. Schriftsteller; 1862-1931)
            http://elektro-dunzinger.at
            http://shop.elektro-dunzinger.at
            1. Hallo Kurt,

              Werde mich dann doch wohl an die Try-catch Methode ranwagen müssen... :-(

              Das Prinzip ist eigentlich relativ einfach.

              <script type="text/javascript">
              <!--
              try {
                alert("Start");
                var a = document.getElementById("gibtsNicht").kannNichtgehen;
                alert("Das wird nicht mehr passieren. " + a);
              } catch(e) {
                //hierher kommt das Script nur bei einem Fehler im try-Block
                alert(e);
              }
              alert("Hier gehts dann trotz Fehler weiter ...");
              //-->
              </script>

              viele Grüße

              Axel

              1. Hallo Axel Richter,

                Hallo Kurt,

                Werde mich dann doch wohl an die Try-catch Methode ranwagen müssen... :-(
                Das Prinzip ist eigentlich relativ einfach.

                <script type="text/javascript">
                <!--
                try {
                  alert("Start");
                  var a = document.getElementById("gibtsNicht").kannNichtgehen;
                  alert("Das wird nicht mehr passieren. " + a);
                } catch(e) {
                  //hierher kommt das Script nur bei einem Fehler im try-Block
                  alert(e);
                }
                alert("Hier gehts dann trotz Fehler weiter ...");
                //-->
                </script>

                Danke dir für die Erklärung.
                Das Problem hat sich zwar bereits erübrigt(Eigenfehler), aber ich werde es trotzdem mal zu Übungszwecken versuchen.
                Danke nochmals!

                Gruß

                Kurt

                --
                "Viele Leute kaufen mit Geld, was sie nicht haben. Dinge, die sie nicht brauchen, um Leuten zu imponieren, die sie nicht ausstehen koennen."  (Sprichwort)
                http://elektro-dunzinger.at
                http://shop.elektro-dunzinger.at
          3. Hallo Uschi,

            Sorry, das war zu schnell.
            Ich hatte einen Schachtelungsfehler, an dem sich nur der IE gestoßen hat.
            Nun funktioniert es wieder überall! :-)
            Danke dir!

            Gruß

            Kurt

            --
            "Wir lernen aus Erfahrung, dass die Menschen nichts aus Erfahrung lernen."  (George Bernhard Shaw; ir. Dramatiker; 1856-1950)
            http://elektro-dunzinger.at
            http://shop.elektro-dunzinger.at
            1. Gugugg Kurt,

              Mir fällt da so im Nachgang noch ein: Warum haust du das Hauptmenü eigentlich über document.write raus?

              Uschi

              1. Hallo Uschi,

                Gugugg Kurt,

                Mir fällt da so im Nachgang noch ein: Warum haust du das Hauptmenü eigentlich über document.write raus?

                Weil das Menü nur bei aktiviertem JS angezeigt werden soll.
                Als Alternative dient ein Listenmenü, das aber bereits eine beträchtliche Länge besitzt.
                Mit display:none und anschliessendem display:block per JS  ginge es auch, das Menü anzuzeigen, aber leider kann dies Opera 6.* nicht handeln.
                Mit Visibility geht es nicht, da sonst der Platz reserviert würde, der sowieso schon sehr begrenzt ist. Das Listenmenü würde dann erst etwa dort beginnen, wo bei aktiviertem JS der Link zum Listenmenü ist.
                Deshalb die Entscheidung, das Menü per document.write reinzuschreiben, dann sind alle zufrieden. :-)

                Gruß

                Kurt

                --
                "Wir lernen aus Erfahrung, dass die Menschen nichts aus Erfahrung lernen."  (George Bernhard Shaw; ir. Dramatiker; 1856-1950)
                http://elektro-dunzinger.at
                http://shop.elektro-dunzinger.at
                1. Hallo Uschi,

                  Weil das Menü nur bei aktiviertem JS angezeigt werden soll.
                  Als Alternative dient ein Listenmenü, das aber bereits eine beträchtliche Länge besitzt.
                  Mit display:none und anschliessendem display:block per JS  ginge es auch, das Menü anzuzeigen, aber leider kann dies Opera 6.* nicht handeln.
                  Mit Visibility geht es nicht, da sonst der Platz reserviert würde, der sowieso schon sehr begrenzt ist. Das Listenmenü würde dann erst etwa dort beginnen, wo bei aktiviertem JS der Link zum Listenmenü ist.
                  Deshalb die Entscheidung, das Menü per document.write reinzuschreiben, dann sind alle zufrieden. :-)

                  Ursprünglich war das Menü ja relativ zu der Zelle positioniert, als die Entscheidung gefallen ist, erst, als ich merkte, daß der IE bei Schriftgrößenänderung die Submenüs verschob, habe ich das Hauptmenü absolut positioniert.
                  Danach habe ich aber am Menü selbst nichts mehr verändert.

                  Gruß

                  Kurt

                  --
                  "Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger."  (Kurt Tucholsky; dt. Schriftsteller u. Satiriker; 1890-1935)
                  http://elektro-dunzinger.at
                  http://shop.elektro-dunzinger.at
                2. Nochmal re,

                  das mit Opera 6.x und Schwierigkeiten bei display:block respektive none  wusste ich nicht. Wieder was gelernt. Ich bastel gerade an einem Administrations-Tool. Da ich dort bei display: none auf Probleme mit der Übertragung von Formulardaten stoßen würde, bin ich darauf verfallen die Unsichtbarkeit über visibility zu erzeugen und Breite und Höhe bei Unsichtbarkeit auf 1px zu setzen. Beim Sichtbarmachen ändere ich dann einfach die css-Klasse. Würde der eine Pixel was ausmachen?

                  Uschi

                  1. Hallo Uschi,

                    »

                    das mit Opera 6.x und Schwierigkeiten bei display:block respektive none  wusste ich nicht. Wieder was gelernt.

                    Sei getröstet, ich wusste es auch erst, als der 6er Opera mein Menü nicht und nicht anzeigen wollte. :o)

                    »Ich bastel gerade an einem Administrations-Tool. Da ich dort bei display: none auf Probleme mit der Übertragung von Formulardaten stoßen würde, bin ich darauf verfallen die Unsichtbarkeit über visibility zu erzeugen und Breite und Höhe bei Unsichtbarkeit auf 1px zu setzen. Beim Sichtbarmachen ändere ich dann einfach die css-Klasse. Würde der eine Pixel was ausmachen?

                    Nein, würde er natürlich nicht.
                    Jetzt schon gar nicht, da das Menü nun absolut positioniert ist, aber da es nun so schön funktioniert und ich damit auch noch überflüssigen Quelltext einspare, werde ich es vermutlich nicht mehr ändern. ;-)
                    Der Vorteil bei der Geschichte ist ja der, daß bei fehlender Funktionalität kein Byte davon im Browser auftaucht, im Gegensatz zu der Lösung mit visibility.

                    Gruß

                    Kurt

                    --
                    "Der Erfolg zaehlt. Die Misserfolge werden gezaehlt."  (Nikolaus Cybinski; dt. Aphoristiker; geb. 1936)
                    http://elektro-dunzinger.at
                    http://shop.elektro-dunzinger.at
  2. Hallo an alle,

    Der Auslöser dürfte die http://faq.united-web.at/_test/scripte/menu.js Datei sein.
    Diese Datei schreibt per document.write das Menü in die Seite und ist bereits im Cache.
    Ich vermute mal, da das Laden des Gästebuches relativ lange dauert, daß die divs noch nicht im Speicher sind, die von dem Script angesprochen werden.
    Auf sämtlichen anderen Seite tritt dieser Fehler nämlich nicht auf.
    http://faq.united-web.at/_test/index.php?body=1&content=guestbook
    onError="return false" funktioniert nicht, da dieser event Handler ja nur für <img> vorgesehen ist und nicht als eigenständiger Eventhandler notiert werden kann?!?
    Weiss jemand vielleicht eine Lösung?
    Abfangen wäre ja ok, da es sich nur um ein Timingproblem handelt, nur weiss ich nicht, wie.

    Gruß

    Kurt

    --
    "Eine gute Rede ist eine Ansprache, die das Thema erschoepft, aber keineswegs die Zuhoerer."  (Winston Churchill; br. Politiker; 1874-1925)
    http://elektro-dunzinger.at
    http://shop.elektro-dunzinger.at