Helmut Kuhn: Fehler: Objekt erforderlich

Hallo zusammen.

Mein Ziel: ein jpg-file soll vertikal endlos laufen

Mein Problem: Zeile13 Objekt erforderlich

Mein script:

html:
<html>
<head>
<title>rechts</title>
<LINK REL="Stylesheet" TYPE="text/css" HREF="css/style.css">
</head>
<body><script language="JavaScript" src="js/sety.js">
</script>
 <div id="denk"><img src="images/denk.jpg" width="31" height="62" title="Fang mich!"></div>
</body>
</html>

js:
<!--
//Bild jpg vertikale Position hoch/runter
var y  = 1;
var schritt = 1;
 whatbrowser();
 while(true)
 {
  if(y < 0 | y >= screen.availHeight)
  {
   if(ie)
   {
   document.getElementById("denk").style.top = y;
   schritt =- schritt;
   }
   if(ns)
   {
   document.getElementById("denk").top = y;
   schritt =- schritt;
   }
  }
  y += schritt;
 }
function whatbrowser()
 {
  ns = (document.layers)?true:false;
  ie = (document.all)?true:false;
 }
//-->

  1. Hallo,
    ich würde mal sagen das Problem liegt darin, daß das Script ausgeführt wird, bevor ein Objekt deklariert ist, also bekannt ist.
    Wenn Du die div vor den Script Block stellst sollte dies er Fehler nicht mehr auftreten.
    Ich befürchte jedoch, daß das Script nicht 100% funktioniert, weil das Bild aus dem Browserfenster rausläuft und zwar endlos. Kann mich aber auch täuschen.
    Auf jeden Fall muß die Div vor den Script Block

    ciao

    Matthias

    1. Hallo.

      Erst mal Danke für Dein Interesse!
      Nachdem ich das script angepasst habe, lässt sich die Datei nicht mehr laden. Als Alternative habe ich die Zeile document.getElementById("denk").style.top = y;
      getauscht gegen document.all[denk].style.posTop = y;
      Dafür habe ich die Fehlermeldung: 'document.all[...].style' ist Null oder kein Objekt.

      Anbei nochmal der code

      html:
      <html>
      <head>
      <title>rechts</title>
      <LINK REL="Stylesheet" TYPE="text/css" HREF="css/style.css">
      </head>
      <body><img src="images/denk.jpg" width="31" height="62" title="Fang mich!" id="denk">
      <script language="JavaScript" src="js/sety.js">
      </script>
      </body>
      </html>

      css:
      <!--
      #denk
        {
         position:  absolute;
         top   0;
         left:   0;
         z-index:  3;
        }

      //-->

      js:
      <!--
      //Bild jpg vertikale Position hoch/runter
      var y  = 1;
      var schritt = 1;
       whatbrowser();
       while(true)
       {
        if(y < 0 | y >= screen.availHeight)
        {
         schritt =- schritt;
         if(ie)
         {
         //document.getElementById("denk").style.top = y;
         document.all[denk].style.posTop = y;
         //document.getElementById("denk").style.posTop = y;
         }
         if(ns)
         {
         document.getElementById("denk").top = y;
         }
        }
        y += schritt;
       }
      function whatbrowser()
       {
        ns = (document.layers)?true:false;
        ie = (document.all)?true:false;
       }
      //-->

      1. Hallo Helmut

        Erst mal Danke für Dein Interesse!
        Nachdem ich das script angepasst habe, lässt sich die Datei nicht mehr laden. Als Alternative habe ich die Zeile document.getElementById("denk").style.top = y;
        getauscht gegen document.all[denk].style.posTop = y;
        Dafür habe ich die Fehlermeldung: 'document.all[...].style' ist Null oder kein Objekt.

        »»<img src="images/denk.jpg" width="31" height="62" title="Fang mich!" id="denk">

        css:
        #denk
          {
           position:  absolute;
           top   0;
           left:   0;
           z-index:  3;
          }

        ergänze bitte die Angaben zu top und left um die Einheit

        <!--
        //-->

        Kommentare dieser Form haben in externen Dateien nichts verloren. Dieser Kommentar wird ausschließlich innerhalb der HTMl-Datei verwendet

        Außerdem bei css ohne //

        js:
        <!--

        siehe oben

        //Bild jpg vertikale Position hoch/runter
        var y  = 1;
        var schritt = 1;
        whatbrowser();
        while(true)
        {
          if(y < 0 | y >= screen.availHeight)

        bist du sicher, dass du das bitweise Oder verwenden möchtest?
        Nimm lieber das normale ||

        {
           schritt =- schritt;
           if(ie)
           {
           //document.getElementById("denk").style.top = y;
           document.all[denk].style.posTop = y;

        denk steht nicht in Anführungsstichen, somit wird es als Variable gedeutet

        besser
        document.all["denk"].style.top= y;

        //document.getElementById("denk").style.posTop = y;
           }
           if(ns)

        {
           document.getElementById("denk").top = y;
           }

        function whatbrowser()
        {
          ns = (document.layers)?true:false;
          ie = (document.all)?true:false;
        }

        du ordnest Netscape 4 (nur der kennt Layer) die Methode getElementById zu, die kennt er wiederum nicht, sondern erst ab Netscape 6. Der Browser kennt aber Layers nicht.

        Der nächste kritische Punkt ist die unendliche Schleife ohne Abbruchbedingung.

        Dein System ist sofort ausgelastet, daher der Effekt, dass sich die Seite nicht mehr laden läßt.

        Zu sehen ist übrigens nichts, da die Abläufe in Bruchteilen von Sekunden erfolgen.

        Hast du dir auch überlegt, was deine Schleife bewirkt?

        Start: y=1, schritt=1, element.style.top=0

        solange wie y<screen.availHeight ist passiert erstmal gar nichts, außer das y um eins erhöht wird

        irgendwann ist y=screen.availHeight z.b. 572

        dann passiert folgendes:

        die Bedingung wird wahr und das Element an den unteren Bildschirmrand geschoben, gleichzeitig kehrst du die Richtung um

        Jetzt passiert wiederum solange nichts, bis y=-1 ist. Du verschiebst das Element an den oberen Bildschirmrand und kehrst die Richtung wieder um.

        Da Spielchen geht von vorn los. Dein Element wird immer zu den Punkten -1 und z.B. 572 verschoben. Da das so schnell geht, pfeift dir der Browser eines und kümmert sich nicht darum. Da deine Schleife eh unendlich ist, stürzt er lieber ab als irgendwas von dem zu tun was du möchtest.

        Schaue dir mal die Methoden setTimeout bzw. setInterval an. Die helfen dir weiter.

        Viele Grüße

        Antje

        1. Hallo Antje.

          Danke für die guten Tips!

          Meine Lösung funktioniert nicht so toll. Das Bild bleibt bei einer Position über der Auflösung stehen. Leider habe ich keine Erfahrung mit setTimeout() und setInterval()

          <!--
          //Bild jpg vertikale Position hoch/runter
          var y  = screen.Height;
          var schritt = 1;
          var aktiv = window.setInterval("sety()",1000);
           whatbrowser();

          function sety()
           {
            if(y < 0 || y >= screen.availHeight)
            {
             schritt =- schritt;
             if(ie)
             {
              //document.getElementById("denk").style.top = y;
              document.all["denk"].style.posTop = y;
              //document.getElementById("denk").style.posTop = y;
             }
             if(ns)
             {
              document.layers["denk"].top = y;
              //document.getElementById("denk").top = y;
             }
            }
            y += schritt;
            window.clearInterval(aktiv);
           }
          function whatbrowser()
           {
            ns = (document.layers)?true:false;
            ie = (document.all)?true:false;
           }
          //-->

          1. Hallo Hartmut

            Meine Lösung funktioniert nicht so toll. Das Bild bleibt bei einer Position über der Auflösung stehen. Leider habe ich keine Erfahrung mit setTimeout() und setInterval()

            gehe mal Schritt für Schritt durch was wo passiert. Überprüfe insbesondere deine Bedingungen.

            Lasse dir doch mittels alert() ausgeben, an welcher Position sich das Element gerade befindet und wie oft, die Funktion aufgerufen wird.

            Viele Grüße

            Antje