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 :

Retrouver / altérer le callback d'un setTimeout


Sujet :

JavaScript

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut Retrouver / altérer le callback d'un setTimeout
    Bonjour,

    J'ai un script sur lequel je n'ai pas la main, qui fait un setTimeout dans le onload de la page :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setTimeout(function(){ alert("Hello"); }, 3000);

    Ce comportement me dérange, et je souhaite le neutraliser.

    J'ai donc créé un autre script, que je déclenche dans la foulée, qui fait :
    Code javaascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    window.setTimeout = function (func, interval) {
        // Do nothing
    };


    Ainsi, le timeout en question ne se déclenche plus.

    Seulement, cela provoque d'autres effets de bord : notamment, plus aucun window.setTimeout ne fonctionne !

    La méthode clearTimeout(myVar) attend en paramètre un handle retourné par setTimeout. Je n'ai pas ce handle sous la main, donc impossible d'utiliser cette méthode.

    Question : comment retrouver la liste des handles actifs ? Éventuellement le prototype des fonctions callback associées, afin que je puisse annuler uniquement le traitement qui m'intéresse ?

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Hmmm, c'est pas ultra propre, mais je pense avoir trouvé la solution…

    Ca m'a l'air de marcher en tout cas !
    Code javscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    window.setTimeoutBase = window.setTimeout;
    window.setTimeout = function (func, interval) {
        if (func.toString() !== "function (){ alert(\"Hello\"); }") setTimeoutBase(func, interval);
    };

  3. #3
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Tu peux redéfinir la fonction setTimeout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var _SetTimeout = setTimeout;
    setTimeout = function (fct, delai) {
    //et ici tu  interceptes l'ancienne fonction lancée
     
    }
    lors de l'interception tu peux ou non laisser se poursuivre la fonction initilale

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Hmmm, cette solution a l'air plus propre :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (function (proxied) {
        window.setTimeout = function () {
            if (arguments !== null && arguments.length === 2) {
                if (arguments[0].toString() !== "function (){ alert(\"hello\"); }") {
                    return proxied.apply(this, arguments);
                }
            }
            return;        
        };
    })(window.setTimeout);

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Tu peux redéfinir la fonction setTimeout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var _SetTimeout = setTimeout;
    setTimeout = function (fct, delai) {
    //et ici tu  interceptes l'ancienne fonction lancée
     
    }
    lors de l'interception tu peux ou non laisser se poursuivre la fonction initilale
    La difficulté résidait dans le faire de pouvoir justement laisser s'exécuter le code de base de setTimeout.

    Finalement c'était pas si compliqué que ça

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Pour plus de souplesse, au lieu de tester la chaîne avec une égalité, tu peux utiliser une regexp.

    En ce qui concerne les handles, il n’y a pas moyen d’en obtenir la liste. En revanche, clearTimeout et clearInterval ne bronchent pas quand tu leur passes des handles invalides, ce qui permet de faire des trucs un peu sales comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (let i = setTimeout(function(){}, 100); i--; ) {
      clearTimeout(i);
      clearInterval(i);
    }
    Ça tue tous les timers de la page.

  7. #7
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    En ce qui concerne les handles, il n’y a pas moyen d’en obtenir la liste.
    Pas directement, mais dans le _setTimout détourné on peut pusher dans un array

  8. #8
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Juste pour l'exploration ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    let i=1;
    let Running=[];
    _setInterval = setInterval;
    setInterval = function (fct, delai){
     								_setInterval( fct, delai);
                    Running.push( arguments.callee );
    }
     
    setInterval ( function (){ console.log( 'fct A')} ,2000) ;
    setTimeout( function(){
    		setInterval ( function (){ console.log( 'fct B')} ,3000) ;
     },1000);
    setTimeout( function(){ console.log(Running);}  ,10000 );
    Par contre, je n'ai pas réussi à faire un clearInterval à partir de Running[0]

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

Discussions similaires

  1. setTimeout et son callback
    Par Nelswho dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/03/2013, 19h47
  2. Comportement du callback passé à setTimeout (Firefox)
    Par Mic75 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/10/2012, 11h00
  3. Réponses: 7
    Dernier message: 31/08/2005, 14h22
  4. retrouver les compsants FASTNET sous Delphi 7
    Par fandor7 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/06/2003, 18h11
  5. retrouver rep spéciaux windows
    Par pegase21 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 11/06/2003, 01h48

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