Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di a3tius
    Registrato dal
    Mar 2003
    Messaggi
    33

    clearTimeout è all'altezza?

    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?)

  2. #2
    Utente di HTML.it L'avatar di a3tius
    Registrato dal
    Mar 2003
    Messaggi
    33
    Credo di aver capito da solo il problema: nello script originale il timeout è impostato all'interno della stessa function e richiama la funzione che lo ospita. E' possibile, quindi, che si duplichi ogni volta un qualche valore, e che il browser tenga conto di entrambi?
    Comunque, io proverò a settare il timeout con una funzione esterna.
    E poi fermarlo con clearTimeout.
    Comunque mi sembra valido lo stesso il mio metodo, dato che risponde alla mia esigenza.
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.