Philipp Sauer: OnMouseOver in NS 4.7 funzt nicht

Hallo!

Ich habe vor ein paar Tagen schon mal wegen diesem Problem gepostet.
Die Antwort die ich bekam, schien mir auch die Lösung zu sein, doch heute kam ich dazu den Tipp umzusetzen und der OnMouseOver funktioniert immer noch nicht.

In der letzten Version hatte ich die OnMouseOver und OnMouseOut Angaben fälschlicherweise in den <img> Tag geschschrieben anstatt in den <a> Tag, so, dass es nur im IE und NS 6.x funktioniert hat.

Jetzt habe ich das korrigiert und trotzdem passiert in NS 4.7 nichts.
Die Highlight und Normal Bilder sind oben im Head angegeben, die Bildwechselfunktion auch. Im <a> Tag rufe ich sie auf und bekomme wenn ich mit der Maus über ein Bild gehe und dann wieder runter die Meldung:

--schnipp--

JavaScript Error: file:C:/Dokumente und
Einstellungen/wert/Eigene Dateien/VIA
Projekte/Pascal-Kochem.de/1.9a/team.htm, line 46:

window.document.images[Bildnr] has no properties.
JavaScript Error: file:C:/Dokumente und
Einstellungen/wert/Eigene Dateien/VIA
Projekte/Pascal-Kochem.de/1.9a/team.htm, line 46:

window.document.images[Bildnr] has no properties.

--schnapp--

In Line 46 steht:
 window.document.images[Bildnr].src = Bildobjekt.src;

Kann mir jemand sagen, wo ich den Fehler reingebaut habe?

