Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème setTimeout

Sujet résolu
    9 octobre 2009 à 14:33:26

    Bonjour à tous,

    Voila je débute en javascript, mais j'ai un petit problème, mon but est simple afficher un bouton et lorsque que l'on clique sur celui afficher une nouvelle fenêtre, un compteur s'affiche alors dans la première (dans sa barre de status) de 5 à 1 puis ferme la seconde fenêtre.

    Le hic c'est que la seconde fenêtre se ferme avant la fin de ma fonction...

    <html>
    <head>
     <link rel="stylesheet" media="screen" type="text/css" title="Design" href="./css/design.css"/>
     <title>.:Accueil:.</title>
     <script language="javascript">  
      cpt=5; //Variable globale.
      
      /*Fonction d'affichage dans la barre de status*/
      function AfficheStatus()
      {
        /*Affichage du décompte des secondes*/
    	defaultStatus="Il reste " + cpt-- + " secondes.";
    	if(cpt >= 0) setTimeout("AfficheStatus()", 1000);
    	else         defaultStatus=" ";
      }
     
      /*Fonction d'ouverture d'une fenêtre*/
      function OuvertureFenetre()
      {
        /*Ouverture de la fenêtre */   
    	new_fenetre=window.open("./page2.html", "fenetre1", "height=100, width=300");
    	setTimeout("AfficheStatus()", 1);
    	
    	/*Fermeture de la fenêtre*/
    	new_fenetre.close();
      }
     </script>
    </head>
    <body>
    <input type="button" name="bouton1" value="Top Depart" Onclick="OuvertureFenetre()"/>
    </body>
    </html>
    


    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2009 à 14:53:33

      C'est normal tu appelles ta fonction fermeture de-suite.

      function AfficheStatus()
        {
          /*Affichage du décompte des secondes*/
      	defaultStatus = "Il reste " + cpt-- + " seconde(s).";
      	if (cpt >= 0) {
      		setTimeout(AfficheStatus, 1000);
      		// Ecriture plus propre de setTimeout
      	}
      	else {
      		defaultStatus = " ";
      		new_fenetre.close();
      	}
        }
       
        /*Fonction d'ouverture d'une fenêtre*/
        function OuvertureFenetre()
        {
          /*Ouverture de la fenêtre */   
      	new_fenetre=window.open("./page2.html", "fenetre1", "height=100, width=300");
      	
      	AfficheStatus();
        }
      
      • Partager sur Facebook
      • Partager sur Twitter
        9 octobre 2009 à 15:09:30

        Tout d'abord merci ca fonctionne !

        Mais il y a un truc que je ne comprend pas, je n'appelle ma fonction de fermeture qu'une fois celle du setTimeout terminé (le décompte des 5 secondes).

        Normalement le principe d'une fonction : je rentre, je fais mon traitement, puis je resort et passe à l'instruction suivante de mon code.

        Dans mon cas le "new_fenetre.close();" s'éffectue avant ma fonction "AfficheStatus" pourquoi o_O ?
        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2009 à 15:12:07

          le setTimeout est asynchrone (c'est à dire qu'elle n'attend pas que ce soit terminé pour exécuter la suite du script)
          et s'utilise comme ça :
          setTimeout(AfficheStatus, 1);
          l'attribut "language" de la balise script a été remplacée par type="text/javascript"
          les variables doivent être déclarées avec un "var"

          Pour régler le "vrai" problème, tu peux utiliser les callbacks EDIT: ou la méthode de Tiller ^^
          http://www.siteduzero.com/tutoriel-3-1 [...] tml#ss_part_5
          Explications un peu plus bas de ce que c'est...
          • Partager sur Facebook
          • Partager sur Twitter
            9 octobre 2009 à 15:23:36

            Ok merci je comprend mieux maintenant...
            Pour l'attribut language en faite mon prof ne nous avais parlé que de celui la, je vais passer au type="text/javascript" pour être en conformité.

            Merci à vous deux :D.
            • Partager sur Facebook
            • Partager sur Twitter
              9 octobre 2009 à 15:41:41

              PS: y a un lien en bas à gauche de la page pour mettre en vert ^^
              • Partager sur Facebook
              • Partager sur Twitter

              Problème setTimeout

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown