AddEventListener et objet avec this

Résolu
Shinji49 Messages postés 18 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 25 juin 2009 - 21 mai 2008 à 18:35
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 - 22 mai 2008 à 07:11
Bonjour,

J'ai beau rechercher partout, je ne trouve pas la solution ! J'ai tout essayé mais rien n'y fait.

Alors, voila, je souhaite ajouter une fonction à la liste des evenements, mais hélas, le mot clé this qui est à l'intérieur de cette fonction se réfère au div et non a mon objet ! Essayez ceci :

<script type="text/javascript">
monObjet= function(args){
    // Appel méthode : initiatilisation.
    this.iniT(args.id, args.titre || 'defaut');
}

// Méthode : initialisation.
monObjet.prototype.iniT = function(id,titre){
    // Variables.
    this.id = id;
    this.titre = titre;
    var test = document.getElementById('testia');

    /* Evènements *************************************************************/
    this.navig = navigator.appName;
    if(this.navig =='Microsoft Internet Explorer'){
            test.attachEvent('onclick',this.affMonID);
    }else{
            test.addEventListener('click',this.affMonID,false);
    }
    /**************************************************************************/
}
monObjet.prototype.affMonID = function(){
    alert(this.id);
    alert(this.titre);
}
</script>

TESTI TESTI TESTI

<script type="text/javascript">
var testi = new monObjet({id:'testi', titre:'test'});
</script>

Lorsque vous cliquez vous vous rendez compte que la variable this.id vaut "testia", soit l'id du div ! Et que la variable this.titre est indéfinie. Donc, moi ce que je souhaite c'est pouvoir acceder par exemple à la variable titre de mon objet.

Savez vous comment faire ? Car c'est fou ce qu'il n'y a pas d'informations la dessus. Ha si, j'ai vu une solution qui consitait a mettre dans des tableaux... je trouve pas ça top...

Merci.

5 réponses

ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008
21 mai 2008 à 19:26
Salut,

Voici une solution :

monObjet.prototype.iniT = function(id,titre){
    // Variables.
    this.id = id;
    this.titre = titre;
    var test = document.getElementById('testia');

    var that = this;
 
    if (test.addEventListener)
            test.addEventListener('click', function() { that.affMonID(); },  false);
    else if (test.attachEvent)
            test.attachEvent('onclick', function() { that.affMonID(); });
}

De nombreux problèmes :
- impossible de retirer les event  : removeEventListener / detachevent ne marche pas avec une fonction anonyme.
- code dupliqué pour l'ajout de l'event : on peut faire facilement une méthode d'ajout d'event cross-browser :

//Equivalent simpliste de Event.observe(element, eventName, handler[, useCapture = false]) de prototype.js
function addEvent(element, eventName, callback)
{
   if (element.addEventListener)
      element.addEventListener(eventName, callback, false);
   else if (element.attachEvent)
      element.attachEvent('on'+eventName, callback);
}

Donc dans ton objet celà devient :
addEvent(test, "click", function() { that.affMonID(); });

//Avec prototype :
Event.observe(test, "click", function() { that.affMonID(); }, false); //non testé

@+
3
Shinji49 Messages postés 18 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 25 juin 2009
21 mai 2008 à 18:37
A ce propos, j'ai regardé du coté de Call pour faire passer la référence de mon objet mais sa n'a pas l'air de fonctionner.
0
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
21 mai 2008 à 19:07
Salut,

Regarde du côté de prototype et fait une recherche sur le binding !

a++

Si la réponse vous convient, pensez : Réponse accepté !
0
Shinji49 Messages postés 18 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 25 juin 2009
21 mai 2008 à 21:12
nicomilville : tu me parle de prototype -> le framework ? Ou de la methode prototype ?

ralecul : ta solution fonctionne ! C'est comme même fou que ce soit mal foutu a ce niveau Javascript ! lol Bref, je m'en contente. Par contre, au niveau des problème, je comprend pas trop ? Comment sa code dupliqué ?

Cross-browser signifie compatible tout navigateur ?

Merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
22 mai 2008 à 07:11
Je te parle du framework prototype, normalement il fournis deux methode pour le binding :

par exemple bind enfin un truc comme ça !

a++

Si la réponse vous convient, pensez : Réponse accepté !
0
Rejoignez-nous