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 :

[Newbie] variables dynamiques et eval


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut [Newbie] variables dynamiques et eval
    Bonjour,

    J'ai une question qui me parait simple mais m'as donné pas mal de fil a retordre (et a détordre d'ailleurs)...

    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
     
    for(var i=0;i < pathGlobal.length;i++){
        var monde = {};
        window['Rset'+i] = rsr.set();
        var tmpPath = pathGlobal[i];
        for(var j=0;j < tmpPath.length;j++){
            monde['path_'+i+'_'+j] = rsr.path(tmpPath[j]).attr(attr);
            window['Rset'+i].push(monde['path_'+i+'_'+j]);
        }
     
        for (var state in monde) {
            monde[state].color = Raphael.getColor();
    	 (function (st, state) {
                 var nomSet= eval('Rset'+i);
    	     st[0].onmouseover = function () {
    	          nomSet.animate({fill: "#FFF"}, 500);
    		  nomSet.toFront();
    	     };
    	     st[0].onmouseout = function () {
    	          nomSet.animate({fill: "#333",}, 500);
    		  nomSet.toFront();
                 };
     
    	 })(monde[state], state);
        }
    }
    Ce code as pour but d'afficher des paths et d'highlighter l'ensemble des paths.
    La solution ci dessous fonctionne mais le eval('Rset'+i) fais ramer l'affichage de ma carte.

    Du coup j'ai tenté de mettre en memoire sur chaques path le nom du path parent (lignes changée en gras):
    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
    for(var i=0;i < pathGlobal.length;i++){
    				var monde = {};
    				window['Rset'+i] = rsr.set();
    				var tmpPath = pathGlobal[i];
    				for(var j=0;j < tmpPath.length;j++){
    					path = rsr.path(tmpPath[j]).attr(attr);
    					path.parentSet = 'Rset'+i;
    					monde['path_'+i+'_'+j] = path;
    					window['Rset'+i].push(path);
    				}
    				for (var state in monde) {
    					monde[state].color = Raphael.getColor();
    					(function (st) {
    						//st[0].style.cursor = "pointer";
    						st[0].onmouseover = function () {
    							alert(this.parentSet);
    							nomSet.animate({fill: "#FFF"}, 500);
    							nomSet.toFront();
    						};
    						st[0].onmouseout = function () {
    							nomSet.animate({fill: "#333",}, 500);
    							nomSet.toFront();
    						};
    					
    					})(monde[state]);
    				}
    			}
    Cependant, le alert me renvois undefined au sujet du this.parentSet...

    Du coup je ne vois pas comment faire pour me passer du eval pour cette fonction.
    Je me doute que le probleme provient d'un manque de connaissance de ma part sans trouver laquelle.
    Merci d'avance pour toutes les pistes que vous pourrez proposer.

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 130
    Points
    9 130
    Par défaut
    regle 1: ne pas utiliser eval
    regle 2: ne pas utiliser eval
    regle 3: ne pas utiliser eval

    donc dans ton code un simple window['Rset'+i] retourne la valeur attendue
    mais utiliser window comme un tableau pour stoker des variables c'est pas top

    j'ajouterais donc
    remplace window par myVars et tous ça fonctionnera

    pour finir this est l'objet sur le quel la méthode s'applique.
    si tu défini une fonction anonyme (function (st) { tu n'a aucun objet auquel pourait être attaché cette fonction. ce n'est donc pas la méthode d'un objet. donc vu qu'il n'y a pas d'objet this est undefined

    mon conseil:
    mets tout ça à la poubelle car c'est bien trop compliqué pour rien

    A+JYT

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut
    Merci pour la réponse franche.

    Je vais reprendre mon code...
    C'est le problème quand on débute dans un langage en autodidacte avec les tutos/forum du net

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 146
    Points : 44 948
    Points
    44 948
    Par défaut
    Bonjour,
    C'est le problème quand on débute dans un langage en autodidacte...
    il faut en faire une richesse

    Renseignes toi aussi pendant que tu y ais du coté des "closures" (fermetures) qui peuvent te pourrir tes boucles lors de l'affectation des variables liées au compteur de la boucle.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut
    Je vais jeter un œil aux closures pour voir, merci pour le conseil !

    Le code fonctionnel était effectivement plus simple, même si je viens de découvrir qu'il fallait que j’appelle le path[0] et non le path (spécificités de Raphael apparemment):
    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
    var pathArray = [
    				"M 50,50 50,100 100,100 100,50 Z"
    				,"M 50,150 50,200 100,200 100,150 Z"
    			];
    			myVars['Rset1'] = rsr.set();
    			for(var i=0;i<pathArray.length;i++){
    				myVars['path'+i] = rsr.path(pathArray[i]).attr(attr);
    				myVars['path'+i][0].parentSet = 'Rset1';
     
    				myVars['Rset1'].push(myVars['path'+i]);
     
    				myVars['path'+i][0].onmouseover = function () {
    					myVars[this.parentSet].animate({fill: "#FFF"}, 500);
    					myVars[this.parentSet].toFront();
    				};
     
    				myVars['path'+i][0].onmouseout = function () {
    					myVars[this.parentSet].animate({fill: "#333"}, 500);
    					myVars[this.parentSet].toFront();
    				};
    			}

Discussions similaires

  1. [11g] Variable dynamique (Eval ?)
    Par fifrelin70 dans le forum Oracle
    Réponses: 0
    Dernier message: 20/03/2014, 15h45
  2. Variables dynamiques
    Par CriPpLe dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 12h56
  3. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 12h44
  4. Récupération de variables dynamiques complexes
    Par ludoboy dans le forum ASP
    Réponses: 7
    Dernier message: 24/05/2004, 18h51
  5. [LG]Problême Variable dynamique de types différents
    Par pierrOPSG dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 17h01

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