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 :

Nom d'instance dynamique


Sujet :

JavaScript

  1. #1
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut Nom d'instance dynamique
    Salut, je me heurte à un petit probleme en voulant utiliser un nom d'instance dynamiquement.

    Cet objet n'est pas créé dynamiquement mais c'est le nom de son instance qui est recupéré dans un autre objet en vue de l'utiliser.

    Je me crée donc mon objet "knob1" de cette maniere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var knob1 = new slider('knob1', 0, 255 ,'H', 128);
    il s'appelle donc "knob1", le 1er parametre du meme nom indique qu'il doit correspondre avec un objet html de ce nom dans la page.

    Une fois instancié, il va completer un tableau dans un autre objet "WidgetCollector" contenant la liste des objets instanciés et les actions a faire dessus suivant les cas.

    Dans une autre fonction, quand je clique sur un objet html, je recupere son id et donc le nom d'objet associé dans une variable "object".

    Et donc là, a partir de ce moment, je voudrais récuperer les propriétés de cet objet (le mien), je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("LBL_pos").innerHTML = (object.max);
    en pensant que object contenant "knob1" a ce moment il va appeler knob1.max... Et bien non, il m'affiche "undefined" (c'est pourtant 255 dans le code plus haut, si je fais knob1.max ca marche).

    Alors j'aimerais bien savoir comment faire, est-ce la bonne maniere ou bien je me suis trompé autre-part (genre une histoire de portée des variables) ?

    merci

  2. #2
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    marche mais ca me parait affreux non :

  3. #3
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Bon, pas de reponse, dois-je en conclure qu'il n'y a pas d'autre maniere ?
    Du coup j'ai fais comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zobject = eval(object);
    et j'y accede ensuite normalement :
    C'est donc pas si affreux finalement... Je passe mon sujet en résolu mais si quelqu'un connait mieux, ca m'interesse

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    ben non je ne voit pas mieux qu'eval ...

  5. #5
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    doof, les eval c'est affreux, c'est moche, c'est pas portable, et je déteste ça.

    je ne suis pas sûr d'avoir tout compris à ton but final, mais je voudrais simplement te dire qu'on peut souvent se passer de la fonction eval en utilisant des tableaux.

    doof je pense qu'un peu de code m'aiderais à comprendre.

  6. #6
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Oui, en fait un tableau d'objet resoud tres bien le "probleme" ! merci.
    Qu'en est-il pour les fonctions et methodes dynamiques ?

    J'ai à nouveau rencontré ce probleme en voulant "attacher" des fonctions sur mon objet Slider (pour qu'il puisse faire quelquechose quand il bouge quand meme). Et bien encore une fois j'ai du utiliser eval() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function sld_attachMethod(methode)
    {
     index = this.methods.length;
     this.methods[index] = eval(methode);
    }
     
    function sld_runMethods()
    {
     for (i in this.methods) {
      this.methods[i](this.val);
     }
    }
    Ces 2 méthodes viennent completer mon objet Slider (je te met pas tout, y'a 300 lignes).
    De cette maniere, je peux assigner des méthodes a volonté sur mon objet, elle seront toutes appelées dans ma méthode onDrag() qui appelle la méthode runMethods() quand elle est executée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var knob1 = new slider('knob1', 0, 255,'H', 127);
    knob1.attachMethod('setRedColor');
    knob1.attachMethod('showValue');
    En php ca aurait été simple $fonction() mais là si je ne fais pas un eval(), il traiterat toujours this.methods comme un simple tableau de variables.

    Y-a-t-il un solution javascript elegante ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function sld_attachMethod(methode)
    {
     index = this.methods.length;
     this.methods[index] = methode;
    }
     
    function sld_runMethods()
    {
     for (i in this.methods) {
      this.methods[i](this.val);
     }
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var knob1 = new slider('knob1', 0, 255,'H', 127);
    knob1.attachMethod(setRedColor);
    knob1.attachMethod(showValue);
    à moins que je n'ai mal compris le problème.

  8. #8
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Parfait !! Ca marche tres bien !

    Je me demande bien comment j'ai pu coller un eval() ici d'ailleurs.

    Merci bien, tout est "propre" maintenant

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

Discussions similaires

  1. Instance dynamique basé sur nom de variable
    Par Chromozome dans le forum C#
    Réponses: 3
    Dernier message: 15/02/2009, 20h39
  2. Noms de Variables dynamiques
    Par horec dans le forum Langage
    Réponses: 7
    Dernier message: 22/07/2005, 16h47
  3. Nom de fonction dynamique
    Par gege2061 dans le forum C
    Réponses: 2
    Dernier message: 21/06/2005, 14h44
  4. [FLASH MX] Nom de composant dynamique
    Par bobgeldof7 dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2004, 23h07
  5. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44

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