Objektproblem

JavaScript

3 svar · 186 visningar · startad av Andy

Medlem sedan sep. 2001138 inlägg
Trådstart#1

Halloj

Tänkte lära mig att göra egna objekt lite bättre.
Har en div på en sida som symboliserar solen. Runt denna cirkulerar en annan div som skall föreställa jorden, som i sin tur har en div som symboliserar månen kretsande omkring sig. Får det dock inte att fungera med både jorden och månen cirkulerande på samma gång. Vad gör jag för fel?

<html>
<head>
<title></title>

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
function planet(planetName,parentPlanet,radie) {
	this.planetName = planetName
	this.parentPlanet = parentPlanet
	this.radie = radie
	this.vinkel = 0
}

function init(obj,parentPlanet,radie) {
	obj = new planet(obj,parentPlanet,radie)
	animate(obj);
}

function animate(obj) {
	x = Math.round((Math.cos(obj.vinkel * Math.PI/180) * obj.radie)) + parseInt(document.all(obj.parentPlanet).style.left);
	y = Math.round((Math.sin(obj.vinkel * Math.PI/180) * obj.radie)) + parseInt(document.all(obj.parentPlanet).style.top);
	document.all(obj.planetName).style.left = x
	document.all(obj.planetName).style.top = y
	obj.vinkel = (obj.vinkel == 360) ? 1 : obj.vinkel + 2;
	newObj = obj
	obj.timeout = setTimeout('animate(newObj)', 1);
}
</SCRIPT>

</head>

<body onLoad="init('earth','sun',100); init('moon','earth',50);">

<div id="moon" style="position:absolute; top:0px; left:0px;">Moon</div>

<div id="earth" style="position:absolute; top:0px; left:0px;">Earth</div>

<div id="sun" style="position:absolute; top:300px; left:400px;">Sun</div>

</body>

</html>
Medlem sedan juni 20004 308 inlägg
#2

Utan att testa så säger jag att felet ligger i din setTimeout. När den aktiveras körs detta;

animate(newObj)

Vad är då newObj? Jo, det är sen senaste tilldelningen som sker i föregående körning av funktionen animate(), och eftersom det är samma funktion som anropas från init() varje gång du skapar ett nytt objekt vet du inte vilket objekt som senast kördes. Resultatet av scriptet blir således ovisst. Antagligen pannkaka vilket det brukar bli när något kan bli fel ;)

Medlem sedan sep. 2001138 inlägg
#3

Misstänkte själv att det var där problemet låg. Hur löser jag det då?

Medlem sedan juni 20004 308 inlägg
#4

Du kan ex. skicka med namnet på objektet istället för själva objektet och sedan använda eval för att plocka fram det.

Exempel:

var foo="En sträng.";
var bar=eval('foo');
alert(bar);
266 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)