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 :

référence à une fonction


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut référence à une fonction
    Bonjour,

    Voilà le problème : j'ai une "classe" javascript Ligne . Cette ligne est en fait une ligne d'un tableau sensé lister des documents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var Line = function(doc, i) {
        this.document = doc;//le docuement à représenter
        this.ID = i;
        this.html = Line.getOriginalHTML();//le code html de la ligne à insérer dans le tableau
     
        this.auClic = function() {edit(this.document);}//une fonction à exécuter au clic sur la ligne
    }
    le code html de cette ligne (du type <tr>....</tr>) est initialisé avec Line.getOriginalHTML();

    Ensuite, je le modifie en fonction du document que je veux représenter.

    Le problème vient quand je veux définir un onclick sur cette ligne. J'ai un truc du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maLigne.html = $("elementAModifier", maLigne).attr("onclick",this.auClic);
    Mais avec cette syntaxe, le navigateur exécute immédiatement la fonction this.auClic . Comment lui expliquer qu'il s'agit d'une simple référence?

    Merci

  2. #2
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    j'ai une "classe" javascript Ligne
    (admettons)

    Citation Envoyé par Sharcoux Voir le message
    Le problème vient quand je veux définir un onclick sur cette ligne. J'ai un truc du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maLigne.html = $("elementAModifier", maLigne).attr("onclick",this.auClic);
    Mais avec cette syntaxe, le navigateur exécute immédiatement la fonction this.auClic . Comment lui expliquer qu'il s'agit d'une simple référence?
    C'est une simple référence. Je ne sais pas pourquoi le navigateur l'exécute directement, mais ça m'a plutot l'air d'être un souci lié à la manière d'implémenter ça en jQuery... tu es sur du fonctionnement de la fonction attr ?

    Sinon : as-tu essayé la méthode "standard", avec un vrai gestionnaire d'événement ?

    edit : au fait, je vois que tu appelles Line.getOriginalHTML... à quel endroit est-elle incluse dans ton code ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Merci pour ta réponse

    oui, tu auras noté les guillemets autour du mot "classe". Ca reste qd même un terme pratique.

    attr marche impeccable pour tous les autres éléments, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maLigne.html = $("elementAModifier", maLigne).attr("class",this.document.getType());
    mais pour une raison obscure, il se sent obligé d'évaluer this.auClic dès qu'elle est mentionnée...

    Tu peux m'en dire un peu plus sur la méthode "standard" ?

  4. #4
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Tu peux m'en dire un peu plus sur la méthode "standard" ?
    addEventListener / attachEvent ^^

    ...qui souvent s'utilisent à travers une mini fonction qui switche selon le navigateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function declencheur(cible, condition, effet) {
       if (cible.addEventListener) {
          cible.addEventListener(condition, effet, false);
       }
       else if (cible.attachEvent) {
          cible.attachEvent("on" + condition, effet);
       }
    }
    mais si tu fais du jQuery il doit y avoir mieux que ça non ? ^^

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    mais si tu fais du jQuery il doit y avoir mieux que ça non ? ^^
    Euh... Peut-être, tu penses à quel genre de truc?

    Pour les Event, je vais regarder tout ça, mais est-ce que c'est pas un peu compliqué pour quelque chose d'initialement relativement simple?

    Ah, et je kiff ton générateur de phrases ^^

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    MERCI !!!!
    J'ai trouvé la fonction .click de JQuery (oui, je suis débutant ^^ )
    Ca marche au poil. Merci de m'avoir mis sur la voie

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Bon, en fait, ça marche pas si bien que ça...

    edit: Dans toute la suite, "monElement" désigne l'élément HTML sur lequel je veux activer le clic. "Ma ligne" représentera une instance de Line (classe définie plus haut)

    j'ai dans une méthode de Line :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(monElement).click(this.auClic);
    Effectivement, si je clique sur "monElement", ça lance la fonction this.auClic.

    Sauf que this.auClic, exécute : edit(this.document), et qu'ici, this désigne "monElement", et non plus ma ligne...

    J'ai donc essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(monElement).click(this.auClic(this));
    Line.prototype.auClic = function(objet) {edit(objet.document);}
    Seul problème : this.auClic(this) n'est plus une référence à une fonction, mais un appel de fonction. Le navigateur l'exécute donc immédiatement.

    Deuxième tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(monElement).click(function() {this.auClic(this)});
    Line.prototype.auClic = function(objet) {edit(objet.document);}
    Mais à ce moment là, this représente déjà monElement et plus ma ligne...

    Si vous avez une idée...

    Merci

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Il y a peut-être quelque chose à faire avec des Event comme le suggère Romain, mais n'ayant jamais utilisé ça, je veux bien un coup de main pour mettre ça en place...
    Quel élément doit recevoir le addEventListener ? Quelles infos je suis sensé récupérer de cet event?

    J'ai essayé sans grande conviction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(monElement).addEventListener("click",Line.auClic,false);
    Line.auClic = function(event) {edit(event.document);}
    réponse : addEventListener is not a function...

  9. #9
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    A ce stade, je me demande s'il ne faudrait pas déplacer le thread vers la partie jQuery... ^^

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Pas d'accord avec toi : je me fiche de la méthode, JQuery, DOM, ou n'importe quoi ça me va.

    Mais prenons ton lien. J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(monElement).bind("click",this.auClic);
    Et je retrouve le même problème que précédemment, à savoir que this ne désigne plus ce que je veux...

  11. #11
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    C'est tout à fait normal.
    this référence l'objet qui a appelé la méthode en cours.
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(monElement).click(this.auClic(this));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(monElement).onclick = function(){this.auClic()};
    this référence à chaque fois l'objet appelant, donc soit l'objet HTML monElement soit (dans le cas de jQuery), l'objet jQuery correspondant à $(monElement).
    Pour garder une référence au this du constructeur, il faut passer par un alias (souvent nommé that, me, etc.) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var that = this;
    $(monElement).onclick = function(){that.auClic(that)};
    A noter que comme that est une référence à this, il évolue de la même manière que this :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var Constructeur = function(){
        this.toto = 'toto 1';
        var that = this;
        this.toto2 = 'toto 2';
        alert(that.toto2);
    };
    new Constructeur();
    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

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Bon, j'ai finalement trouvé une solution qui me fait un peu peur, mais tant pis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var Line = function(doc, i) {
        this.document = doc;//le docuement à représenter
        this.ID = i;
        this.html = Line.getOriginalHTML();//le code html de la ligne à insérer dans le tableau
        initialisation();
     }
    Line.prototype = {
        auClic: function(objet) {edit(objet.document);}//une fonction à exécuter au clic sur la ligne
        initialisation; function() {
            var ligne = this;
            $(...monElement...).click(function() {ligne.auClic(ligne);});
        }
    }
    beurk

    Mais bon, ça marche

  13. #13
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Pourquoi beurk ?
    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

  14. #14
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Essaye de faire ça en Java par exemple, et dis-moi ce qu'en pense ton compilateur. Tu vas me dire que c'est pas le même langage, certes, mais ça a tendance à me hérisser un peu le poil de faire "variable = this;" quand l'objet n'est même pas fini d'être créé. Mais vu que javascript se fiche de ce genre de détail, j'imagine que je devrais m'en foutre également. C'est probablement juste un reste de mes anciennes habitudes

  15. #15
    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 : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Non, c'est juste que tu vois JavaScript comme un langage Orienté Objet classique alors que son modèle par prototype ne le rend absolument pas similaire à Java.
    C'est pour ça que même s'il est possible de reproduire le fonctionnement de classes, cette terminologie est inappropriée pour JavaScript
    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

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Par défaut
    JQuery ne propose pas de mécanique de delegate ?

    Car si c’est le cas je te conseille de mutualisé cet mécanique, si tu souhaite associé des méthodes d’objet a des événement. Un truc du genre :

    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
    Function.prototype.Delegate = function(obj)
    {
        var method = this;
        return function() { return method.call(obj, arguments); };
    };
     
    var Line = function(doc, i) {
        this.document = doc;//le docuement à représenter
        this.ID = i;
        this.html = Line.getOriginalHTML();//le code html de la ligne à insérer dans le tableau
        initialisation();
     }
    Line.prototype = {
        auClic: function() {edit(this.document);}//une fonction à exécuter au clic sur la ligne
        initialisation: function() 
        {      
            $(...monElement...).click(this.auClic.Delegate(this);});
        }
    }

  17. #17
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    +1
    Très bien vu. Merci beaucoup pour l'astuce

  18. #18
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652

  19. #19
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Essaye de faire ça en Java par exemple, et dis-moi ce qu'en pense ton compilateur. Tu vas me dire que c'est pas le même langage, certes, mais ça a tendance à me hérisser un peu le poil de faire "variable = this;" quand l'objet n'est même pas fini d'être créé. Mais vu que javascript se fiche de ce genre de détail, j'imagine que je devrais m'en foutre également. C'est probablement juste un reste de mes anciennes habitudes


    T'as raison. Moi pareil en Java : combien de fois j'ai râlé parce que ces feignants de concepteurs (forcément mauvais) du langage avaient "oublié" (la honte) d'implémenter les fonctionnalités et caractéristiques que moi j'aimais bien en FORTRAN

    Comment ça j'exagère ? pff si on peut plus taquiner

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2015, 14h48
  2. [CS5] faire référence à une fonction par concaténation de variable
    Par biumiz dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 30/12/2013, 18h05
  3. [C#] Passer une référence à une fonction
    Par boujouman dans le forum C#
    Réponses: 26
    Dernier message: 16/02/2010, 08h33
  4. [Compiler] Problème de référence à une fonction
    Par Djahny dans le forum MATLAB
    Réponses: 2
    Dernier message: 28/07/2007, 10h38
  5. Réponses: 5
    Dernier message: 06/01/2006, 11h41

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