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 :

L'incrémentation ne se fait pas


Sujet :

JavaScript

Vue hybride

FotoXe33 L'incrémentation ne se fait... 14/01/2011, 17h32
javatwister je te suggère de remplacer ... 14/01/2011, 18h17
Bovino Tout d'abord, ton code me... 16/01/2011, 13h43
FotoXe33 Tout d'abord merci à vous... 16/01/2011, 23h28
FotoXe33 Bon j'ai un peut avancé,... 17/01/2011, 11h46
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Par défaut L'incrémentation ne se fait pas
    Bonjour,

    J'ai le script suivant, et son comportement est plus que louche...

    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
     
        var titleContent;
        var txtContent;
        var nbPhotos;
        var allSlides;
        var i = 1;
     
        function nextContent(nb){
            var infos = resultAjax("getContent", 186, nb); // resultAjax est une fonction envoyant une requête ajax et retournant le résultat sous forme de JSON
            infos = infos.split('|');
            titleContent = infos[0];
            txtContent = infos[1];
            nbPhotos = infos[2];
            allSlides = eval('['+infos[3]+']');
            return (titleContent!='' && txtContent!='' && nbPhotos!='' && allSlides!='') ? true : false;
        }
     
        function afficheContent(){
            $(function(){
                $("#titleContent").html(titleContent);
                $("#txtContent").html(txtContent);
                $.fn.supersized.options = {
                    navigation: 0, // << || >>
                    slide_counter: 0, // x / n
                    slide_captions: 0, // txt
                    slide_interval: (30/nbPhotos)*1000, // tps
                    slides : allSlides
                };
                $('#supersized').supersized();
            });
        }
     
        // i vaut 1, ok
        nextContent(i);
        afficheContent();
        window.setInterval(function(){
            i++;
            // i vaut toujours 1 Oo
            if(nextContent(i)){
                $("#content").fadeOut(200, function(){
                    afficheContent();
                });
                $("#content").fadeIn(200);
            }
            else{
                // i ne revient jamais à 1
                i=1;
        	}
        }, 5000);
    Bref, en gros ce que j'aimerais c'est :
    1) On affiche une première fois la page (via la fonction) avec le résultat de la requête.
    2) Au bout de 30 secondes, on incrémente i de 1, et on redemande un envoie de requête.
    - Si la requête retourne quelque chose, on affiche la page
    - Sinon, on remet i à 1

    La boucle est infinit et c'est ce que je souhaite.

    D'où vient le PB svp ? Cela fait plusieurs heures que je me casse les dents la dessus et je ne vois vraiment pas...

    Merci d'avance.

  2. #2
    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
    je te suggère de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    window.setInterval(function(){
            i++;
            if(nextContent(i)){
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    window.setInterval(function(){
            if(nextContent(i++)){
    quitte à réinitialiser i à 0 en cas de retour nul;

  3. #3
    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
    Tout d'abord, ton code me semble assez maladroit : mélanger du JavaScript pur et jQuery peut être problématique...

    Sinon, ton appel AJAX est-il synchrone ? Parce que si ce n'est pas le cas, la fonction nextContent() renverra toujours false et tu rentreras toujours dans le if...
    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

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Par défaut
    Tout d'abord merci à vous deux pour vos réponses.

    J'essaierais dès demain ta méthode javatwister.

    Quant à ta question Bovino, je ne serais te dire : j'utilise HTML_AJAX, un plugin pear, donc qu'en est-il ?
    De plus, je suis d'accord que mélanger JS et jQuery est très salle, saurais-tu comment éviter cela ?

    Merci d'avance.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Par défaut
    Bon j'ai un peut avancé, notamment en éliminent le plus possible de JS pur :

    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
     
        var titleContent;
        var txtContent;
        var nbPhotos;
        var allSlides;
        var i = 1;
     
        function nextContent(nb){
            var infos = resultAjax("getContent", 186, nb);
            infos = infos.split('|');
            titleContent = infos[0];
            txtContent = infos[1];
            nbPhotos = infos[2];
            allSlides = eval('['+infos[3]+']');
            return (titleContent!='' && txtContent!='' && nbPhotos!='' && allSlides!='') ? true : false;
        }
     
        function afficheContent(){
            $(function(){
                $("#titleContent").html(titleContent);
                $("#txtContent").html(txtContent);
                $.fn.supersized.options = {
                    navigation: 0, // << || >>
                    slide_counter: 0, // x / n
                    slide_captions: 0, // txt
                    slide_interval: (30/nbPhotos)*1000, // tps
                    slides : allSlides
                };
                //$('#supersized').supersized();
            });
        }
     
        nextContent(i);
        afficheContent();
        i++;
     
        // Start a polling loop with a counter.
        $.doTimeout(5000, function(){
        	if(nextContent(++i)){
        		$("#content").fadeOut('slow');
        		afficheContent();
        		$("#content").fadeIn('slow');
        	}
        	else{
                i=1;
        	}
            return true;
        });
    Encore quelque problème :
    1) A parement supersized "block" le script (le fadeIn ne s'exécute jamais).
    2) Le i ne s'incrémente pas comme il faut : j'ai d'abord le premier contenu, puis encore le premier, et ensuite que le deuxième en boucle (il ne revient jamais à 1)...

    Merci d'avance pour votre aide.

    N.B : y aurait-il moyen d'exécuter d'abord une fonction puis de faire patienter le script x secondes ? Car ici il attend d'abord les x secondes puis exécute le code demandé, ce qui me fait faire quelque chose de très moche avant ma boucle...

  6. #6
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    Bon j'ai un peut avancé, notamment en éliminent le plus possible de JS pur :

    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
     
        var titleContent;
        var txtContent;
        var nbPhotos;
        var allSlides;
        var i = 1;
     
        function nextContent(nb){
            var infos = resultAjax("getContent", 186, nb);
            infos = infos.split('|');
            titleContent = infos[0];
            txtContent = infos[1];
            nbPhotos = infos[2];
            allSlides = eval('['+infos[3]+']');
            return (titleContent!='' && txtContent!='' && nbPhotos!='' && allSlides!='') ? true : false;
        }
     
        function afficheContent(){
            $(function(){
                $("#titleContent").html(titleContent);
                $("#txtContent").html(txtContent);
                $.fn.supersized.options = {
                    navigation: 0, // << || >>
                    slide_counter: 0, // x / n
                    slide_captions: 0, // txt
                    slide_interval: (30/nbPhotos)*1000, // tps
                    slides : allSlides
                };
                //$('#supersized').supersized();
            });
        }
     
        nextContent(i);
        afficheContent();
        i++;
     
        // Start a polling loop with a counter.
        $.doTimeout(5000, function(){
        	if(nextContent(++i)){
        		$("#content").fadeOut('slow');
        		afficheContent();
        		$("#content").fadeIn('slow');
        	}
        	else{
                i=1;
        	}
            return true;
        });
    Encore quelque problème :
    1) A parement supersized "block" le script (le fadeIn ne s'exécute jamais).
    2) Le i ne s'incrémente pas comme il faut : j'ai d'abord le premier contenu, puis encore le premier, et ensuite que le deuxième en boucle (il ne revient jamais à 1)...


    Merci d'avance pour votre aide.

    N.B : y aurait-il moyen d'exécuter d'abord une fonction puis de faire patienter le script x secondes ? Car ici il attend d'abord les x secondes puis exécute le code demandé, ce qui me fait faire quelque chose de très moche avant ma boucle...
    Normal qu'il ne revient jamais à 1 :
    si l'appel à 2 renvoie true, ton prochain appel se fera sur 3. Autrement i vaudra 1 et ++i faudra donc 2, ton prochain appel se fera donc de nouveau sur 2.
    Javatwister t'as proposé la solution :
    if( nextContent ( i++ ))
    Pourquoi l'as-tu transformé en
    if( nextContent( ++i))
    ?

    Ensuite rien à voir avec ton problème mais la fonction eval est une abomination, uitilise plutôt une des méthodes de l'objet Array. ( désolé étant sur mon gsm, je n'ai pas envie de chercher laquelle et encore moins de te proposer une solution sans l'avoir testée)

    :-)

    Édit: en fait c'est pas normal que tes 2 premiers appels se fassent sur 1. En lisant ton code, ton premier appel devrait se faire sur le nbr 2 et les suivants sur 2 ou plus.

    Pour ton problème d'appel tout au début et puis de polo toutes les 5 sec, ne connaissant pas les possibilités qu'offre la méthode doTimeout, je ne peux que te suggérer de faire :

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function refresh(){
     if(nextContent(++i)){
        		$("#content").fadeOut('slow');
        		afficheContent();
        		$("#content").fadeIn('slow');
        	}
        	else{
                i=1;
        	}
            return true;
        }
    refresh();
    $.doTimeout(5000, refresh);

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

Discussions similaires

  1. [Runtime] TransferDatabase ne se fait pas
    Par podz dans le forum Runtime
    Réponses: 15
    Dernier message: 24/01/2006, 10h47
  2. Scroll comboBox ne fait pas défiler les ItemData !
    Par Tchupacabra dans le forum IHM
    Réponses: 4
    Dernier message: 09/12/2005, 09h13
  3. Int 21H AX=716Ch ne fait pas mon affaire !!
    Par TheBigMac dans le forum Assembleur
    Réponses: 4
    Dernier message: 10/09/2004, 20h51
  4. Pb de selection qui ne se fait pas
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 10h54
  5. [SQL Server 8] le join ne se fait pas
    Par Baquardie dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/07/2004, 14h57

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