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 :

Valeur du timeout différente suivant les navigateurs ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 19
    Par défaut test des intervalles sur un setTimeout
    Salut à tous,

    (suis nouveau,, 2ème post sur ce fofo,, ^^)

    je viens juste vous faire part d'un étrange (mais hélas, ... peu surprenant) problème... de compatibilité de résultats entre firefox / IE... & demande votre avis/aide sur la question,,

    je m'explique,... la manip est la suivante :

    1) je lance un timer via un setTimeout en javascript... jusque là, rien de spécial,

    echo " var timer=setTimeout(\"do_calc()\",100);";

    (bon, je le lance en php, okay... )

    2) le script va mettre à jour une valeur toutes les 100ms sec < okay, ça marche,,

    3) j'ouvre 2 navigateurs -> IE + firefox -> qui vont interroger le même script, approximativement dans la même seconde,

    & bien... figurez-vous qu'au bout d'un certains temps (voir 1 minute, ça suffit), il va y avoir un décalage de plusieurs secondes entre les 2 différents navigateurs !! IE va avoir tendance à afficher le résultat en retard (calcul lent?)

    problème connu ? existe-t-il un fix ?

    faut-t-il s'amuser à scripter/chronométrer la différence de calcul entre IE & FF pour utiliser la fonction setTimeout de manière "homogène"/crossbrowser-esque ??

    merci d'avance pour vos réponses, & vos lumières,
    Cdt,

    GBS63,,

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    le setTimeout() ne lance l'instruction qu'une seule fois.
    Tu as donc dû mettre en place une boucle ou un appel récursif, je suppose ...
    A mon avis l'écart vient du temps de traitement entre les appels au setTimeout() ...
    Pour vérifier (si 100 ms représente un temps différent pour les 2 nav), essaye de faire le même appel avec un setInterval(...,100).
    (sans boucle ou appel récursif, donc)

    A+

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 19
    Par défaut
    merci pour la réponse,

    okay, je vais tenter avec setInterval... mais aux derniers essaies, quand j'avais tenté avec cette function, ça freezait le script sous IE & ff... ^^
    (mais je pense avoir compris pourquoi & trouvé un fix : http://alexle.net/archives/169

    & je vais tenter également de chronométrer l'affaire,,

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par GBS63 Voir le message
    quand j'avais tenté avec cette function, ça freezait le script sous IE & ff... ^^
    Si ta fonction est un peu "lourde" et que tu l'appelles 10 fois par seconde, forcément .....

    J'ai vu le lien, mais jamais eu ce problème avec setInterval

    On peut voir la fonction do_calc() ?

    A+

  5. #5
    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 : 55
    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
    Une erreur "classique" consiste aussi à lancer le setInterval dans la fonction appelée à la fin du timer... ce qui a pour facheuse conséquence de multiplier les timers et d'exploser la mémoire.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function do_something(){
        // code de la fonction
        setInterval(do_something, 100);
    }
    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

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    +1

    D'autant plus classique lorsqu'on modifie la fonction pour passer d'un appel récursif du setTimeout() à l'utilisation du setInterval() ...

    A+

  7. #7
    Membre averti
    Inscrit en
    Août 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 19
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Une erreur "classique" consiste aussi à lancer le setInterval dans la fonction appelée à la fin du timer... ce qui a pour facheuse conséquence de multiplier les timers et d'exploser la mémoire.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function do_something(){
        // code de la fonction
        setInterval(do_something, 100);
    }
    exact, j'avais probablement fait cette erreur !!

    bon, j'ai scripté une sorte de chronomètre, permettant de tester un peu mieux tout ça,

    http://bdmusique.free.fr/timestamp.php

    le code :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    <html>
    <head>
    <title>Test du timestamp</title>
    </head>
    <body>
     
    <div id="debug" >&nbsp;</div>
    <br>
    <div id="time1" >&nbsp;</div>
     
    <script>
     
    var compteur=0;
    var seconde=1000;
     
    var testing=Array();
    testing[0]='';
     
    var now=new Date();
    var t1=now.getTime();
    testing[0]=t1;
     
    var after_1min=new Date();
    var t2=testing[0]+(60*1000);
    after_1min.setTime(t2);
    var temp_ideal=after_1min.getTime();
     
    testing[1]=t1;
     
    var time0_report=now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+":"+now.getMilliseconds();
    var time1_report=after_1min.getHours()+":"+after_1min.getMinutes()+":"+after_1min.getSeconds()+":"+after_1min.getMilliseconds();
     
    document.getElementById('debug').innerHTML=compteur+ " à la fin du test, le timestamp idéal devrait être: "+temp_ideal+" (test démarré à "+time0_report+" & normalement finit à "+time1_report+")"; 
     
    function stop_timer(value)
    {
    //	clearTimeout(timer);
    	clearInterval(value);
    }
     
    var globalScope = new Array();
     
    /* A. Constructor */
    function TimeTicker()
    {
    document.getElementById('time1').innerHTML="départ: "+testing[0]+" & le compteur est : "+compteur;
     
    if( document.all )
    	{
    	/* A.3.1.1 - make a reference to the current object and saved in the global scope array
    	* to use later to correct the scope.
    	*/
    	globalScope[ this.uniqueId ] = this;
    	this.timer = setInterval( 'ieIntervalHandler("' + this.uniqueId + '","updateTime")', 1000 );
    	}
    else
    	{
    	/* A.3.2 - Mozilla */
    	this.timer = setInterval ( function( that ) { that.updateTime(); }, 1000, this );
    	}
    }
     
    /* B. This function is to update the time value somewhere on the screen */
    TimeTicker.prototype.updateTime = function ()
    {
    compteur=compteur+1;
    var now=new Date();
     
    var t3=now.getTime();
     
    current_delay=t3-testing[1];
     
    diff_time=t3-testing[0];
     
    testing[1]=t3;
     
    var fix_diff_time=Math.round(diff_time/seconde)*1000;
     
    decalage=diff_time-fix_diff_time;
     
    document.getElementById('time1').innerHTML=compteur+" & temps total écoulé (en millisecondes) : "+diff_time+" & il devrait être : "+fix_diff_time+" / intervalle actuel ="+current_delay+" / décalage sur le global ="+decalage; 
     
    if (compteur==60)
    	{
    	var now_after_1min=new Date();
    	var temp_ideal=now_after_1min.getTime();
     
    	var time2_report=now_after_1min.getHours()+":"+now_after_1min.getMinutes()+":"+now_after_1min.getSeconds()+":"+now_after_1min.getMilliseconds();
     
    	diff_time=t2-testing[0];
    	document.getElementById('time1').innerHTML=compteur+ " -> fin du test : le timestamp vaut "+t3+" ("+time2_report+") / decalage ="+decalage; 
     
    	stop_timer(this.timer);
    	return false;
    	}
    }
     
    function ieIntervalHandler( id, strFunc )
    {
    /* D.1 - correct the scope then make the call */
    var scope = globalScope[id];
    eval( "scope." + strFunc + "()" );
    }
     
    timer=new TimeTicker;
     
    </script>
    </body>
    </html>
    1ères constatations,,
    avec Internet Explorer :
    il a tendance à prendre du retard ! (+16 ms/seconde au départ... se stabilise souvent vers la 8ème / 10ème sec) le décalage total peut être de +31, +47, voir 64ms+

    avec firefox :
    il a tendance à s'éxécuter plus rapidement ! sur la 1ère seconde : décalage de -1ms / jusqu'à -14s, puis il se stabilise vers la 4ème seconde

    (test réalisé avec une seule fenêtre ouverte, pour chaque navigateur... machine au repos)

    alors je sais bien que js est côté client, et que le résultat va dépendre du proc' & de la machine éxécutante... mais quand même... sur certains calcul, ça fait de bonnes variations de résultat...

    voyez-vous un ptit bout de script, qui pourrait fixer ces décalages ? si vous avez une idée...

    j'essaierai de mon côté,

Discussions similaires

  1. valeur d'un objet différent suivant les affichages
    Par Nnahaa dans le forum Général Java
    Réponses: 8
    Dernier message: 11/05/2014, 01h53
  2. Comportement différent suivant les navigateurs
    Par baggie dans le forum Langage
    Réponses: 6
    Dernier message: 11/10/2012, 09h59
  3. Liste déroulante avec comportement différent suivant les navigateurs
    Par smfoa dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 30/01/2011, 11h55
  4. probleme menu et css suivant les navigateurs...
    Par emile13 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 27/01/2006, 04h04
  5. Action différente suivant les droits
    Par JMLD dans le forum XMLRAD
    Réponses: 2
    Dernier message: 27/04/2005, 17h25

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