Bonjour,
J'ai une classe javascript gérant des infobulles (des divs d'aide qui s'affichent au survol de la souris)
Elles sont gérées par une classe Infobulle et une classe IfbManager qui s'occupe juste de vérifier qu'on n'a pas plusieurs Ifb (je vais utiliser cette abréviation pour "infobulle" si ça ne vous embête pas) ouvertes en même temps.
Tout fonctionnait très bien jusqu'à ce que j'ajoute une fonctionnalité les rendant "lockables"
C'est à dire qu'elles disposent maintenant d'un petit bouton qui fait qu'elles ne s'effacent plus à la fin du survol.
A ce moment j'ai ce code qui est appelé (version épurée):
Note: this.html_c est un <a> (lors que je crée le contenu de la popup je garde la référence sur le bouton de fermeture)
Maintenant je crée une première ifb lockée d'id "ifb1"
Puis une seconde d'ID "ifb2"
Jusque là tout va bien.
Ensuite je tente de fermer ifb1... c'est ifb2 qui se ferme. (et il m'affiche "ifb2")
En fait, ce qui se passe, c'est que le gestionnaire d'événements ajouté dynamiquement au sein de la classe se rattache à la dernière instance créée de la classe, et non à l'instance au sein de laquelle il a été appelé.
C'est un peu comme si j'appelais un membre statique, sauf que c'est un "this" qui par définition ne peut pas être statique...
Bref, ça n'a pas de sens.
C'est la première fois que je m'attaque à du javascript "objet" (enfin, prétendu tel) donc un truc m'a sans doute échappé...
Déjà c'est assez étrange, je suis obligé d'utiliser une combine, c'est à dire écrire le code sur 2 lignes. En effet le code suivant plante lamentablement:
this.html_c.onclick = function(event) {this.hide();}
Si quelqu'un a compris et peut m'expliquer ce qui se passe...
J'ai une classe javascript gérant des infobulles (des divs d'aide qui s'affichent au survol de la souris)
Elles sont gérées par une classe Infobulle et une classe IfbManager qui s'occupe juste de vérifier qu'on n'a pas plusieurs Ifb (je vais utiliser cette abréviation pour "infobulle" si ça ne vous embête pas) ouvertes en même temps.
Tout fonctionnait très bien jusqu'à ce que j'ajoute une fonctionnalité les rendant "lockables"
C'est à dire qu'elles disposent maintenant d'un petit bouton qui fait qu'elles ne s'effacent plus à la fin du survol.
A ce moment j'ai ce code qui est appelé (version épurée):
// Méthode lock: Convertit en infobulle fixe
Infobulle.prototype.lock = function() {
// Active le bouton de fermeture
oIfb = this;
this.html_c.onclick = function(event) {alert('fermeture de ' + oIfb.id); oIfb.hide();}
}
Note: this.html_c est un <a> (lors que je crée le contenu de la popup je garde la référence sur le bouton de fermeture)
Maintenant je crée une première ifb lockée d'id "ifb1"
Puis une seconde d'ID "ifb2"
Jusque là tout va bien.
Ensuite je tente de fermer ifb1... c'est ifb2 qui se ferme. (et il m'affiche "ifb2")
En fait, ce qui se passe, c'est que le gestionnaire d'événements ajouté dynamiquement au sein de la classe se rattache à la dernière instance créée de la classe, et non à l'instance au sein de laquelle il a été appelé.
C'est un peu comme si j'appelais un membre statique, sauf que c'est un "this" qui par définition ne peut pas être statique...
Bref, ça n'a pas de sens.
C'est la première fois que je m'attaque à du javascript "objet" (enfin, prétendu tel) donc un truc m'a sans doute échappé...
Déjà c'est assez étrange, je suis obligé d'utiliser une combine, c'est à dire écrire le code sur 2 lignes. En effet le code suivant plante lamentablement:
this.html_c.onclick = function(event) {this.hide();}
Si quelqu'un a compris et peut m'expliquer ce qui se passe...