Strangest: Merkwürdigster Fehler seit Beginn meiner Lehrzeit

Hallo, noch nie war ich so am verzweifeln. Bitte um Hilfe.

Ich habe eine Art Fehlermeldung entworfen, die am oberen Bildschirmrand platziert wird, grob: ein div mit height:40px; width:100%. Diese möchte ich mittels JS ausblenden. Dazu habe mir eine kleine JS-Funktion geschrieben, die die Meldung rauszieht, indem sie den margin-top auf negative Werte verändert.

Diese Funktion ist eingebettet in das Template für die Fehlermeldung.

Um die Funktion flexibler zu machen, wollte ich die ID des divs der Funktion übergeben. Das Problem: die übergebene id wird bei jedem Aufruf (die Funktion ist selbstaufrufend) verändert. Und das noch merkwürdigere: mal um eins nach oben und dann für jeden weiteren Aufruf gleichbleibend und mal um eins nach unten und dann für jeden weiteren Aufruf gleichbleibend.

Hier das Template:

<script type="text/javascript">  
var it = 0;  
  
function movebox(irgendeineboxid){  
  
  alert(irgendeineboxid);  
  document.getElementById("box").style.marginTop = it + "px";  
  document.getElementById("box").style.marginTop = it + "px";  
  
  // verändere oberen margin. zu Testzwecken minus 5 statt minus 1  
  it = it - 5;  
  
  if( it < -45){  
    document.getElementById("box").style.display = "none";  
  } else window.setTimeout( 'movebox('+irgendeineboxid+')', 10 );  
}  
</script>
<div id="box" style="width:100%; font-size:14px;height:40px; color:#<777777; background-color:#fbf7dd;">  
  <div style="margin:4px 20px;float:left;">  
    Notice: <!--title--><br>  
    <span style="color:#515151; font-size:10px;"><!--desc--></span>  
  </div>  
  <div style="margin:10px 20px;">  
    <a href="javascript:movebox('<!--mid-->')">Close</a>  
  </div>  
</div>

Ich habe die Id jetzt erstmal auf "box" gesetzt. Aber mit alert(irgendeineboxid) erhalte ich dann ausgaben wie

13237768289858591
13237768289858592
13237768289858592
13237768289858592
13237768289858592
(...)

oder (seltener mit dem Fall minus 1)

13237769196884441
13237769196884440
13237769196884440
13237769196884440
13237769196884440
(...)

Ich habe keine Ahnung, ob ich den Verlauf einer Variablen mit firebug (was ich besitze) verfolgen kann.

Die Kommentare in dem Template sind die Platzhalter, die mittels php gefüllt werden. Bspw. ist <!--title--> der Titel der Nachricht, <!--mid--> die übergebene Id des divs. Die jeweils erste id, die durch das alert ausgegeben wird, entspricht der php-generierten.
Das Template wird nur einmal durch den Parser gezogen.

