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 :

Gestion de timers setTimeout /clearTimeout


Sujet :

JavaScript

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 2
    Par défaut Gestion de timers setTimeout /clearTimeout
    Bonjour à tous.

    Avant de vous exposer le problème que je rencontre (je suis malheureusement très mauvais en js), voici le bout de code en question:

    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
    <div id="contactor">
    <center>
    <span class="soustitre">message 1.</span><br />
    </center>
    <SCRIPT LANGUAGE="JavaScript">
     document.write('<form action="index.php?page=presentation" method="post">');
     var text = '<center><br /><span class="soustitre">message 2.</span><br /></center>';
     var text2 = '<center><br /><span class="soustitre">message 3.</span><br /></center>';
     var text3 = '<center><br /><span class="soustitre">message 4.</span><br /></center>';
     var textvalider = '<center><br /><br /><input type="submit" value="Valider" /><br /></center>';
     var textfin = '<center><br /><span class="soustitre">fin</span><br /></center>';
     function affiche_texte(texte){
       document.getElementById('contactor').innerHTML += texte;
     }
     var timer = setTimeout(function() { affiche_texte(text) },67000);
     timer = setTimeout(function() { affiche_texte(text2) },132000);
     timer = setTimeout(function() { affiche_texte(text3) },199000);
     timer = window.setTimeout(function() { affiche_texte(textvalider) },275000);
     timer = setTimeout(function() { affiche_texte(textfin) },280000);
     clearTimeout(timer);
     </SCRIPT> 
    </div>

    Voilà le problème: avec ce code, tous les messages s'affichent progressivement les uns à la suite des autres (selon le chrono que je leur ai affecté à chacun), jusqu'au 5ème à savoir le fameux "valider"...
    Par contre le message "fin", lui ne s'affiche jamais. De plus, et c'est le plus grave, le compteur timer (qui permet d'afficher les messages selon leurs chronos) ne s'arrête jamais, et ce, malgré le clearTimeout (qui est censé détruire le compteur il m'avait semblé ?).

    En revanche, si je ne mets pas de clearTimeout tout s'affiche normalement... Le problème étant évidemment que le compteur continuera également à tourner (jusqu'à dévorer l'intégralité de la mémoire du pc ?? parce qu'à la vérité, la première fois je m'en étais pas rendu compte et deux ou trois jours plus tard, alors que je n'avais pas éteint mon ordinateur depuis, mon disque dur avait rétrécit de moitié... Donc je me pose la question)

    J'aimerais également que le timer se détruise automatiquement si on ferme la fenêtre du navigateur avant la fin du décompte... car dans le cas par exemple, où on ferme la fenêtre par inadvertance, ce serait ennuyant de laisser le compteur continuer à manger la mémoire (si tel est bien le cas ?).


    En tous cas, merci d'avance pour l'éclairage ou l'aide éventuelle que vous pourriez m'apporter.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Il semble que tu confondes beaucoup de choses et que tu aies un problème de conception.

    * Un setTimeout sert à lancer un traitement après un délai.
    Donc la chronologie de ton script, c'est d'abord déclarer une variable en lui affectant un setTimeout.
    Puis tu affectes à cette variable un autre setTimeout et ainsi de suite, mais tout ça avant que ces fonctions n'aient été lancées.
    Du coup, les setTimeout sont tous déclenchés, mais ta variable ne référence que le dernier (et au passage, ça doit un peu embrouiller le garbage collector...)
    Enfin, tu fais un clearTimeout de ta variable, donc sa dernière affectation est annulée (et seulement elle), c'est pour ça que le dernier message ne s'affiche pas.

    * Que crois-tu qu'il se passe une fois le délai expiré ?
    La fonction référencée se déclenche et le setTimeout est effacé. Ton clearTimeout n'a donc aucun intérêt à part de rendre inutile le dernier timer

    * Je ne vois pas par quel miracle un timer pourrait continuer à s'exécuter si tu fermes ton navigateur...

    * Il n'y a aucune raison pour qu'un setTimeout te mange de la mémoire de façon excessive et encore moins ton disque dur
    En revanche, laisser son navigateur tourner sans interruption pendant plusieurs jours, là ça craint un peu
    JavaScript n'a donc rien à voir avec tes problèmes de mémoire.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 2
    Par défaut
    Merci Bovino pour ton aide qui m'a permis d'assimiler certaines choses. Donc si je comprends bien un clearTimeout sert surtout à annuler une tâche planifiée dans le cadre d'une exception (puisque le setTimeout s'effacerait tout seul après le délai).
    Et si je comprends toujours, à la rigueur il n'y a pas nécessairement besoin de déclarer de variable timer, il suffit juste de déclencher un setTimeout tout simplement... Donc les 5 setTimeout se déclencheront dès le début du code et s'effaceront chacun leur tour après que leurs délais respectifs soient écoulés...

    J'essaierai ça demain.

    J'avais lâché ce code depuis quelques jours, en me disant que peut-être si je faisais d'autres tests, il se reproduirait une catastrophe ( ), mais je suis content d'apprendre qu'il ne s'agissait que d'une coïncidence fortuite.


    ps: désolé d'avoir oublié la balise code dans mon message précédent.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Oui, c'est ça.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    enfin, ton code reste pour le moins déconcertant (un peu, je trouve)

Discussions similaires

  1. Gestion du timer et droit restreint sur une page web
    Par Florian.L dans le forum ASP.NET
    Réponses: 1
    Dernier message: 20/03/2012, 16h41
  2. Exécution sous condition: setTimeOut/clearTimeOut
    Par mathieu.smartin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/11/2011, 14h25
  3. Réponses: 4
    Dernier message: 18/03/2010, 08h45
  4. problème de gestion du timer
    Par patlebigboss dans le forum Java ME
    Réponses: 0
    Dernier message: 07/11/2008, 11h18
  5. timer setTimeout
    Par carroteman dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 31/10/2007, 20h25

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