Mc Kad: Variablen mit setTimeout an sich selbst übergeben.

Hi, ich versuche mich gerade mal ein bisschen an Javascript und habe volgendes Problem.
Ich habe eine Funktion (function_move) und lasse diese mit "setTimeout" sich wieder selbst aufrufen.
Bis jetzt noch kein Problem, ich möchte dammit jetzt eine Bilddatei bewegen, das hat soweit auch funktioniert, allerdings sobald ich die id der bilddatei und die zielkoordinaten an die funktion sende und die dann die Variablen an sich selbst übergeben soll versagt das script und gibt auch keine Fehlermeldeunge aus (IE und in der FF Fehlerconsole).
Eine möglichkeit wäre die variablen vor der funktion zu erstellen, aber ich möchte gerne später verschiedene grafiken dammit steuern können.

Hier mein Quelltext:

function function_move(mover,zielx,ziely){  
if (zielx-32!=mover.style.left.replace('px','')-1+1)  
{  
		if(mover.src!=redford_001_right.src)  
		{  
			mover.src=redford_001_right.src;  
		}  
		mover.style.left=mover.style.left.replace('px','')-1+2+'px';  
		  
		window.setTimeout ('function_move(mover,zielx,ziely)', 31.25);  
	}  
	else if (ziely-64!=mover.style.top.replace('px','')-1+1)  
	{  
		if(mover.src!=redford_001_front.src)  
		{  
			mover.src=redford_001_front.src;  
		}  
		mover.style.top=mover.style.top.replace('px','')-1+2+'px';  
		window.setTimeout ('function_move(mover,zielx,ziely)', 31.25);  
	}  
}

Ps. das mit dem replace('px','')-1+2+'px' habe ich gemacht weil er das sonst als text anerkennt und die zahl net berrechnet und wenn ich das px ganz raus lasse rafft mein FF das nicht.

Vielen Dank schon einmal im Vorraus.

  1. Hi, ich versuche mich gerade mal ein bisschen an Javascript und habe volgendes Problem.
    Ich habe eine Funktion (function_move) und lasse diese mit "setTimeout" sich wieder selbst aufrufen.
    Bis jetzt noch kein Problem, ich möchte dammit jetzt eine Bilddatei bewegen, das hat soweit auch funktioniert, allerdings sobald ich die id der bilddatei und die zielkoordinaten an die funktion sende und die dann die Variablen an sich selbst übergeben soll versagt das script und gibt auch keine Fehlermeldeunge aus (IE und in der FF Fehlerconsole).

    Das glaube ich nicht, so wie du es uns gezeigt hast, erzeugt das Skript einen Fehler, da du so dem Timeout kein Objekt übergeben kannst (mover).

    Eine Möglichkeit ist diese Timer Funktion.

    Ps. das mit dem replace('px','')-1+2+'px' habe ich gemacht weil er das sonst als text anerkennt und die zahl net berrechnet und wenn ich das px ganz raus lasse rafft mein FF das nicht.

    Aus style.eigenschaft kannst du immer nur auslesen, was entweder direkt im HTML Tag angegeben wurde oder du mit JS gesetzt hast, wenn du die wirkliche Position ermitteln willst musst du offsetLeft/Top des Elementes plus offsetLeft/Top der Elternelemente ermitteln.

    Struppi.

  2. Ps. das mit dem replace('px','')-1+2+'px'

    kann eleganter mit http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#parse_int@title=parseInt() gelöst werden

  3. function function_move(mover,zielx,ziely){
    window.setTimeout ('function_move(mover,zielx,ziely)', 31.25);

    Der Code, den man setTimeout übergibt, wird im globalen Kontext ausgeführt.
    mover, zielx und ziely sind hier jedoch lokale Funktionsvariablen. Sie werden auf diese Weise nicht »gerettet« und übergeben, sondern gehen verloren. Als Abhilfe kann man:

    • Eine Closure-Funktion erzeugen, die die lokalen Variablen einschließt und konserviert und sie bei der Ausführung wieder an function_move übergibt. Da wir diese Closure nicht unter einem Namen speichern müssen, notieren wir sie als namenlosen Funktionsausdruck:

    window.setTimeout(function () {
       function_move(mover, zielx, ziely);
    }, 31)

    • setTimeout nimmt einen dritten, vierten bis n-ten Parameter entgegen, in denen der Funktion Parameter übergeben werden können. Als ersten Parameter übergibt man das Funktionsobjekt (nicht als String):

    window.setTimeout(function_move, 31, mover, zielx, ziely);

    Diese Aufrufweise wird allerdings nicht vom Internet Explorer unterstützt.

    Es gäbe noch viele weitere Möglichkeiten, die Variablen der Funktion zur Verfügung zu stellen, z.B. ein eigenes Objekt, bei dem move eine Methode ist.

    Mathias

    1. Vielen Dank, es Funktioniert :-D