IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Comportement �trange de setTimeout(), il "m�morise" les �v�nements


Sujet :

JavaScript

  1. #1
    Membre �prouv� Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par d�faut Comportement �trange de setTimeout(), il "m�morise" les �v�nements
    Bonjour � tous,

    J'ai une appli Web qui permet de faire d�filer des contenus ("Steps") de la mani�re d'un diaporama.
    Il y a 2 modes de d�filement des steps: Auto (un temps est d�fini pour chaque step) et manuel (clic sur un bouton).

    Voici le probl�me (l'incoh�rence n'apparait que sous IE):
    L'appli d�marre en mode auto, les temps d'affichage des steps sont bien respect�s.
    Passons au mode manuel et naviguons... Lorsqu'on revient au mode proc�dure, les steps s'encha�nent � la m�me vitesse que celle � laquelle on les a fait d�filer dans le mode manuel. Le setTimeout() est compl�tement perturb�.
    J'ai essay� des clearTimeOut() � gogo, mais rien n'y fait.

    J'ai isol� le cas de figure dans un exemple simple et autonome:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <html><head><title>TEST</title>
    <script type="text/javascript">
    	var tab = new Array(5, 1, 3, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5); // Tableau du temps d'affichage de chaque Step
    	var idx = 0; // Index de l'étape en cours
    	var modeDefilAuto = true; // Mode de défilemnet actuel (auto/manuel)
     
    	function afficheStep() { // Affiche le step de l'idx en cours
    		document.getElementById("divMain").innerHTML = "Etape: "+idx+" ("+tab[idx]+" sec)<br />Défilement Auto: "+modeDefilAuto
    			+".<script language='javascript'>setTimeout('faireNext();', "+(tab[idx] * 1000)+");<\/script>";
    		for (var i=0; i<document.getElementById("divMain").getElementsByTagName("script").length; i++) { // Boucle pour que le javascript injecté soit interpreté
    			eval(document.getElementById("divMain").getElementsByTagName("script")[i].innerHTML);
            }
    	}
     
    	function changeMode() { // Passe du mode auto au mode manuel et inversement
    		modeDefilAuto = ! modeDefilAuto;
    		idx = 0;
    		afficheStep();
    	}
     
    	function nextStep() { // Passe au step suivant
    		if (idx<12) {
    			idx++;
    			afficheStep();
    		}
    	}
     
    	function faireNext() {
    		if (modeDefilAuto) {
    			nextStep(); 
    		}
    	}
    </script>
    </head><body onLoad="afficheStep();">
    <center>
    <br />
    <div id="divMain" style="background-color:#CCCCCC;">Principal</div><br />
    <input type="button" value="Step suivant" onClick="nextStep();" />
    <input type="button" value="Changer de mode" onClick="changeMode();" />
    </center>
    </body></html>
    Pouvez vous me donner une explication ?

    Merci d'avance.

  2. #2
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    afin de pouvoir faire un clearTimeout, il faudrait que le setTimeout soit attribu� � une variable
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    var running=setTimeout( ...)
    clearTimeout(running)
    parcontre ta fa�on de lancer le setTimeout est plus que curieuse
    pourquoi le faire en injectant une balise script ????
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  3. #3
    Membre �prouv� Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par d�faut
    Bonjour SpaceFrog,

    Merci pour votre rapidit�.

    C'est un peu compliqu�... En fait, mon appli est en jQuery+PHP.
    En ajax, je met le code javascript dans le DIV depuis un script PHP pour ne pas avoir � rafraichir la page.
    J'ai voulu reproduire le cas en Javascript pur le plus fid�lement possible pour bien identifier le probl�me, voir si �a ne venait pas d'autre chose.

    Sinon, le clearTimeout ne donne rien non plus:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <html><head><title>TEST</title>
    <script type="text/javascript">
    	var tab = new Array(5, 1, 3, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5); // Tableau du temps d'affichage de chaque Step
    	var idx = 0; // Index du step en cours
    	var modeDefilAuto = true; // Mode de défilement actuel (auto/manuel)
    	var tmr = null;
     
    	function afficheStep() { // Affiche le step de l'idx en cours
    		document.getElementById("divMain").innerHTML = "Etape: "+idx+" ("+tab[idx]+" sec)<br />Défilement Auto: "+modeDefilAuto
    			+".<script language='javascript'>tmr=setTimeout('faireNext();', "+(tab[idx] * 1000)+");<\/script>";
    		for (var i=0; i<document.getElementById("divMain").getElementsByTagName("script").length; i++) { // Boucle pour que le javascript injecté soit interpreté
    			eval(document.getElementById("divMain").getElementsByTagName("script")[i].innerHTML);
            }
    	}
     
    	function changeMode() { // Passe du mode auto au mode manuel et inversement
    		//tmr = null;
    		clearTimeout(tmr);
    		modeDefilAuto = ! modeDefilAuto;
    		idx = 0;
    		afficheStep();
    	}
     
    	function nextStep() { // Passe au step suivant
    		if (idx<12) {
    			idx++;
    			afficheStep();
    		}
    	}
     
    	function faireNext() {
    		if (modeDefilAuto) {
    			nextStep(); 
    		}
    	}
    </script>
    </head><body onLoad="afficheStep();">
    <center>
    <br />
    <div id="divMain" style="background-color:#CCCCCC;">Principal</div><br />
    <input type="button" value="Step suivant" onClick="nextStep();" />
    <input type="button" value="Changer de mode" onClick="changeMode();" />
    </center>
    </body></html>

  4. #4
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    essaye avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    <script language='javascript'>window.tmr=setTimeout('faireNext();', "+(tab[idx] * 1000)+");<\/script>
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  5. #5
    Membre �prouv� Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par d�faut
    J'ai trouv�:

    Il faut faire un clearTimeout() avant chaque setTimeout().
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    <script language='javascript'>clearTimeout(tmr);tmr=setTimeout('faireNext();', "+(tab[idx] * 1000)+");<\/script>
    Pffff, je suis dessus depuis ce matin quand m�me !
    Une preuve de plus que FireFox appr�hende mieux le JavaScript que IE...

    Merci pour le coup de main SpaceFrog.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Syst�me][Runtime][Exec] Comportement �trange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    R�ponses: 1
    Dernier message: 06/06/2004, 09h54
  2. R�ponses: 2
    Dernier message: 22/09/2003, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo