Frage zu window.setTimeout() mit Parameterübergabe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Frage zu window.setTimeout() mit Parameterübergabe

    Hallo Leute,
    ich habe mich noch mal daran gemacht meine alten JavaScript Kenntnisse aufzufrischen. Dabei stieß ich in meinem Buch auf folgendes Beispielprogramm. welches einen Ticker anzeigt:

    Quellcode

    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    2. "http://www.w3.org/TR/html4/strict.dtd">
    3. <html lang="de">
    4. <head>
    5. <title>Ticker</title>
    6. <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    7. <style type="text/css">
    8. #ticker { position:absolute; top:10px; left:20px; color:#FF0000;
    9. font-family:Courier New,courier;
    10. font-size:15px; font-weight:bold; white-space:nowrap; }
    11. #page { position:absolute; top:50px; left:20px; right:20px; }
    12. </style>
    13. <script type="text/javascript">
    14. var text_now = "";
    15. var chars = 0;
    16. var effect = "rtl";
    17. function fill(n) {
    18. var empty_chars = "";
    19. for(var i = 0; i < n; ++i)
    20. empty_chars += " ";
    21. return(empty_chars);
    22. }
    23. function show_ticker(text, delay) {
    24. if(effect == "rtl") {
    25. chars += 1;
    26. text_now = fill(text.length - chars);
    27. text_now += text.substring(0, chars);
    28. if(chars >= text.length) effect = "ltn";
    29. }
    30. else if(effect == "ltn") {
    31. chars -= 1;
    32. text_now =
    33. text.substring((text.length - chars),(text.length - 1));
    34. text_now += fill(text.length - chars);
    35. if(chars <= 0) effect = "rtl";
    36. }
    37. document.getElementById("ticker").innerHTML = text_now;
    38. window.setTimeout
    39. ("show_ticker('" + text + "', " + delay + ")", delay);
    40. }
    41. </script>
    42. </head>
    43. <body onload="show_ticker('+++ Was Sie schon immer über Blindtexte wissen wollten +++', 200)">
    44. <div id="ticker"></div>
    45. <div id="page">
    46. Ein Blindtext ist ein Text wie dieser hier.
    47. </div>
    48. </body>
    49. </html>
    Alles anzeigen

    Soweit verstehe ich es alles, aber was mir schon seit Stunden Kopfzerbrechen bereitet ist folgende Zeile:

    Quellcode

    1. window.setTimeout("show_ticker('" + text + "', " + delay + ")", delay);

    Also ich hätte es mit meinen Kenntnissen ja folgendermaßen gemacht:

    Quellcode

    1. window.setTimeout("show_ticker(text,delay)", delay);

    Nur läuft er bei meinem nur ein einziges Mal durch. Fehler meldet Firebug bei mir aber auch nicht.
    Also so wie ich das kenne rufe ich window.setTimeout auf. in den Klammern kommt ", dann der Funktionsaufruf, ", ein Komma und die Zeit, die gewartet werden soll.
    Und Funktionsaufrufe in Js kenne ich so: funktion(parameter1,parameter2).
    So wie ich das sehe müsste es dementsprechend so lauten:

    Quellcode

    1. window.setTimeout("funktion(parameter1,parameter2),4000)

    Alles was noch zusätzlich steht, also das + und die zusätzlichen ' verwirren mich ;-).
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • RE: Frage zu window.setTimeout() mit Parameterübergabe

    Hi
    der Unterschied ist ganz einfach.

    Quellcode

    1. window.setTimeout("show_ticker('" + text + "', " + delay + ")", delay);

    Hier wird einzig ein String zusammengebaut.. ohne dass später auf eine Variable zugegriffen wird.
    In delay Sekunden wird also folgender String ausgeführt show_ticker('peter', 500);

    Beispiel:

    Quellcode

    1. var x;
    2. x = "hallo";
    3. window.setTimeout("alert('"+x+"');", 1000);
    4. x = "hallo peter";

    Ausgabe: hallo

    Quellcode

    1. window.setTimeout("show_ticker(text,delay)", delay);

    Verwendest du diesen Code müssen die Variablen text und delay im globalen Scope definiert sein. Sobald du die Variablen änderst, sollte sich theoretisch auch der Aufruf ändern.
    Es wird also immer auf die Variable zugegriffen. In delay Sekunden wird also folgender String ausgeführt show_ticker(a, b);

    Beispiel:

    Quellcode

    1. var x;
    2. x = "hallo";
    3. window.setTimeout("alert(x);", 1000);
    4. x = "hallo peter";

    Ausgabe: hallo peter
  • Ok also ich glaube, jetzt habe ich es jetzt verstanden.
    Also "+x+" ist eine JS typische Syntax um auf gut Deutsch zu sagen, dass der Interpreter jetzt sofort die Werte einsetzen soll, statt sie später aus den Variablen lesen soll. Und das kann er im Ticker nicht mehr, da er nach

    Quellcode

    1. window.setTimeout
    2. ("show_ticker('" + text + "', " + delay + ")", delay);

    schon aus der Funktion spring und damit die als Parameter übergebenen Variablen auch nicht mehr lesbar sind.
    Und wenn ich jetzt damit richtig liege, könnte man rein theoretisch noch so viel code nach window.setTimeout schreiben, dass er mind. noch 2 Millisek. beschäftigt ist. Und dann müsste man auch nicht diese +x+ Konstruktion schreiben, sondern ganz normal nur x (vorrausgesetzt, dass x nicht mehr geändert wird). Hoffe mal, dass ich jetzt damit richtig liege :-).
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Also mittlerweile glaube ich, dass ich nur noch einen sehr schweren Denkfehler habe. Dass das + in JS (wie in vielen weiteren Sprachen auch) zum Konkatenieren benutzt wird, wusste ich eigentlich schon vorher. Aber zu dem Zeitpunkt konnte ich es mir nicht anders erklären, da ich keine abgeschlossenen Zeichenketten in

    Quellcode

    1. window.setTimeout
    2. ("show_ticker(' " + text + " ', " + delay + ")", delay);

    finden kann. Also ich beschreib dir jetzt mal, was ich so sehe:
    1. Zeichenkette geht von showticker( bis zum 2. Komma.
    2. Zeichenkette geht von der 2. Klammer bis vors 1. Komma.
    3. Zeichenkette geht von vor dem ersten + bis hinter das 2. +.
    4. Zeichenkette geht von vor dem 3. + bis hinter das 4. +.

    Sry, ich hab mich bemüht ein bisschen Struktur rein zu bringen, aber hat nicht so wirklich funktioniert. Ist auch irgendwie nicht so einfach Strings zu beschreiben :D.

    Aber wenn man jetzt nach deinen Antworten geht, werden 2 oder mehr Strings miteinander verbunden. Aber ich sehe vor keinem der plusse einen abgeschlossenen String, den man mit einem anderen verbinden könnte.

    //EDIT:
    ICh denke ich habe es jetzt verstandne. Es lag wohl wirklich hauptsächlich daran, dass ich die " und ' falsch interpretiert habe. Jetzt ergibt alles auch einen Sinn. Danke schön für deine Hilfe.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Deadman44 ()