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 :

setInterval()


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Par défaut setInterval()
    Bonjour,

    j'ai un petit problème avec une boucle sur un getElementsByClassName().

    J'ai une fonction, que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function rollNews() {
    	//alert(document.getElementById('newsContent').getElementsByClassName('news').length);
    	var cursor = 0;
    	for(var i = 0; i <= document.getElementById('newsContent').getElementsByClassName('news').length; i++) {
    		document.getElementById('newsContent').getElementsByClassName('news')[i].style.display = 'none';
    	}
    	//document.getElementById('newsContent').getElementsByClassName('news')[cursor].style.display = 'block';
    }
    qui va intéragir sur l'HTML suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <div class="actualites">
    	<div class="title"></div>
        <div class="content" id="newsContent">
        <p class="news">Les solutions pour d&eacute;crocher les meilleurs cr&eacute;dits. Pour faire plier les banques, qui pr&ecirc;tent de...</p>
        <p class="news">Test 2</p>
        </div>
        <div class="more"></div>
    </div>
    Lancée par un onload sur le <body>, elle me renvoie l'erreur :
    document.getElementById('newsContent').getElementsByClassName('news')[i] is undefined
    Ce qui est étrange, c'est que quand je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(document.getElementById('newsContent').getElementsByClassName('news')[0].innerHTML);
    la fonction me renvoie bien le contenu de la première news.

    Comment ce fait'il que la fonction n'arrive pas à interpréter correctement la variable i, dans ma boucle ?

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    mauvais test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(var i = 0; i <= document.getElementById('newsContent').getElementsByClassName('news').length; i++)
    bon test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(var i = 0; i < document.getElementById('newsContent').getElementsByClassName('news').length; i++)
    meilleur code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var tab = document.getElementById('newsContent').getElementsByClassName('news');
    for(var i = 0; i < tab.length; i++)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Par défaut
    Effectivement, ça marche mieux. je pensais que comme PHP, Javascript comprenait les signes <= et >= .

    Un
    <= var
    en javascript se transforme donc en
    < var +1
    j'imagine.

    Merci en tout cas.

  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
    Bonjour,
    Citation Envoyé par van___fanel Voir le message
    Effectivement, ça marche mieux. je pensais que comme PHP, Javascript comprenait les signes <= et >= .
    le problème n'est pas celui-là.
    JS comprend <= et >=
    Ce que te signale bigboomshakala, c'est que le dernier indice d'un tableau est length-1 (et non pas length)

    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Par défaut
    Effectivement.

    Je suis maintenant en train d'utiliser ma boucle dans une fonction, dont le but ultime est de réussir à reproduire le système de news défilante placé juste en dessous de la bannière du site http://www.credixia.com/

    Voici mon code HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <div class="actualites">
    	<div class="title"></div>
        <div class="content" id="newsContent">
        <p class="news">Les solutions pour d&eacute;crocher les meilleurs cr&eacute;dits. Pour faire plier les banques, qui pr&ecirc;tent de...</p>
        <p class="news">Test 2</p>
        </div>
        <div class="more"></div>
    </div>
     
    <div id="debug"></div>
    <script type="text/javascript" language="javascript">
    rollNews('0');
    </script>
    et ma fonction rollNews() :

    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
    function rollNews(news) {
    	var elem = document.getElementsByClassName('news');
    	var i = 0;
    	for(i = 0; i < elem.length; i++) {
    		elem[i].style.display = 'none';
    	}
    	//document.getElementById('debug').innerHTML = 'on affiche la news #'+news+'<br />';
    	elem[news].style.display = 'block';
     
    	news = parseInt(news) + 1;
    	if(news >= elem.length) {
    		news = 0;
    	}
     
    	//document.getElementById('debug').innerHTML += 'on lance rollNews(\''+news+'\')<br />';
    	window.setInterval("rollNews('"+news+"')", 5000)
    }
    Ca marche pas trop mal pour le moment, sauf que parfois ça bug un peu, on dirait que le script lance deux fois de suite la fonction, sans attendre intervalle de 5 secondes. Et bout d'un certains temps (une dizaine d'intervalles je dirais, ça bug complètement, et plus rien ne bouge, et Firefox plante). Une idée d'où ça peut venir ?

  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
    Avec cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.setInterval("rollNews('"+news+"')", 5000)
    tu lances plusieurs setInterval() en parralèlle : l'appel étant à l'intérieur de la fonction, elle se rappelle elle-même.
    Dans ce cas, il faut utiliser un simple setTimeout() qui ne lance qu'une fois l'instruction au bout du délai (même syntaxe que setInterval() )...

    Sinon, tu peux continuer à utiliser setInterval(), mais en le sortant de la fonction. Tu peux appeler cette instruction sur le onload du body, par exemple (ce serait préférable à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script type="text/javascript" language="javascript">
    rollNews('0');
    </script>
    ) ...

    A+

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

Discussions similaires

  1. Probleme avec setInterval
    Par lacsap49 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/01/2006, 18h32
  2. [FLASH 8] setinterval();
    Par Destiny dans le forum Flash
    Réponses: 2
    Dernier message: 20/12/2005, 08h19
  3. Utilisation de 2 fonctions setInterval successives
    Par mouste79 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 02/12/2005, 15h56
  4. [FLASH MX] pb setInterval
    Par chocobos dans le forum Flash
    Réponses: 5
    Dernier message: 24/08/2005, 16h42
  5. [flash MX] probleme avec setinterval et clearinterval
    Par yacinechaouche dans le forum Flash
    Réponses: 3
    Dernier message: 15/04/2004, 12h07

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