Ciao a tutti
sto studiando un'animazione DHTML di una farfalla che volteggia nel canvas del browser (l'animazione non è mia ma potete scaricarla a http://www.chalcedony.com/javascript), e ho provato ad inserire dei pulsanti per attivare/fermare l'animazione.
<code><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Butterfly</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css">
<script type="text/javascript" language="Javascript">
<!-- Hide script from older browsers
firstTime = true
var attesaTimer = 20
var idTimer
if (document.getElementById) {
stdBrowser = true
}
else {
stdBrowser = false
}
function moveIt() {
if (firstTime) {
if (stdBrowser) {
moverObj = document.getElementById("mover").style
moverObj.top = "5px"
moverObj.left = "5px"
}
if (document.all) {
maxHeight = document.body.clientHeight-40
maxWidth = document.body.clientWidth-40
}
else {
maxHeight = window.innerHeight-40
maxWidth = window.innerWidth-40
}
firstTime = false
}
if (stdBrowser) {
topPos = parseInt(moverObj.top)
leftPos = parseInt(moverObj.left)
}
else {
topPos = document.mover.top
leftPos = document.mover.left
}
chgXBy = Math.floor(Math.random() * 10)
if ((halfChance() || topPos >= maxHeight) && topPos > 5) {
topPos -= chgXBy
}
else {
topPos += chgXBy
}
chgYBy = Math.floor(Math.random() * 10)
if ((halfChance() || leftPos >= maxWidth) && leftPos > 5) {
leftPos -= chgYBy
}
else {
leftPos += chgYBy
}
if (stdBrowser) {
moverObj.top = topPos + "px"
moverObj.left = leftPos + "px"
}
else {
document.mover.top = topPos
document.mover.left = leftPos
}
idTimer = setTimeout("moveIt()",attesaTimer)
}
function halfChance() {
if (Math.random() < .5) {
return true
}
return false
}
function Ferma() { clearTimeout(idTimer) }
// End hiding script -->
</script>
<style type="text/css">
<!--
#mover {position: absolute; left: 5px; top: 5px;}
-->
</style>
</head>
<body onload="moveIt()" lang="it">
<div id="mover">
[img]img/butterfly.gif[/img]
</div>
<div id="centroPagina">
<form name="fermaAnim">
<input type=button value="Ferma l'animazione" onclick="javascript:stdBrowser=false;Ferma()" />
<input type=button value="Riattiva l'animazione" onclick="javascript:stdBrowser=true;moveIt()" />
</form>
</div>
</body>
</html>
</code>
Se cliccco per fermare l'animazione si ferma, se clicco per farla ripartire, riparte ma se clicco per riavviarla senza averla fermata essa accelera.
Quindi mi chiedo: dopo il primo riavvio senza aver fermato, quante istanze di funzione restano in memoria? a me sembra 2. Infatti il delay del timeout diminuisce e l'animazione accelera.
Allora ho risolto impostando il timeout a zero tramite variabile e imponendo una condizione:
<script type="text/javascript" language="Javascript">
<!-- Hide script from older browsers
firstTime = true
var attesaTimer = 20
var idTimer
if (document.getElementById) {
stdBrowser = true
}
else {
stdBrowser = false
}
function moveIt() {
if (firstTime) {
if (stdBrowser) {
moverObj = document.getElementById("mover").style
moverObj.top = "5px"
moverObj.left = "5px"
}
if (document.all) {
maxHeight = document.body.clientHeight-40
maxWidth = document.body.clientWidth-40
}
else {
maxHeight = window.innerHeight-40
maxWidth = window.innerWidth-40
}
firstTime = false
}
if (stdBrowser) {
topPos = parseInt(moverObj.top)
leftPos = parseInt(moverObj.left)
}
else {
topPos = document.mover.top
leftPos = document.mover.left
}
chgXBy = Math.floor(Math.random() * 10)
if ((halfChance() || topPos >= maxHeight) && topPos > 5) {
topPos -= chgXBy
}
else {
topPos += chgXBy
}
chgYBy = Math.floor(Math.random() * 10)
if ((halfChance() || leftPos >= maxWidth) && leftPos > 5) {
leftPos -= chgYBy
}
else {
leftPos += chgYBy
}
if (stdBrowser) {
moverObj.top = topPos + "px"
moverObj.left = leftPos + "px"
}
else {
document.mover.top = topPos
document.mover.left = leftPos
}
idTimer = setTimeout("moveIt()",attesaTimer)
}
function halfChance() {
if (Math.random() < .5) {
return true
}
return false
}
function Ferma() { idTimer=0 }
// End hiding script -->
</script>
<style type="text/css">
<!--
#mover {position: absolute; left: 5px; top: 5px;}
-->
</style>
</head>
<body onload="moveIt()" lang="it">
<div id="mover">
[img]img/butterfly.gif[/img]
</div>
<div id="centroPagina">
<form name="fermaAnim">
<input type=button value="Ferma l'animazione" onclick="javascript:stdBrowser=false;Ferma()" />
<input type=button value="Riattiva l'animazione" onclick="if(idTimer==0){stdBrowser=true;moveIt()}" />
<input type=button value="mostra il valore di idTimer" onclick='alert("Il riferimento del timer è 0?: " + idTimer)' />
</form>
</div>
</body>
</html>
il metodo clearTimeout() (o clearInterval()) sembra non essere all'altezza.
Spiegatemi un po' se volete.
Mi spiace per la lunghezza del topic.
Ciao a3tius![]()
Io non ho messo il trattino in javascript ma appare da solo...(??? come mai?)