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 :

conseils pour fonction récurcive


Sujet :

JavaScript

  1. #1
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut conseils pour fonction récurcive
    Bonjour,

    Le script ci-dessous tente de faire suivre plusieurs fichiers swf en gérant la durée de chacun, les boutons permettent donc de stoper celle en cours et de lancer celle désignée à l'aide du paramètre select. Le soucis c'est que la valeur null semble non réinitialisé et l'animation passe de l'une à l'autre sans respecter le time_swf désigné par i ...

    swf_viewer.js
    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
    var url_files = 'http://www.domaine.com/swf/';
     
    var swf_tab = new Array();
    swf_tab[1] = "fichier1.swf";
    swf_tab[2] = "fichier2.swf";
     
    var time_swf = new Array();
    time_swf[1] = "30000";
    time_swf[2] = "15000";
     
    var desc_swf = new Array();
    desc_swf[1] = "decritption fichier 1";
    desc_swf[2] = "description fichier 2";
     
    var i = 0;
     
    function change_swf(select) {
     
    	document.getElementById('bt_swf1').src = 'images/bt01.png';
    	document.getElementById('bt_swf2').src = 'images/bt02.png';
     
    	if (select == null) {
    		i++;
    		if (i >= swf_tab.length)
    			i = 0;
    		document.getElementById('bt_swf' + i).src = 'images/bt0' + i + '.png';
    	} else {
    		i = select;
    		document.getElementById('bt_swf' + i).src = 'images/bt0' + i + '_on.png';
    	}
     
    	document.getElementById('swf_desc').innerHTML = desc_swf[i];
     
    	var so = new SWFObject(url_files + swf_tab[i], "mymovie", "500", "250", "8");
    	so.addParam("wmode", "transparent");
    	so.write("swf_content");
     
    //	if (select != null) // réinitialise
    //		i = 0;
     
    	setTimeout("change_swf(" + null + ")", time_swf[i]); // null => passe à la suivante
     
    }
    test.html
    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
    <html>
    <head>
     <script type="text/javascript" src="library/swfobject.js"></script>
     <script type="text/javascript" src="swf_viewer.js"></script>
     <link rel="stylesheet" type="text/css" href="css/swf_viewer.css" />
    </head>
     
    <body onload="change_swf(null);">
     
    <div id="swf_content"></div>
    <div id="swf_desc"></div>
     <div id="swf_buttons">
      <a href="javascript:change_swf(1);"><img id="bt_swf1" src="" border="0"></a>
      <a href="javascript:change_swf(2);"><img id="bt_swf2" src="" border="0"></a>
     </div>
     
    </body>
    </html>
    swf_viewer.css
    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
    #swf_content {
    	width: 500px;
    	height: 250px;
    }
     
    #swf_desc {
    	float: left;
    	padding-right: 10px;
    	color: white;
    }
     
    #swf_buttons {
    	float: left;
    	padding-top: 2px;
    }
    Merci pour vos éclaircissements.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    ton problème vient possiblement, de la comparaison entre une chaine de caractère "null" et la valeur null...

    Le mieux serait de regarder les types de variables que tu compares.

    Ou alors, tu te simplifies la vie en renommant ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function change_swf(select=null)
    Comme cela quand tu veux appeler ta fonction avec la valeur null pour le select, tu auras juste à appeler ta fonction de la sorte :
    Puisque ton paramètre prendra par défaut la valeur null si tu ne lui en communiques pas une autre.

    P.S : Pas certain que cette valeur par défaut fonctionne en javascript, ça existe en PHP donc ca doit bien exister en javascript.

    bon courage.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Points : 130
    Points
    130
    Par défaut
    Hello Dominos,

    Je n'ai pas trop compris ton problème de "valeur null qui ne se réinitialise pas".

    Cependant tu peux déjà simplifier ton appel à setTimeout en retirant la concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout("change_swf(null)", time_swf[i])

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par tusssss Voir le message
    P.S : Pas certain que cette valeur par défaut fonctionne en javascript, ça existe en PHP donc ca doit bien exister en javascript.
    En faite, le javascript connait null et undefined. Null doit être explicitement affecté alors que undefined est la valeur d'une variable non affectée.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    Citation Envoyé par sedryk Voir le message
    En faite, le javascript connait null et undefined. Null doit être explicitement affecté alors que undefined est la valeur d'une variable non affectée.
    Merci de la précision, j'avais oublié ce petit détail.

    Cependant mon questionnement était tout autre :

    Quand on écrit une fonction de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function test(attribut="zero") {
         alert(attribut);
    }
    Si on appelle la fonction dans notre page, de la manière suivante :

    La fonction va t-elle fonctionner en faisant apparaitre un alert("zero") ? Ou ne va t-elle pas fonctionner du tout?

    Edit : J'ai ma réponse, ça ne fonctionne pas du tout...

  6. #6
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function test(attribut="zero") {
         alert(attribut);
    }
    Il y a quand même des façons de définir des valeurs par defaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function test(attribut) {
      // si attribut est undefined, il sera aussi "faux", tu peux donc faire
      attribut = attribut || "zero"
    }
    Maintenant, un peu plus propre et pour gérer le cas ou la valeur par defaut doit être false:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function test(attribut) {
      attribut = (typeof(attribut) == "undefined") ? false :attribut;
    }
    après il peut y avoir à gérer le cas du null...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function test(attribut) {
      attribut = (typeof(attribut) == "undefined" || attribut == null) ? false :attribut;
    }
    bref tout dépend de tes besoins
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Points : 130
    Points
    130
    Par défaut
    Au passage,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeof(attribut) == "undefined"
    peut être écris plus simplement
    Ceci dit tant que dominos ne nous répond pas ce n'est que pure rhétorique de ma part

  8. #8
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par sedryk Voir le message
    Hello Dominos,

    Je n'ai pas trop compris ton problème de "valeur null qui ne se réinitialise pas".

    Cependant tu peux déjà simplifier ton appel à setTimeout en retirant la concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout("change_swf(null)", time_swf[i])
    Merci, sinon j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	clearTimeout(t);
    	t=setTimeout("change_swf(null)", time_swf[i]);
    mais je ne sais pas si ça change quelque chose..

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

Discussions similaires

  1. [PHP 5.1] Besoin de conseil pour optimiser une fonction
    Par renaud26 dans le forum Langage
    Réponses: 3
    Dernier message: 14/08/2017, 08h11
  2. demande de conseille pour un probleme sur une fonction
    Par pierre-y dans le forum Général Python
    Réponses: 4
    Dernier message: 19/12/2012, 11h34
  3. Conseil pour fonction addeventlistener
    Par Strasha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2009, 07h15
  4. [AJAX] Un conseil pour améliorer cette fonction d'appel générique ?
    Par RomainVALERI dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 11/12/2008, 13h20
  5. Conseils pour améliorer ma fonction
    Par Sergio29 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/11/2007, 16h50

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