Problème de débutant en javascript: evenement fonction

gillespockpock Messages postés 7 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 20 juin 2008 - 23 mai 2008 à 15:30
gillespockpock Messages postés 7 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 20 juin 2008 - 23 mai 2008 à 16:53
Voici mon code (la classe Designer):
Designer = function(){
    this.dom=document.getElementById("area");
    this.tables=[];
   
    this.ajouterTable = function(){
       this.placerTable();
        //this.dom.removeEventListener("click",this.placerTable,false);
    }
   
    this.placerTable = function(){
        var table = new Table (this,"Nouvelle table");//crée une table
        table.initialiser();
        this.tables.push(table);
        alert("c'est fait");
    }
}

Si je fais:
var d = new Designer();
d.ajouterTable();
J'obtiens "C'est fait" (ça marche), 
mais si je modifie la fonction ajouterTable() comme ceci:

this.ajouterTable = function(){

       //this.placerTable();

        this.dom.removeEventListener("click",this.placerTable,false);

    }

lorsque je clique, la fonction placerTable() est bien appellée mais ne va pas jusque au bout, elle semble bloquer sur la ligne "table.initialiser(); ".
POURQUOI ?
Ma classe "Table" est bien programmée, ca semble venir de l'evenement.

4 réponses

gillespockpock Messages postés 7 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 20 juin 2008
23 mai 2008 à 15:35
Pardon c'est ici le bon code:



Voici mon code (la classe Designer):
Designer = function(){
    this.dom=document.getElementById("area");
    this.tables=[];
   
    this.ajouterTable = function(){
       this.placerTable();
        //this.dom.addEventListener("click",this.placerTable,false);
    }
   
    this.placerTable = function(){
        var table = new Table (this,"Nouvelle table");//crée une table
        table.initialiser();
        this.tables.push(table);
        alert("c'est fait");
    }
}

Si je fais:
var d = new Designer();
d.ajouterTable();
J'obtiens "C'est fait" (ça marche), 
mais si je modifie la fonction ajouterTable() comme ceci:

this.ajouterTable = function(){
       //this.placerTable();
        this.dom.addEventListener("click",this.placerTable,false);
    }

lorsque
je clique, la fonction placerTable() est bien appellée mais ne va pas
jusque au bout, elle semble bloquer sur la ligne "table.initialiser();
".
POURQUOI ?
Ma classe "Table" est bien programmée, ca semble venir de l'evenement.
0
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008
23 mai 2008 à 15:53
Salut,

Marre de redire toujours les mêmes choses...

Designer = new function(){
    var _dom   = document.getElementById("area");
    var _tables = [];
    var _that    = this;
   
    this.ajouterTable = function(){
        _dom.addEventListener("click", function() { _that.placerTable(); }, false);
    }
   
    this.placerTable = function(){
        var table = new Table (this, "Nouvelle table");//crée une table
        table.initialiser();
        _tables.push(table);
        alert("c'est fait");
    }
}

Bon pour la peine le code n'est pas testé !
0
ralecul Messages postés 111 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 1 août 2008
23 mai 2008 à 16:05
Ou si placerTable n'a pas besoin d'être publique :

Designer = new function(){
    var _dom   = document.getElementById("area");
    var _tables = [];
    var _that    = this;
   
    this.ajouterTable = function(){
        _dom.addEventListener("click", placerTable, false);
    }
   
    function placerTable(){
        var table = new Table (this, "Nouvelle table");//crée une table
        table.initialiser();
        _tables.push(table);
        alert("c'est fait");
    }
}
0
gillespockpock Messages postés 7 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 20 juin 2008
23 mai 2008 à 16:53
Non ce n'est pas ce que je veux, mais j'ai trouvé, il faut faire un bind(): j'ai ajouté cette fonction:

function bind(objet, methode) {
    //fonction réalisant l'exécution de la méthode dans le contexte de son objet associé
    return function() {
        return methode.apply(objet, arguments);
    }
}

je l'ai appellée ici:
this.ajouterTable = function(){
    this.dom.addEventListener("click", bind(this,this.placerTable) ,false);
}

Ca marche !

Lol _that =this, pourquoi pas!
merci quand même
0
Rejoignez-nous