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 :

Objet Encapsulation Collision


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Objet Encapsulation Collision
    Bonjour,

    Voila, j'ai un petit problème de "collision" sur le code suivant. Au lieu d'afficher successivement 'Chapitre 1' puis 'Chapitre 2', cela affiche 'Chapitre 2' et 'Chapitre 2'.

    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
    var oO = (function() {
     
      var target = 'section'
      var value = ''
     
      function execute() {
        targetNode.appendChild(document.createTextNode(value));
      }
     
      function addEvent(elem, type, func) {
        return elem.addEventListener?
          elem.addEventListener(type, func, false):
          elem.attachEvent?
            elem.attachEvent('on'+type, func):
            elem['on'+type] = func;
      }
     
      return {
        init:
          function(string) {
            value = string;
            targetNode = document.getElementById(target);
            if (targetNode) {
              addEvent(window, 'load', function() {
                execute();
              });
            }
          }
      }
     
     
    }) ();
     
    oO.init('Chapitre 1');
    oO.init('Chapitre 2');
    Si ce code parait disproportionné pour afficher 2 lignes dans le corps de la page, c'est une simplification d'un code plus vaste pour en comprendre l'origine du problème.

    Merci par avance pour votre aide.

  2. #2
    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
    Bonjour et bienvenue sur le forum.

    A chaque fois que tu execute ta methode init, tu assigne une nouvelle valeur au membre privé value.
    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

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui car j'aimerais que cette valeur soit stocker en tant qu'attribut de l'objet afin de pouvoir être utilisé par les méthodes.

    Cependant et c'est là où je ne comprends pas le problème, c'est que le 2ème appel (oO.init('Chapitre 2') semble écraser le premier.

    Est ce qu'il y a une erreur ? Est ce qu'il y a un problème de méthode ?

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par F.P.S. Voir le message
    Cependant et c'est là où je ne comprends pas le problème, c'est que le 2ème appel (oO.init('Chapitre 2'); ) semble écraser le premier.
    C'est effectivement le cas car tes deux appels se font sur la même instance de oO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    new oO.init('Chapitre 1');
    new oO.init('Chapitre 2');
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Donc, je comprends que l'erreur vient du fait que j'utilise la même instance de l'objet oO.

    Par conséquent, je dois créer une nouvelle instance de l'objet oO, ce que j'ai essayé de faire avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    new oO.init('Chapitre 1');
    new oO.init('Chapitre 2');
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oO.init('Chapitre 1');
    oO.init('Chapitre 2');
    Cependant, je me retrouve toujours avec le même problème, cela affiche 'Chapitre2' et 'Chapitre2' au lieu de 'Chapitre1' et 'Chapitre2'.

  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
    Le souci, c'est que oO n'est pas un constructeur. C'est un objet créé par le résultat d'une fonction anonyme.
    Soit tu changes ta méthode init pour qu'elle enregistre différement le listener sur le load :
    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
    var oO = (function() {
      
      var target = 'section'
      var value = ''
      
      function execute(string) {
        targetNode.appendChild(document.createTextNode(string));
      }
      
      function addEvent(elem, type, func) {
        return elem.addEventListener?
          elem.addEventListener(type, func, false):
          elem.attachEvent?
            elem.attachEvent('on'+type, func):
            elem['on'+type] = func;
      }
      
      return {
        init:
          function(string) {
            //value = string;
            targetNode = document.getElementById(target);
            if (targetNode) {
              addEvent(window, 'load', function() {
                execute(string);
              });
            }
          }
      }
      
      
    }) ();
    Soit tu modifies ton code pour gérer plusieurs instances
    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
    var oO = function(string) {
     
      var target = 'section';
      var value = string;
     
      var execute = function(string) {
        targetNode.appendChild(document.createTextNode(value));
      };
     
      var addEvent = function(elem, type, func) {
        return elem.addEventListener?
          elem.addEventListener(type, func, false):
          elem.attachEvent?
            elem.attachEvent('on'+type, func):
            elem['on'+type] = func;
      };
     
      targetNode = document.getElementById(target);
      if (targetNode) {
        addEvent(window, 'load', function() {
          execute();
        });
      }
    };
    // ...
    new oO("Chapitre 1");
    new oO("Chapitre 2");
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    OK, bien noté. Je vais modifier mon script en conséquence.
    Merci pour le coup de main.

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

Discussions similaires

  1. Moteur physique 2D : deux objets en collisions ne peuvent plus bouger
    Par voblivion dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 04/12/2014, 18h50
  2. [Integration] Déterminer le type d'un objet encapsulé par une interface
    Par gains.b dans le forum Spring
    Réponses: 1
    Dernier message: 18/02/2010, 21h29
  3. Gestion d'objet encapsulé et accès aux méthodes.
    Par Ragnarok666 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/03/2009, 14h37
  4. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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