Bitte um Hilfe. Ich weiß nicht, wie ich weitermachen soll.

  1. Hi,

    } else window.setTimeout( 'movebox('+irgendeineboxid+')', 10 );

    wie lautet effektiv der String, den Du hier implizit mit eval() ausführen lässt?

    Tipp: Verwende window.setTimeout *nie* mit Strings. Erzeuge immer Funktionen, egal ob benannte, anonyme, Closures und was es noch so alles gibt.

    Ich habe die Id jetzt erstmal auf "box" gesetzt.
        <a href="javascript:movebox('<!--mid-->')">Close</a>

    Durch das Verwenden einer URL hast Du den Kontext auf das window gesetzt. Du willst hier gar nichts verlinken, also verwende auch einfach keinen Link - jedes beliebige Element kann einen onclick-Handler aufnehmen.

    Übrigens hat Deine Box nicht id="&lt;!--mid--&gt;". Das ist auch gut so, die ID wäre nicht gültig.

    Die Kommentare in dem Template sind die Platzhalter, die mittels php gefüllt werden.

    Serverseitige Techniken spielen für clientseitige Probleme keine Rolle. Sie zu betrachten, kann das Problem bis zur Unkenntlichkeit verstümmeln. Eliminiere *IMMER* bei *JEDEM* clientseitigen Problem zunächst *ALLES* Serverseitige.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo und vielen Dank schonmal.

      Habe jetzt alles serverseitige weggelassen und es geht immer noch nicht.

      } else window.setTimeout( 'movebox('+irgendeineboxid+')', 10 );

      wie lautet effektiv der String, den Du hier implizit mit eval() ausführen lässt?

      Ich weiß nicht, wie ich eval hier benutzen soll.
      Versucht unter anderem:
       window.setTimeout(eval("movebox("+boxid+")"), 10);

      Tipp: Verwende window.setTimeout *nie* mit Strings. Erzeuge immer Funktionen, egal ob benannte, anonyme, Closures und was es noch so alles gibt.

      movebox() ist doch eine Funktion?!

      Und <http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout@title=im Handbuch steht, dass ich Parameter verwenden> darf. Mit einem Zusatz den ich btw nicht verstehe. "Berücksichtigen Sie dabei, dass lokale Variable dann nicht mehr zur Verfügung stehen. Eine Übergabe der Werte mittels Zeichenkettenverknüpfung ist jedoch jederzeit möglich." Darf ich lokale Variablen da rein tun?

      Ich habe die Id jetzt erstmal auf "box" gesetzt.
          <a href="javascript:movebox('<!--mid-->')">Close</a>

      Durch das Verwenden einer URL hast Du den Kontext auf das window gesetzt. Du willst hier gar nichts verlinken, also verwende auch einfach keinen Link - jedes beliebige Element kann einen onclick-Handler aufnehmen.

      Ok, aber a) verwenden tausend Beispiele im Manual das so und b) ist dann das Layout anders... :(

      Übrigens hat Deine Box nicht id="&lt;!--mid--&gt;". Das ist auch gut so, die ID wäre nicht gültig.

      Ich weiß. Da ich (weil dies nicht funktionierte) erstmal id="box" eintrug (ebenso bei getElementById("box"). Später kommt dann allerdings ins Template wieder id="<!--mid-->". Ob das Template gültig ist, _bevor_ es durch den Parser geht, ist nicht wichtig.

      Serverseitige Techniken spielen für clientseitige Probleme keine Rolle. Sie zu betrachten, kann das Problem bis zur Unkenntlichkeit verstümmeln. Eliminiere *IMMER* bei *JEDEM* clientseitigen Problem zunächst *ALLES* Serverseitige.

      Getan. Vielleicht kannst Du Dir ja nochmal das online-Beispiel ansehen. Wenn Du Firebug verwendest, siehst Du in der Konsole den Wert für die ID, und den Fehler.

      1. Hallo,

        Ich weiß nicht, wie ich eval hier benutzen soll.
        Versucht unter anderem:
        window.setTimeout(eval("movebox("+boxid+")"), 10);

        Tipp: Verwende window.setTimeout *nie* mit Strings. Erzeuge immer Funktionen, egal ob benannte, anonyme, Closures und was es noch so alles gibt.

        movebox() ist doch eine Funktion?!

        Schau Dir doch mal den Fachartikel an, dann wirst Du es verstehen. Mir hat es sehr geholfen.

        VG

      2. Hi,

        wie lautet effektiv der String, den Du hier implizit mit eval() ausführen lässt?
        Ich weiß nicht, wie ich eval hier benutzen soll.

        Du tust es schon.

        Tipp: Verwende window.setTimeout *nie* mit Strings. Erzeuge immer Funktionen, egal ob benannte, anonyme, Closures und was es noch so alles gibt.
        movebox() ist doch eine Funktion?!

        movebox() ist eine Funktion. 'movebox()' ist ein String. Ein String ist keine Funktion. Um einen String als Funktion zu betrachten, ist die JS-Engine genötigt, eval() zu verwenden.

        Und <http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout@title=im Handbuch steht, dass ich Parameter verwenden> darf. Mit einem Zusatz den ich btw nicht verstehe. "Berücksichtigen Sie dabei, dass lokale Variable dann nicht mehr zur Verfügung stehen. Eine Übergabe der Werte mittels Zeichenkettenverknüpfung ist jedoch jederzeit möglich." Darf ich lokale Variablen da rein tun?

        Beschäftige Dich mit Closures.

        Ok, aber a) verwenden tausend Beispiele im Manual das so

        "Millionen von Fliegen können nicht irren"? Falsch! Richtig ist: Millionen von Irren können nicht fliegen.

        und b) ist dann das Layout anders... :(

        Und das bisschen benötigte CSS ist Raketenwissenschaft, weil ...?

        Ich weiß. Da ich (weil dies nicht funktionierte) erstmal id="box" eintrug (ebenso bei getElementById("box"). Später kommt dann allerdings ins Template wieder id="<!--mid-->". Ob das Template gültig ist, _bevor_ es durch den Parser geht, ist nicht wichtig.

        *Der Code* ist nicht wichtig, bevor er durch den Parser ging. Du hast ein *client*seitiges Problem, kein serverseitiges. Serverseitigen Code zu posten, kann Dich die Lösung kosten; statt dessen den clientseitigen Code heraus zu suchen kostet Dich, wenn überhaupt, ein paar Sekunden.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    Hallo, noch nie war ich so am verzweifeln. Bitte um Hilfe.

    Fehler 1: Du verwendest Zahlen als ID.
    Fehler 2: Du verwendest sehr große Zahlen. Größer als die verfügbare Genauigkeit.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Fehler 1: Du verwendest Zahlen als ID.
      Fehler 2: Du verwendest sehr große Zahlen. Größer als die verfügbare Genauigkeit.

      Juti. Also sollte es so gehen.

      Also waren die Probleme:

      a) Zahlen als ID verwendet
      b) setTimeout mit String verwendet (was man nicht machen darf[*])

      [*] "darf" ist ja auch gut. Irgendwie funktioniert es, aber eben falsch.

      Könnte man nicht noch den Eintrag im Handbuch etwas erweitern, um die Angabe, wie man sich bei Parametern verhalten soll? Mir hat jetzt nur ein ehemaliges Posting weitergeholfen.

      Vielen Dank für alle Hilfestellung!

      1. Hallo,

        Könnte man nicht noch den Eintrag im Handbuch etwas erweitern, um die Angabe, wie man sich bei Parametern verhalten soll? Mir hat jetzt nur ein ehemaliges Posting weitergeholfen.

        SELFHTML ist generell veraltet und wird nicht weiterentwickelt. Verwende für JavaScript das MDN oder – wenn du schon fortgeschritten bist – gleich die HTML5-/DOM-Dokumentationen bzw. die ECMAScript-Spezifikation.

        SELFHTML wird als Wiki weiterentwickelt, die Seite zu setTimeout erwähnt zwar Funktionen als ersten Parameter, es geht aber nicht so deutlich daraus hervor, dass der erste Parameter entweder ein Code-String oder ein Funktionsobjekt sein kann.

        Mathias