Geplagter: SetTimeout Problem

Moinz!

Folgender Code bereitet Probleme:

------- schnipp -------

function tuwas(obj, value)
{
   //irgendetwas mit obj anstellen
   setTimeout("tuwas(" + obj + ", " + value + ")", 1000);
}

<!-- irgendwo später im Quelltext -->

<img src="un/wich/tig.jpg" onClick="tuwas(this, this.width)">

<!-- und so weiter... -->

------- schnapp -------

Der erste Aufruf der Funktion tuwas() funktioniert fehlerfrei. Wenn sich tuwas aber mit setTimeout() selbst aufruft, wird die Variable obj, die das Bild präsentiert, nicht als Objekt übergeben, sondern als ein String mit dem Inhalt "[object HTMLImageElement]". Warum wird diesmal so ein String übergeben, obwohl weder obj noch value verändert wurden (nur ausgelesen)? Und was muss ich tun, damit ich in der Fuktion bei den weiteren Aufrufen auf obj wieder als Objekt zugreifen kann?

dagriets,
Geplagter

  1. Hi,

    setTimeout("tuwas(" + obj + ", " + value + ")", 1000);
    Warum wird diesmal so ein String übergeben,

    na, was meinst Du wohl, was die Anführungszeichen da machen? "tuwas("+obj usw. ist *garantiert* ein String.

    obwohl weder obj noch value verändert wurden (nur ausgelesen)?

    Ausgelesen und verworfen. Anschließend wird nur noch der String weiter verarbeitet, den Du unter Zuhilfename von obj und value erzeugt hast.

    Und was muss ich tun, damit ich in der Fuktion bei den weiteren Aufrufen auf obj wieder als Objekt zugreifen kann?

    Was hat Deine Recherche z.B. im Archiv dieses Forums ergeben?

    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. Und was muss ich tun, damit ich in der Fuktion bei den weiteren Aufrufen auf obj wieder als Objekt zugreifen kann?

      Was hat Deine Recherche z.B. im Archiv dieses Forums ergeben?

      Cheatah

      Nichts! Was soll denn diese überflüssige Frage?! Glaubst du ich würde hier posten ohne vorher zu Suchen und im Archiv zu gucken oder was??? <- so in etwa ist der Stil deiner Antworten...
      Naja schade, ich hab das Gefühl, als sei das Forum ein wenig zu "gut" für mich. Wenn man hier nicht _der_ HTML/JS/... Könner ist, bekommt man solche (indirekten) Antworten wie "Such im Archiv, irgendwo da ist schon irgendwas". Anstatt wenigstens einen kleinen Tipp zu geben, nach welchem Begriffen man suchen könnte...
      Naja, ich vermute, dass ich hier sowieso keine konstruktive Antwort bekommen werde, sondern wohl wegen meiner nicht vorhandenen Lernbereitschaft niedergemacht werde.
      Man sollte sich nicht wundern, wenn ihr *Profis* von Anfängern als arrogant angesehen werdet, weil ihr anstatt "das ist so und so, weil so und so, mehr Infos gibts da und da" immer mit einem "Bist du doof? Merkst du denn das und das nicht selber? Das ist doch offentlichtlich! Hast du auch schon alle 10 Manuals gelesen?"

      Genug geschrieben. Das ist verschwendete Zeit.

      1. Hallo,

        Anstatt wenigstens einen kleinen Tipp zu geben, nach welchem Begriffen man suchen könnte...

        Äh, das ist meistens recht naheliegend... Zum Beispiel mit setTimeout, Übergabe / übergeben und String kann man schon einiges finden, u.a. das, was ich dir gerade geschrieben habe.

        Mathias

        1. Hallo,

          Anstatt wenigstens einen kleinen Tipp zu geben, nach welchem Begriffen man suchen könnte...

          Äh, das ist meistens recht naheliegend... Zum Beispiel mit setTimeout, Übergabe / übergeben und String kann man schon einiges finden,

          Nope, ich habe nach "settimeout objekt übergeben" und "settimeout parameter" aber nix passendes gefunden.

          u.a. das, was ich dir gerade geschrieben habe.
          Mathias

          Sehr vorbildlich! Wenn alle Antworten auch nur halb so tollerant und freundlich beantwortet würden, dann gäbe es auch dieses "Programmierer und Administratoren sind alle arrogant" nicht. Leider gibt es Leute wie dich nicht sehr oft. (Zumindest nicht hier)
          Auf jedenfall bin ich dir sehr dankbar für deine Antwort.

          1. Auf jedenfall bin ich dir sehr dankbar für deine Antwort.

            Hab ich mir gedacht, deshalb habe ich mir mal die Freiheit genommen uns einen Beitrag an Deiner Stelle als Hilfreich bewertet. :D

  2. Hallo,

    setTimeout("tuwas(" + obj + ", " + value + ")", 1000);

    Wenn sich tuwas aber mit setTimeout() selbst aufruft, wird die Variable obj, die das Bild präsentiert, nicht als Objekt übergeben, sondern als ein String mit dem Inhalt "[object HTMLImageElement]". Warum wird diesmal so ein String übergeben

    Der Operator »+« verkettet Strings, wenn ein Operand ein String ist.
    Der andere Operand wird dann auch in einen String umgewandelt.
    Das heißt, wenn du »"String " + Objekt« notierst, dann wird das Objekt in einen String umgewandelt. Bei Elementobjekten kommt dann das genannte heraus. Damit lässt sich offensichtlich nichts anfangen, also kannst du diese Methode vergessen.

    Und was muss ich tun, damit ich in der Fuktion bei den weiteren Aufrufen auf obj wieder als Objekt zugreifen kann?

    Die Objekte nicht in Strings umwandeln.
    setTimeout kann auch eine Funktion als ersten Parameter annehmen. Das geht dann etwa so:

    window.setTimeout( function () { tuwas(obj, value); }, 1000);

    Diese anonyme, verschachtelte Funktion hat Zugriff auf die lokalen Variablen obj und value der tuwas-Funktion, in der sie notiert ist, auch wenn diese längst nicht mehr läuft. Das nennt sich Closure.

    Mathias