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 :

[POO] Variation de la hauteur d'une liste en fonction du temps passé


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 27
    Points : 20
    Points
    20
    Par défaut [POO] Variation de la hauteur d'une liste en fonction du temps passé
    Hello,

    Je souhaite faire varier la hauteur d'une liste en fonction du temps passé.

    Pour cela, j'ai écrit le code suivant :
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    		<title>Exemple</title>
    		<script type="text/javascript"><!--
     
    var connect = function(oEl, sEvType, fn, bCapture) {
    	return document.addEventListener ?
    		oEl.addEventListener(sEvType, fn, bCapture || false):
    		oEl.attachEvent ?
    			oEl.attachEvent('on' + sEvType, fn):
    			false;
    };
     
    var load = function() {
     
    	var oUl = document.getElementsByTagName('ul')[0];
     
    	var initAnim = function() {
    		oUl.style.height = 0;
    		oUl.style.overflow = 'hidden';
    		oUl.start = (new Date()).getTime();
    		oUl.opened = oUl.start + 1000;
    	};
     
    	var stopAnim = function() {
    		oUl.style.height = 'auto';
    		oUl.style.overflow = 'visible';
    		oUl.start = oUl.opened = null;
    		clearInterval(oUl.exe);
    	};
     
    	var anim = function() {
    		if(!oUl.opened) initAnim();
    		var currentTime = (new Date()).getTime();
    		var currentHeight = parseInt(oUl.style.height);
    		if(currentHeight < oUl.scrollHeight && currentTime < oUl.opened ) {
    			currentHeight = currentTime * oUl.scrollHeight / oUl.opened;
    			oUl.style.height = parseInt(currentHeight) + 'px';
    		}
    		else stopAnim();
    	};
     
    	oUl.exe = setInterval(anim, 1);
     
    };
     
    connect(window, 'load', load);
     
    		//--></script>
    	</head>
    	<body>
     
    <ul>
    	<li>item 1</li>
    	<li>item 2</li>
    	<li>item 3</li>
    	<li>item 4</li>
    	<li>item 5</li>
    </ul>
     
    	</body>
    </html>
    Actuellement, la liste s'ouvre d'un coup sans tenir compte de mon code. Sauriez-vous pourquoi et d'où provient mon erreur ?

  2. #2
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    il y a plusieurs erreur dans ton script , notamment au moment de l'appel :

    connect(window, 'load', load); tu n'instancies pas ton objet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var toto = new connect(window, 'load', load);
    puis ça , d'ou cela provient : oUl.exe = setInterval(anim, 1); ????
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  3. #3
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Ah ?!

    connect est une fonction et je n'ai ici qu'à l'éxécuter au lieu de l'instancier au chargement de la page.

    Quant à oUl.exe, je ne fais qu'ajouter une propriété exe sur la liste qui consiste en l'éxécution d'un setInterval.

    A preuve du contraire, ça fonctionne bien tout ça mais je suis toute ouïe si tu es sûr que je me trompe.

    A mon avis, l'erreur provient d'ailleurs... au sein de la fonction anim je dirais.

  4. #4
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Eureka !

    En fait, la logique était correcte mais en travaillant sur les valeurs obtenues par (new Date()).getTime(); Javascript perdait les pédales lors du calcul du fait que les valeurs étaient trop grandes.

    Conclusion : Il faut travailler sur l'interval de temps plutôt que directement sur les timestamps.

    Au final, ça donne :
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    		<title>Exemple</title>
    		<style type="text/css"><!--
     
    @media screen, projection {
    	ul {margin-left:0; padding-left:0; width:200px; list-style-type:none; background-color:#5564EF; color:white; border:1px solid black;}
    	li {padding:5px 10px;}
    }
     
    		--></style>
    		<script type="text/javascript"><!--
     
    var connect = function(oEl, sEvType, fn, bCapture) {
    	return document.addEventListener ?
    		oEl.addEventListener(sEvType, fn, bCapture || false):
    		oEl.attachEvent ?
    			oEl.attachEvent('on' + sEvType, fn):
    			false;
    };
     
    var load = function() {
     
    	var oUl = document.getElementsByTagName('ul')[0];
     
    	var initAnim = function() {
    		oUl.style.height = 0;
    		oUl.style.overflow = 'hidden';
    		oUl.start = (new Date()).getTime();
    		oUl.interval = 250;
    		oUl.opened = oUl.start + oUl.interval;
    	};
     
    	var stopAnim = function() {
    		oUl.style.height = 'auto';
    		oUl.style.overflow = 'visible';
    		oUl.start = oUl.interval = oUl.opened = null;
    		clearInterval(oUl.exe);
    	};
     
    	var anim = function() {
    		if(!oUl.opened) initAnim();
    		var currentTime = (new Date()).getTime();
    		var diff = oUl.interval - (oUl.opened - currentTime);
    		if(parseInt(oUl.style.height) < oUl.scrollHeight && currentTime < oUl.opened )
    			oUl.style.height = parseInt(diff * oUl.scrollHeight / oUl.interval) + 'px';
    		else stopAnim();
    	};
     
    	oUl.exe = setInterval(anim, 1);
     
    };
     
    connect(window, 'load', load);
     
    		//--></script>
    	</head>
    	<body>
     
    <ul>
    	<li>item 1</li>
    	<li>item 2</li>
    	<li>item 3</li>
    	<li>item 4</li>
    	<li>item 5</li>
    </ul>
     
    	</body>
    </html>
    Merci tout de même le_chomeur de t'être penché sur mon problème; bonne fin de soirée.

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

Discussions similaires

  1. [AC-2007] Augmenter la hauteur d'une liste déroulante
    Par volsan dans le forum Access
    Réponses: 2
    Dernier message: 10/06/2014, 07h56
  2. [PostGreSQL] Charger une liste en fonction de la precedente
    Par angeblanc22 dans le forum PHP & Base de données
    Réponses: 31
    Dernier message: 07/03/2007, 12h33
  3. Réponses: 2
    Dernier message: 29/05/2006, 15h58
  4. Réponses: 7
    Dernier message: 28/02/2006, 16h46

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