Viele Grüße
Philipp

  1. naja wichtig ist eigendlich mehr die zeile davor.
    zumindest bei den meisten programmen, die fehler aufsuchen.

    vielleicht hast du bei der bildaufzählung nicht an bild0 gedacht?
    ansonsten ist kein fehler in dem sinne ersichtlich

    1. naja wichtig ist eigendlich mehr die zeile davor.
      zumindest bei den meisten programmen, die fehler aufsuchen.

      Die Zeile davor ist:
      function Bildwechsel(Bildnr,Bildobjekt) {

      vielleicht hast du bei der bildaufzählung nicht an bild0 gedacht?

      Doch. Sonst würde sich ja auch "nur" das falsche Bild ändern. Das wäre ja halb so wild. Außerdem würde es dann in den anderen Browsern nicht ohne Probleme funktionieren.

      ansonsten ist kein fehler in dem sinne ersichtlich

      Naja, irgendwo muss ja einer sein. Trotzdem Danke.

  2. hi

    Layer im Spiel..? Die sind für NN4 so eine Art eigene Dokumente...
    document.layername.document.images[Bildnr].src = Bildobjekt.src;

    Grüße aus Bleckede

    Kai

    1. Layer im Spiel..? Die sind für NN4 so eine Art eigene Dokumente...
      document.layername.document.images[Bildnr].src = Bildobjekt.src;

      nein, kein <layer> tag, ich habe nur mit <div style=""> gearbeitet.
      Spricht man dann auch von Layer? Ich habe das so ausprobiert, wie Du geschrieben hast. den layername müsste ich dann doch mit id="layername" im <div> tag vergeben, oder? Das hat leider gar nicht gefunzt. Aber ich vermute die Lösung bezieht sich ohnehin nicht auf den DIV Tag. Richtig?

      1. Moin!

        nein, kein <layer> tag, ich habe nur mit <div style=""> gearbeitet.
        Spricht man dann auch von Layer? Ich habe das so ausprobiert, wie Du geschrieben hast. den layername müsste ich dann doch mit id="layername" im <div> tag vergeben, oder? Das hat leider gar nicht gefunzt. Aber ich vermute die Lösung bezieht sich ohnehin nicht auf den DIV Tag. Richtig?

        Positionierte <div>s sind für Netscape 4 Layer, die ein eigenständiges Dokument darstellen.

        Man kann also nicht document.images... anwenden, sondern muß über document.layers.document.images... (oder bei Verschachtelung eben document.layers.document.layers.document.images...) benutzen.

        Ist etwas nervig. Du solltest deiner Bildwechselfunktion den Layernamen mit übergeben, damit die Funktion dann sowas machen kann:

        if (document.images[deinbild])
        {
        //  bildtausch traditionell
        }
        else if (document.layers[layerid].document.images[deinbild])
        {
        // bildtausch NS4
        }

        Keine Gewähr für die Syntax, das ist schnell aus dem Kopf dahergeschrieben und vermutlich ohnehin anzupassen auf deine Situation.

        - Sven Rautenberg

        1. Ist etwas nervig. Du solltest deiner Bildwechselfunktion den Layernamen mit übergeben, damit die Funktion dann sowas machen kann:

          if (document.images[deinbild])
          {
          //  bildtausch traditionell
          }
          else if (document.layers[layerid].document.images[deinbild])
          {
          // bildtausch NS4
          }

          Keine Gewähr für die Syntax, das ist schnell aus dem Kopf dahergeschrieben und vermutlich ohnehin anzupassen auf deine Situation.

          Danke erst einmal für die Hilfe. Leider kenne ich mich gar nicht so wirklich mit JavaScript aus und kann Deinen Hinweise nicht umsetzen.

          Bedeutet denn " if (document.images[deinbild]) " eine abfrage, ob es dieses objekt gibt?
          wenn ich erst mal versuche den Effekt im NS 4 zum laufen zu bringen, kann ich mir das if und else if ja erst mal sparen, oder?
          Ich habe es so versucht:

          function Bildwechsel(Bildnr,Bildobjekt) {
          document.layers[tabelle].document.images[Bildnr].src = Bildobjekt.src;
          }

          Die Bilder die getauscht werden sollen befinden sich in einem Layer, das so definiert ist:

          <div style="position:absolute; top:0px; left:0px; z-index:1;" id="tabelle">

          Die Funktion rufe ich dann hiermit auf:

          <a href="index.htm" onMouseOver="Bildwechsel(3,Highlight3); window.status='Home'; return true" onMouseOut="Bildwechsel(3,Normal3); window.status=''">

          und erhalte in der Comunicator Console irgendwie keine
          Fehlermeldung. Funktionieren tut`s trotzdem nicht.

          Viele Grüße
          Philipp

          1. Moin!

            if (document.images[deinbild])
            {
            //  bildtausch traditionell
            }
            else if (document.layers[layerid].document.images[deinbild])
            {
            // bildtausch NS4
            }

            Bedeutet denn " if (document.images[deinbild]) " eine abfrage, ob es dieses objekt gibt?

            Exakt. Wenns das nicht gibt, wird garnicht erst weiter versucht, damit zu arbeiten. Es wird dann nicht nur nichts gemacht, sondern auch keine Fehlermeldung generiert. Sehr praktisch für "Zusatznutzen"-Javascripte, die für das Funktionieren der Seite nicht lebenswichtig sind. Aber auch lebenswichtige Javascripte (wenn man dumm genug war, sie einzubauen) kann man auf diese Weise etwas anwenderfreundlicher machen, weil eben keine Fehlermeldung aufgeht, sondern höchstens ein eigenes alert().

            wenn ich erst mal versuche den Effekt im NS 4 zum laufen zu bringen, kann ich mir das if und else if ja erst mal sparen, oder?

            Könntest du. Aber warum kleckern? Lieber gleich klotzen! Gehen muß es letztendlich ja in allen Browsern.

            Ich habe es so versucht:

            function Bildwechsel(Bildnr,Bildobjekt) {
            document.layers[tabelle].document.images[Bildnr].src = Bildobjekt.src;
            }

            Das ist im Prinzip richtig. Aber eben nur im Prinzip.

            Zuerst mal eine Schönheitskorrektur: Wenn du Bilder ansprechen willst, dann gib ihnen einen Namen: <img name="bild01" ...> Damit mußt du dann beim Funktionsaufruf nicht mehr Bildnummern zählen, sondern kannst einfach den Namen übergeben. Das macht die Dinge wesentlich einfacher, vor allem bei nachträglichen Änderungen. Es reicht ja schon, wenn im Quelltext davor ein neues Bild hinzukommt.

            Und dann:
            document.layers[tabelle]
                            ^^^^^^^
            So wie das zur Zeit dasteht, ist tabelle eine Variable. Das _ist_ sie aber nicht, sondern gemeint ist die Zeichenkette "tabelle". Also sollte es auch so geschrieben werden:
            document.layers["tabelle"]

            Wenn du schlau bist und verschiedene Layer mit zu wechselnden Bildern hast, übergibst du diesen Wert auch an deine Bildwechselfunktion.

            Ok, aktueller Stand bis hierher (ich bastel mal meine und deine Funktion zusammen:
            function Bildwechsel(Bildnr,Bildobjekt)
            {
              if (document.images[Bildnr])
              {
                //  bildtausch traditionell
              }
              else if (document.layers["tabelle"].document.images[Bildnr])
              {
                document.layers["tabelle"].document.images[Bildnr].src = Bildobjekt.src;
              }
            }

            Und der Aufruf:
            <a href="index.htm"
              onmouseover="Bildwechsel('bild03',Highlight3);"
              onmouseout="Bildwechsel('bild03',Normal3);">
            <img src="ein.gif" name="bild03" width height alt=""></a>

            Die Veränderung der Statuszeile hab' ich mal einfach wieder ausgebaut. 'Home' sollte mit Sicherheit schon in der Grafik stehen (dann braucht man das nicht noch mal zu wiederholen), im Netscape 6 und durch Webwasher kann man sowas rausfiltern und es wird generell nicht gern gesehen, in der Statuszeile rumzupfuschen. Also laß es lieber sein.

            Was noch fehlt: "// bildtausch traditionell"
            Und das ist schnell gemacht:

            document.images[Bildnr].src = Bildobjekt.src;

            - Sven Rautenberg

            1. Könntest du. Aber warum kleckern? Lieber gleich klotzen! Gehen muß es letztendlich ja in allen Browsern.

              Ich wollte erst einmal eine lauffähige NS Version basteln um auszuschließen, dass der Fehler in der if-anweisung liegt. wenn man sich so wenig auskennt, dass man kaum irgendeine Zeile als fehlerquelle ausschließen kann, ist es doch sinnvoll die potentiellen Fehlerursachen so gering wie möglich zu halten.

              Zuerst mal eine Schönheitskorrektur: Wenn du Bilder ansprechen willst, dann gib ihnen einen Namen: <img name="bild01" ...> Damit mußt du dann beim Funktionsaufruf nicht mehr Bildnummern zählen, sondern kannst einfach den Namen übergeben. Das macht die Dinge wesentlich einfacher, vor allem bei nachträglichen Änderungen. Es reicht ja schon, wenn im Quelltext davor ein neues Bild hinzukommt.

              Das stimmt. Außerdem wird ja scheinbar in NS in jedem neuen Layer von 0 neu losgezählt. So bekomme ich in unterschiedlichen Browsern mit den Bildnummern zwangsläufig Probleme.

              Und dann:
              document.layers[tabelle]
                              ^^^^^^^
              So wie das zur Zeit dasteht, ist tabelle eine Variable. Das _ist_ sie aber nicht, sondern gemeint ist die Zeichenkette "tabelle". Also sollte es auch so geschrieben werden:
              document.layers["tabelle"]

              Danke!

              Wenn du schlau bist und verschiedene Layer mit zu wechselnden Bildern hast, übergibst du diesen Wert auch an deine Bildwechselfunktion.

              Brauche ich in diesem Fall nicht.

              Ok, aktueller Stand bis hierher (ich bastel mal meine und deine Funktion zusammen:
              function Bildwechsel(Bildnr,Bildobjekt)
              {
                if (document.images[Bildnr])
                {
                  //  bildtausch traditionell
                }
                else if (document.layers["tabelle"].document.images[Bildnr])
                {
                  document.layers["tabelle"].document.images[Bildnr].src = Bildobjekt.src;
                }
              }

              Das hat so wiet dann auch funktioniert, bis ich versuchen wollte über die Bildnamen, anstatt über die Nummern zu gehen. In Selfhtml habe ich gelesen:

              --schnipp--

              ...  mit dem Namen der Grafik
              Dabei geben Sie mit document.BildName den Namen an, den Sie bei der Definition der Grafik im einleitenden <img>-Tag im Attribut name= angegeben haben

              --schnapp--

              Das mit name="" hattest Du ja auch schon geschrieben. Ich hab dann also "images[Bildnr]" durch [Bildname] ersetzt. Beim Aufruf entsprechend dann den Namen (in Hochkommas) anstelle der Nummer übergeben.

              Dann sah die Funktion so aus:

              function Bildwechsel(Bildname,Bildobjekt)
              {
                if (document.[Bildname])
                 {
                  document.[Bildname].src = Bildobjekt.src;
                 }
                else if (document.layers["tabelle"].document.[Bildname])
                 {
                  document.layers["tabelle"].document.[Bildname].src = Bildobjekt.src;
                 }
              }

              Und der Aufruf:

              <a href="index.htm"
              onMouseOver="Bildwechsel('home',Highlight3);"
              onMouseOut="Bildwechsel('home',Normal3);">

              und durch Webwasher kann man sowas rausfiltern und es wird generell nicht gern gesehen, in der Statuszeile rumzupfuschen. Also laß es lieber sein.

              es steht noch drin, aber du hast recht.

              Was noch fehlt: "// bildtausch traditionell"
              Und das ist schnell gemacht:

              document.images[Bildnr].src = Bildobjekt.src;

              Weil ich im IE und NS Fehlermeldungen bekam, hab ich die
              eckigen Klammern um Bildname entfernt. das hat die meldungen
              reduziert, aber jetzt bekomme ich im IE:
              "document.layers.tabelle ist Null oder kein Objekt"
              Dabei sollte der IE doch gar nicht so weit kommen, der sollte doch die Standardversion benutzen, das dort stehende Objekt
              document.Bildname scheint es jedoch nicht zu geben. Hm.

              An welchen Klammern oder Kommatas liegt`s ? Ich verstehe es nicht!

              Vielen Dank
              für die echt ausführliche Hilfe bisher.

              1. Moin nochmal!

                Das hat so wiet dann auch funktioniert, bis ich versuchen wollte über die Bildnamen, anstatt über die Nummern zu gehen. In Selfhtml habe ich gelesen:

                --schnipp--

                ...  mit dem Namen der Grafik
                Dabei geben Sie mit document.BildName den Namen an, den Sie bei der Definition der Grafik im einleitenden <img>-Tag im Attribut name= angegeben haben

                --schnapp--

                Im Prinzip ist der Zugriff über Bildnamen absolut identisch wie der Zugriff über Bildnummern. Die Funktion hätte unverändern funktioniert! :)

                Das mit name="" hattest Du ja auch schon geschrieben. Ich hab dann also "images[Bildnr]" durch [Bildname] ersetzt. Beim Aufruf entsprechend dann den Namen (in Hochkommas) anstelle der Nummer übergeben.

                Tja, und da ist der Fehler.

                Entweder gibst du den Bildnamen direkt als Objektname an:

                document.Bildname

                Dann müßte aber folgendes Bild existieren:
                <img name="Bildname">

                Mit Variablen zu arbeiten ist mit solch einem Konstrukt fast unmöglich.

                Die Zugriffsweise über ein Array funktioniert aber:
                document.images["Bildname"] sollte bei obigem Bild funktionieren. Bedenke, daß es sich bei "Bildname" um den Namen handelt, nicht um eine Variable.

                Dann sah die Funktion so aus:

                Änderungen:

                function Bildwechsel(Bildname,Bildobjekt)
                {

                if (document.images[Bildname])

                {

                document.images[Bildname].src = Bildobjekt.src;

                }

                else if (document.layers["tabelle"].document.images[Bildname])

                {

                document.layers["tabelle"].document.images[Bildname].src = Bildobjekt.src;

                }
                }

                Und der Aufruf:

                <a href="index.htm"
                onMouseOver="Bildwechsel('home',Highlight3);"
                onMouseOut="Bildwechsel('home',Normal3);">

                Der ist in Ordnung!

                Weil ich im IE und NS Fehlermeldungen bekam, hab ich die
                eckigen Klammern um Bildname entfernt. das hat die meldungen
                reduziert, aber jetzt bekomme ich im IE:
                "document.layers.tabelle ist Null oder kein Objekt"

                Vermutlich ist da irgendwas durch deine Änderungen in Schieflage geraten. Wenn Objekte falsch abgefragt werden, kann's zu Chaos führen. :)

                Zum Debuggen ist eine Strategie immer gut: Wenn du wissen willst, was wann wo passiert, setze an die passenden Stellen ein alert(); rein. Alert ist die beste Funktion für sowas, auch wenn die Funktion von Mouseovern damit ziemlich gestört wird: Es geht ein Dialogfenster auf, und du kannst den dort enthaltenen Text frei definieren und sogar Objekte und Variablen mit ausgeben:

                function Bildwechsel(Bildname,Bildobjekt)
                {

                alert("Bildwechsel aufgerufen");

                if (document.images[Bildname])
                   {

                alert("Normaler Bildtausch zu Bild "+Bildobjekt.src);

                document.images[Bildname].src = Bildobjekt.src;
                   }
                  else if (document.layers["tabelle"].document.images[Bildname])
                   {

                alert("NS4-Bildtausch zu Bild "+Bildobjekt.src);

                document.layers["tabelle"].document.images[Bildname].src = Bildobjekt.src;
                   }
                }

                Die Funktion ist durch diese Alerts reichlich unbenutzbar für den Alltag: Egal wo man den Mauszeiger hinbewegt, ständig unterbrechen einen die Dialogboxen. Mit der Return-Taste sind sie, ohne Mausbewegung, aber schnell bestätigt - und du erhälst einen Überblick, was in deinem Javascript ausgeführt wird, und was nicht.

                - Sven Rautenberg

                1. Moin zurück!

                  Super, super! Alles läuft wie gewünscht.
                  Du hast mir prima geholfen, hätte das alleine
                  wohl erst nach einigen Java-Script-Büchern
                  hinbekommen.

                  Gute Nacht,
                  Philipp