Sebastian: getElementById() -> Objekt erforderlich...

Hallo!
Unten stehendes Script soll die Hintergrundfarbe von einer Zelle blinken lassen. Jedoch bekomm ich lediglich den Fehler: Objekt erforderlich...
Ich nehm mal an, das bezieht sich auf die Funktion getElementById().

Kann von euch mal jemand über den Codeauszug schauen was ich falsch gemacht habe?

Vielen Dank.

Gruß Sebastian

<script type="text/javascript">
 <!--
  x = true;
  i = 0;

function blink(objId,objClr){
   if(x){
    document.getElementById(objId).style.backgroundColor = objClr;
    x = false;

} else {
    document.getElementById(objId).style.backgroundColor = "transparent";
    x = true;

}
   setTimeout("blink()", 500);
  }
 //-->
 </script>

</head>
<body style="background-image:url(back2.jpg); background-repeat:repeat;">

<div style="margin-left:10px; margin-top:0px; position:absolute; top:20px; left:0px; min-height:480px; width:540px; background-color:#F0F0F0; border:solid 1px black; text-align:center; padding-bottom:20px;">
<div style="position:absolute; top:0px; left:0px;"><a href="frame_main.php">V UNIT1</a> -> <a href="frame_main.php">FEEDW</a> -> <a href="frame_main.php">P0LAA10DL</a></div><BR><H3>P0LAA10DL100          / L Ctrl Deaerator         </H3>
<TABLE style="text-align:left"><TR>
<TD id="las1" style="background-color:transparent; color:black; border:1px solid black">S</TD>
<TD></TD>
<script language="JavaScript">blink('las1','transparent')</script>

  1. jo bin nicht ganz sicher aber es gibt in css keien eigentschaft die du ansprichts. "background-color2 gibt es wohl ... aber "backgroundcolor" eher nicht. aber vielleciht täusch ich mich auch!
    denke mal du bist für jeden rat dankbar

    grüße!

    document.getElementById(objId).style.backgroundColor = objClr;

    1. denke mal du bist für jeden rat dankbar

      Wenn man keine Ahnung hat - einfach mal die Fresse halten.
      Dieter Nuhr

  2. hi,

    Ich nehm mal an, das bezieht sich auf die Funktion getElementById().

    Korrekt. Aber wenn du selbst schon weißt, wo der Fehler liegt, warum behebst du ihn dann nicht?

    Grüße aus Berlin

    Christoph S.

  3. Hallo,

    ...
    <body style="background-image:url(back2.jpg); background-repeat:repeat;">

    <div style="margin-left:10px; margin-top:0px; position:absolute; top:20px; left:0px; min-height:480px; width:540px; background-color:#F0F0F0; border:solid 1px black; text-align:center; padding-bottom:20px;">
    <div style="position:absolute; top:0px; left:0px;"><a href="frame_main.php">V UNIT1</a> -> <a href="frame_main.php">FEEDW</a> -> <a href="frame_main.php">P0LAA10DL</a></div><BR><H3>P0LAA10DL100          / L Ctrl Deaerator         </H3>

    ???
    Willst Du mich damit verwirren?

    <TABLE style="text-align:left"><TR>
    <TD id="las1" style="background-color:transparent; color:black; border:1px solid black">S</TD>
    <TD></TD>
    <script language="JavaScript">blink('las1','transparent')</script>

    Ich bin nicht ganz sicher, ob die Zeile mit der ID schon existiert, bevor die Tabelle komplett da ist. Setze die Zeile mal hinter den </table>.

    <script language="JavaScript">blink('las1','transparent')</script>

    Wenn ich Dein Script richtig verstehe, schaltest Du jetzt zwischen transparent und transparent hin und her.

    Gruß, Jürgen

    1. hallo JürgenB,

      Ich bin nicht ganz sicher, ob die Zeile mit der ID schon existiert, bevor die Tabelle komplett da ist.

      Das tut sie, da sie Bestandteil der Tabelle ist.

      Setze die Zeile mal hinter den </table>.

      Das ist völliger Unsinn, da die einzige vergebene ID für ein <TD> vergeben wurde. Das Problem ist, daß es eine falsche ID ist.

      Grüße aus Berlin

      Christoph S.

      1. Hallo Christoph,

        Ich bin nicht ganz sicher, ob die Zeile mit der ID schon existiert, bevor die Tabelle komplett da ist.

        Das tut sie, da sie Bestandteil der Tabelle ist.

        d.h die Zeile, die Teil der Tabelle ist, existiert und ist per JS ansprechbar, obwohl eben diese Tabelle noch noch nicht komplett ist. Das wusste ich nicht. (Daher ja auch "Ich bin nicht ganz sicher")

        Setze die Zeile mal hinter den </table>.

        Das ist völliger Unsinn, da die einzige vergebene ID für ein <TD> vergeben wurde.

        Ach so. In der Tabelle ist das Script ok, dahinter aber völliger Unsinn. Und was hat das mit der "einzigen vergebenen ID" zu tun?

        Das Problem ist, daß es eine falsche ID ist.

        Ja, und zwar weil, wie Peter schon schrieb, im setTimeout keine ID angegeben ist.

        Gruß, Jürgen

        1. hallo JürgenB,

          Ach so. In der Tabelle ist das Script ok, dahinter aber völliger Unsinn.

          Nein.

          Und was hat das mit der "einzigen vergebenen ID" zu tun?

          Die ist für eine Tabellenzelle vergeben. Du willst aber die Tabellenzelle _außerhalb_ von <table>...</table> nochmal hinschreiben. Und das ist nicht valide.

          Ja, und zwar weil, wie Peter schon schrieb, im setTimeout keine ID angegeben ist.

          Korrekt. Und jetzt sollte er genügend Hinweise für die Reparatur haben.

          Grüße aus Berlin

          Christoph S.

          1. Hallo,

            ... Du willst aber die Tabellenzelle _außerhalb_ von <table>...</table> nochmal hinschreiben. Und das ist nicht valide.

            nicht die Tabellenzeile, die <script>-Zeile.

            Gruß, Jürgen

            1. hallo JürgenB,

              ... Du willst aber die Tabellenzelle _außerhalb_ von <table>...</table> nochmal hinschreiben. Und das ist nicht valide.
              nicht die Tabellenzeile, die <script>-Zeile.

              oh. Dann habe ich das falsch gelesen und nehme das mit dem "Unsinn" zurück.

              Grüße aus Berlin

              Christoph S.

              1. aktualisiere

          2. hi,

            Du willst aber die Tabellenzelle _außerhalb_ von <table>...</table> nochmal hinschreiben. Und das ist nicht valide.

            nein, wollte er nicht - sondern <script> hinter die tabelle setzen.

            gruß,
            wahsaga

            --
            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
  4. Hi Sebastian

    <script type="text/javascript">
    <!--
      x = true;
      i = 0;

    function blink(objId,objClr){
       if(x){
        document.getElementById(objId).style.backgroundColor = objClr;
        x = false;

    } else {
        document.getElementById(objId).style.backgroundColor = "transparent";
        x = true;

    }
       setTimeout("blink()", 500);

    ^^^^
    mit welchen Parametern (ID und Farbe) rufst du die Funktion hier auf ?????

    }
    //-->
    </script>

    gruß
    peter

  5. function blink(objId,objClr){

    ...

    setTimeout("blink()", 500);

    die Funktion kann nur einmal funktionieren, beim zweiten Mal übergibst Du ja keine Parameter...

  6. Guten Morgen und Danke an alle!!!

    Hab da ja ne ganz schöne Diskussion entfacht...

    Aber doof von mir, dass ich das "setTimeout("blink()",500)" übersehen hab!

    Allerdings bekomm ich nun den Fehler "..'objId' ist undefiniert.."
    Kann das daran liegen, dass ich das Script durch mehrere Zellen aufrufe? Das ist doch aber erlaubt.

    <TABLE style="text-align:left"><TR>
    <TD id="las1" style="background-color:transparent; color:black; border:1px solid black">S</TD>
    <script language="JavaScript">blink('las1','transparent')</script>

    <TD><A HREF=./frame_main.php>blabla</A></TD></TR>
    <TD id="las2" style="background-color:transparent; color:black; border:1px solid black">S</TD>
    <script language="JavaScript">blink('las2','transparent')</script>

    <TD><A HREF=./frame_main.php>blablabla</A></TD></TR>
    <TD id="las3" style="background-color:transparent; color:black; border:1px solid black">S</TD>
    ......

    Gruß Sebastian

    1. Hallo,

      Allerdings bekomm ich nun den Fehler "..'objId' ist undefiniert.."

      Das liegt daran, dass die Übergabeparameter zwar beim Aufruf von setTimeout bekannt sind, nicht aber wenn die Funktion verzögert aufgerufen wird. Funktionsparameter sind wie lokale Variablen nur bis zum Ende der Funktion bekannt. Eine Abhilfe wären hier globale Variablen.

      Kann das daran liegen, dass ich das Script durch mehrere Zellen aufrufe? Das ist doch aber erlaubt.

      Im Prinzip ist das erlaubt. Aber dann klappt der Trick mit den globalen Variablen nicht mehr. Fass doch alle "Blinker" in einer Funktion ohne Übergabeparameter zusammen und leg die IDs oder besser noch die Referenzen der Elemente in globale Variablen.

      Gruß, Jürgen

      1. Hallo,

        vielen Dank für die Antwort.
        Das Problem das ganze in eine Funktion ohne Übergabeparameter zu packen ist, dass ich vor dem Aufruf nicht weiß wie viele "Blinker" ich hab und in welcher Farbe sie blinken. Deshalb mein Ansatz für jede benötigte Zelle die Funktion separat aufzurufen.

        Vielleicht gibt es ja aber auch einen einfacheren Weg?

        Gruß Sebastian

        1. Hallo,

          dann leg doch die Ids oder Elementreferenzen in ein globales Array und arbeite sie in einer Schleife ab. Z.B so (ungetestet!)

          var Blinkelemente = new Array();

          function blink() {
           for(var i=0;i<Blinkelemente.length;i++) {
            // hier jetzt das Geblinke mit Blinkelemente[i].style=...
           }
           // und hier jetzt der setTimeout
          }

          und im HTML unter der Tabelle oder Zeile

          <script ...>
          Blinkelemente[Blinkelemente.length]=document.getElementById("...")
          </script>

          Gruß, Jürgen

          1. Hallo Jürgen,

            erstmal vielen Dank für deine Hilfe. Ich hab das jetzt mal so umgesetzt, wie du mir es vorgeschlagen hast. Hab jetzt erstmal eine Farbe die blinkt. Es funktioniert auch, aber irgendwie hat es den Nebeneffekt, dass die Prozessorlast nach oben schnellt und der Browser nicht mehr reagiert.Kannst du dir das erklären?

            Gruß Sebastian

            <script type="text/javascript">
             <!--
              x = true;
              i = 0;

            var ids = new Array();

            function blink(){
                for(var i=0;i<ids.length;i++) {
                 if(x){
                  ids[i].style.backgroundColor = "#FFCC00";
                  x = false;

            } else {
                  ids[i].style.backgroundColor = "transparent";
                  x = true;

            }
                 setTimeout("blink()", 1000);
                }

            }
             //-->
             </script>

            </head>
            <body style="background-image:url(back2.jpg); background-repeat:repeat;">

            <div style="margin-left:10px; margin-top:0px; position:absolute; top:20px; left:0px; min-height:480px; width:540px; background-color:#F0F0F0; border:solid 1px black; text-align:center; padding-bottom:20px;">

            <H3>P0LAA10DL100          / L Ctrl Deaerator         </H3>
            <TABLE style="text-align:left">

            <TR>
             <TD id="las1" style="background-color:#000000; color:black; border:1px solid black">S</TD>
             <TD></TD>
             <TD><A HREF=./frame_main.php>blabla</A></TD>
             <script language="JavaScript">
              ids[ids.length]=document.getElementById("las1");
              blink();
             </script>
            </TR>
            <TR>
             <TD id="las2" style="background-color:#000000; color:black; border:1px solid black">S</TD>
             <TD></TD>
             <TD><A HREF=./frame_main.php>blabla</A></TD>
             <script language="JavaScript">
              ids[ids.length]=document.getElementById("las2");
              blink();
             </script>
            </TR>

            1. okay, hatte noch einen denkfehler drin. darf ja das script dann nur einmal aufrufen. hab das jetzt geändert. d.h. in der tabelle sammel ich meine objekte und nach der tabelle ruf ich die funktion blink auf. dier ersten paar sekunden läuft es problemlos aber den stürzt der browser ab.

              gruß sebastian

              1. Hallo,

                jetzt hab ich es gesehen: Du rufst den setTimeout in der for-Schleife auf und das führt zur Eskalation. Setze die Zeile einfach hinter die for-Schleife.

                Gruß, Jürgen

                1. ups, das kommt davon wenn man neue sachen einfach in den code kopiert und nicht schaut wie die klammern gesetzt sind ;-)

                  ich dank dir vielmals für deine hilfestellung!!!

                  gruß sebastian

            2. Hallo,

              <script language="JavaScript">

              <script type="text/javascript"> wäre hier richtig, aber daran liegt es nicht.

              Wieviel Zeilen blinken denn?

              Gruß, Jürgen

      2. Hallo,

        Allerdings bekomm ich nun den Fehler "..'objId' ist undefiniert.."

        Das liegt daran, dass die Übergabeparameter zwar beim Aufruf von setTimeout bekannt sind, nicht aber wenn die Funktion verzögert aufgerufen wird. Funktionsparameter sind wie lokale Variablen nur bis zum Ende der Funktion bekannt. Eine Abhilfe wären hier globale Variablen.

        Was spricht nochmal dagegen, die Variablen inklusive des Blinkstatus der Funktion beim setTimeout wieder zu übergeben? Der Blinkstatus muss dann nicht global sein und es sind unzählige parallel laufende Funktions(ketten) möglich.

        Im Prinzip ist das erlaubt. Aber dann klappt der Trick mit den globalen Variablen nicht mehr. Fass doch alle "Blinker" in einer Funktion ohne Übergabeparameter zusammen und leg die IDs oder besser noch die Referenzen der Elemente in globale Variablen.

        Wieso geht es nicht einfahcer über Parameter? (Übersehe ich etwas?)

        Mathias

        1. Hallo Mathias,

          nimm folgende Konstruktion:

          function f(par) {
            setTimeout("f(par)",1000) ;
          }

          und erster Aufruf mit:

          f(42);

          Durch den ersten Aufruf erhält par den Wert 42. Beim Ende der Funktion wird die Variable par, die ja nur innerhalb der Funktion f existiert, entfernt. Wenn jetzt nach einer Sekunde f(par) zu zweiten mal starten will, ist par also unbekannt.

          var par = 42; // jetzt global!

          function f() {
            setTimeout("f()",1000) ;
          }

          und erster Aufruf mit:

          f();

          würde dagegen funktionieren.

          Gruß, Jürgen

          1. hi,

            function f(par) {
              setTimeout("f(par)",1000) ;
            }

            und erster Aufruf mit:
            f(42);

            Durch den ersten Aufruf erhält par den Wert 42. Beim Ende der Funktion wird die Variable par, die ja nur innerhalb der Funktion f existiert, entfernt. Wenn jetzt nach einer Sekunde f(par) zu zweiten mal starten will, ist par also unbekannt.

            und warum gibst du den wert dann nicht beim "zweiten aufruf", über setTimeout, wiederum als parameter mit?

            gruß,
            wahsaga

            --
            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
            1. Hallo,

              und warum gibst du den wert dann nicht beim "zweiten aufruf", über setTimeout, wiederum als parameter mit?

              ich hab mich wohl unklar ausgedrückt, der zweite Aufruf ist der, den das setTimeout ausgelöst hat.

              Gruß, Jürgen

              1. hi,

                und warum gibst du den wert dann nicht beim "zweiten aufruf", über setTimeout, wiederum als parameter mit?

                ich hab mich wohl unklar ausgedrückt, der zweite Aufruf ist der, den das setTimeout ausgelöst hat.

                und habe ich mich etwa ebenfalls undeutlich ausgedrückt, oder warum gibst du auf die frage, warum du bei _eben diesem_ aufruf über setTimeout den parameter nicht erneut übergibst, keine konkrete antwort?

                gruß,
                wahsaga

                --
                "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                1. Hallo,

                  hi,

                  und warum gibst du den wert dann nicht beim "zweiten aufruf", über setTimeout, wiederum als parameter mit?

                  ich hab mich wohl unklar ausgedrückt, der zweite Aufruf ist der, den das setTimeout ausgelöst hat.

                  und habe ich mich etwa ebenfalls undeutlich ausgedrückt, oder warum gibst du auf die frage, warum du bei _eben diesem_ aufruf über setTimeout den parameter nicht erneut übergibst, keine konkrete antwort?

                  weil ich an die die Lösung von  molily garnicht gedacht habe, sie für recht kompliziert halte und in diesem Fall der Weg über die globale Variable der bessere ist, wie ja molily auch schon schrieb.

                  Gruß, Jürgen

                  PS: An Stelle des Ratespiels hättest Du Deine Ideen auch wie Molily sofort schreiben können. Ich bin hier nicht der Frager, ich wollte nur mit einem einfachen Ansatz helfen.

                  PPS Eine Idee zu https://forum.selfhtml.org/?t=100370&m=615026?

          2. Hallo,

            Ah, Verzeihung, kleines Missverständnis. Der erste Parameter von setTimeout wird nach Ablauf der Zeit tatsächlich im globalen Kontext mit eval() ausgeführt. Das ist bei einfachen Werten wie String und Number aber nicht schlimm, die bettet man einfach in den String ein. Da hier im Grunde nur Strings nötig sind, kann man diesen Weg gehen: window.setTimeout("f('" + objId + "', '" + objClr + "')", 1000); Der Code ist dann im globalen Scope lauffähig.
            Wenn man mit anderen Objekten arbeitet, kann man auch so arbeiten:
            window.setTimeout(f, 1000, objekt1, objekt2, ...);
            Das gibt es seit JavaScript 1.2, aber MSIE 6 kann es leider immer noch nicht.
            Angesichts dessen kann man zurecht darüber nachdenken, getElementById nicht immer wieder auszuführen, sondern die Referenzen in einer globalen Variable zu speichern. Wenn zudem eine globale Status-Variable ausreicht und alle Elemente synchron blinken, braucht man wie in deinem Beispiel freilich keine Parameter übergeben.

            Mathias