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 :

Démarrer setInterval() à partir d'une fonction et le stopper dans une autre, impossible ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    sans
    Inscrit en
    Octobre 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Octobre 2019
    Messages : 205
    Par défaut Démarrer setInterval() à partir d'une fonction et le stopper dans une autre, impossible ?
    Salut

    J'ai ce code où setInterval() fonctionne seulement si je ne lui donne pas une id, hors j'ai besoin d'une id pour le stopper avec clearInterval(id).
    Donc tel que je montre mon code là, setInterval() se lance pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function stop_clignote(cligne)
    {
    	clearInterval(cligne);
    }
     
    function place(pseudo)
    {
    	var cligne=setInterval("clignote()", 500);
    	setTimeout(stop_clignote(cligne), 5000);
    }
    J'essaie de pas avoir de variables globales, il paraît que c'est pas propre

  2. #2
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    oui, c'est vrai, les variables globales c'est pas propre, mais c'est pareil pour les fonctions : avoir des fonctions dans tous les sens c'est pas propre non plus.

    autrement dit, cela implique de regrouper les fonctions et les variables qu'elles partagent en les plaçant dans un même objet.

  3. #3
    Membre très actif

    Homme Profil pro
    sans
    Inscrit en
    Octobre 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Octobre 2019
    Messages : 205
    Par défaut
    Salut Psychadelic
    Merci de l'info !
    Tu as une idée pour que setInterval() fonctionne avec une id ? Car je suis obligé d'avoir une fonction de lancement et une fonction d'arret, je peux pas les regrouper :/

    EDIT : Aaaah je viens de comprendre ce que tu dis par regrouper, c'est comme tu dis les mettre dans un objet, moi j'avais compris les mettre en une seule fonction, tu as raison mais je sais pas faire comme tu dis :/

  4. #4
    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
    salut,

    petit exemple:

    - En cliquant sur "élargir", le div s'élargit... (setInterval)
    - En cliquant sur "arrêter", euh... ça s'arrête... (clearInterval)

    L'astuce est de déclarer un nom pour set et clear mais de ne l'activer qu'au moment où on en a besoin; bref, tu passes de "undefined" setInterval ou clearInterval quand tu veux activer ou désactiver le timer;
    Je n'ai jamais trouvé de solution plus clean;

    http://javatwist.imingo.net/interval2.htm

    Code html : 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
    45
    46
    47
    48
    49
    <!DOCTYPE>
    <html> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
    <head>
     
    <title>...</title>
     
    <style>
    #test {
            background-color:red;
            height:200px;
            width:15px;
    </style>
     
    </head>
    <body>
    <div id="test"></div>
     
    <div>
    	<button id="bout">élargir</button> <button id="bout2">arrêter</button>
    </div>
     
    <script>
    const obj={
            large:15,
            plus:2,
            inter : undefined,
            stop : undefined
    }
     
    document.querySelector("#bout").addEventListener("click",(e)=>{
            e.target.disabled=true;
            obj.inter=setInterval(()=>{
                    obj.large+=obj.plus;
                    document.querySelector("#test").style.width=obj.large+"px"}
            ,500)}
    ,false);
     
    document.querySelector("#bout2").addEventListener("click",()=>{
            document.querySelector("#bout").disabled=false;
            if(obj.inter!=undefined){
                    obj.stop=clearInterval(obj.inter)
            }}
    ,false);
     
    </script>
     
    </body>
    </html>

  5. #5
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par javatwister Voir le message
    L'astuce est de ...
    c'est pas vraiment mieux, ou disons c'est juste une petite partie du raisonnement :
    cela implique de regrouper les fonction et les variables qu'elles partagent en les plaçant dans un même objet
    et cela reste un ensemble de variables globales, elle sont juste dans un objet JS.

  6. #6
    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
    Moui; là tu définis 2 fonctions dans une autre, de même que tes 2 gestionnaires d’événement...; je ne trouve pas ça d'une propreté éclatante;

    pour le reste, on est d'accord;

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par psychadelic Voir le message
    c'est pas vraiment mieux, ou disons c'est juste une petite partie su raisonnement :
    et cela reste un ensemble de variables globales, elle sont juste dans un objet JS.
    Je pense que c'est beaucoup mieux avec un objet que sans, ça limite la "pollution"... C'est en quelque sorte un espace de nom (ou namespace), regardez à ce propos ce tuto : https://falola.developpez.com/tutori...ript/namespace pour l’intérêt...

    Dans le code de javatwister l'objet obj peut être vu comme un espace de nom, c'est bien sûr une variable globale mais ta fonction GestionInterface est aussi globale...

    Citation Envoyé par psychadelic Voir le message
    OK alors en closure c'est mieux ?
    Comme tu l'as dit ta fonction GestionInterface est aussi une closure (et elle est aussi globale...).

    Mais cette fois tu utilises une fonction anonyme auto-exécutable (IIFE) donc je suppose qu'une fois exécutée tout est nettoyé (puisqu'on n'a pas de référence vers cette fonction) donc ça doit être mieux question "pollution" mais je ne sais pas si on peut toujours faire ça... Par exemple si on a besoin d'exécuter plusieurs fois cette fonction il faudra bien en avoir une référence...

    Sinon il y a les modules que je trouve bien pratique et d'ailleurs certains conseillent d'utiliser les modules plutôt que des fonctions auto-exécutables...

  8. #8
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par amateurprg Voir le message
    EDIT : Aaaah je viens de comprendre ce que tu dis par regrouper, c'est comme tu dis les mettre dans un objet, moi j'avais compris les mettre en une seule fonction, tu as raison mais je sais pas faire comme tu dis :/
    exemple simple et basique,
    Code html : 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
    45
    46
    47
    48
    49
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="UTF-8">
      <title>...</title>
    </head>
    <body>
      <div id="mon-Interface">
        compteur d'occurences = <span id="no-Occurence">0</span>
        <button id="bt-Start">Start</button>
        <button id="bt-Pause">Pause</button>
      </div>
     
      <script>
        function GestionInterface(refBtStart, refBtPause, refOccurenceN)
          {
          const btStart   = document.getElementById(refBtStart)
              , btPause   = document.getElementById(refBtPause)
              , dispOcc   = document.getElementById(refOccurenceN)
              
          let intervalID  = null
            , noOccurence = 0
     
          btStart.onclick = _Start
          btPause.onclick = _Pause
     
          function _Start()
            {
            btStart.disabled = true
            btPause.disabled = false
            intervalID = setInterval(_=>
              {
              dispOcc.textContent = ++noOccurence
              }
              , 1000)
            }
          function _Pause()
            {
            btStart.disabled = false
            btPause.disabled = true
            clearInterval(intervalID)
            }
          }
        
        GestionInterface('bt-Start','bt-Pause','no-Occurence')
     
      </script>
    </body>
    </html>

  9. #9
    Membre très actif

    Homme Profil pro
    sans
    Inscrit en
    Octobre 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Octobre 2019
    Messages : 205
    Par défaut
    Merci beaucoup à vous deux, c'est très sympa de m'avoir appris !!!

    je mets en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Création d'une fiche à partir d'une autre impossible
    Par Jon Shannow dans le forum Lazarus
    Réponses: 3
    Dernier message: 24/10/2016, 09h22
  2. Appeler une fonction à partir d'une autre fonction
    Par touta1 dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2009, 18h15
  3. [MySQL] Appel d'une fonction a partir d'une autre
    Par panganino dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/05/2009, 18h51
  4. executer une fonction(UDF) à partir d une autre fonction
    Par blaise4714 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/03/2009, 23h06
  5. Lancer une fonction JS à partir d'une autre fonction
    Par tim1789 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/05/2007, 21h32

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