Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer les listeners. Oui, mais...

    7 janvier 2009 à 18:00:24

    Salut,

    Dans le cadre d'un programme en JS, j'attribue des listeners sur un élément en fonction d'un autre élément sélectionné. Je passe par un listener et car j'ai besoin de transmettre une référence d'objet (l'objet sélectionné). Je ne peux pas non plus passer par le gestionnaire d'évènements classique car l'événement en question n'est pas standard (oninput).

    Le problème est que si l'utilisateur sélectionne un autre élément, un nouveau listener est ajouté. Ce qui est gênant, et je n'ai pas la possibilité de supprimer le listener précédemment attaché car je perds sa référence (parce que c'est construit comme ça).

    Donc la question serait, est-ce que vous connaissez un moyen d'identifier tous les listeners d'un élément et de les virer tous ? J'ai pas trouvé ça dans les différentes docs et spec du DOM. Peut-être que quelqu'un connaitrait un bidouillage spécial pour y arriver.

    Je précise que je ne travaille que avec Firefox 3.

    Merci :) .
    • Partager sur Facebook
    • Partager sur Twitter

    Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

      7 janvier 2009 à 19:53:33

      Tu crées une fonction qui remplace addEventListener genre addPerso et dedans, tu utilises un Array pour mémoriser tous les ajouts sur chaque objet. Et à la suppression tu parcours l'array relatif à l'objet à vider pour supprimer les listeners
      • Partager sur Facebook
      • Partager sur Twitter
        7 janvier 2009 à 20:04:20

        J'y ai pensé. C'est faisable si je n'avais pas beaucoup de références à mémoriser, mais dans mon applis, ça risque de montrer très très vite. Je peux pas me permettre de faire ça.

        Le plus simple serait de générer un id unique pour chaque élément, pour passer l'id en paramètre et ne plus avoir besoin de passer une référence d'objet.
        • Partager sur Facebook
        • Partager sur Twitter

        Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

          7 janvier 2009 à 20:24:04

          Il ne reste que ça en effet, mais attention à détruire l'objet avant de définir l'id du suivant sans quoi le conflit peut faire tout planter.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            8 janvier 2009 à 12:10:41

            j'comprends pas.

            Citation

            j'attribue des listeners sur un élément en fonction d'un autre élément sélectionné.


            tu selectionne un élement => pouf t'ajoute des gestionnaires d'évenements à d'autres élements (genre des onclick et compagnie) c'est bien ça?

            qu'est ce que tu appelles un listener?

            tu peux donner un exmple explicite s'il te plait?
            • Partager sur Facebook
            • Partager sur Twitter
              8 janvier 2009 à 12:28:02

              J'ai une liste d'éléments, et quand j'en sélectionne un, j'ajoute un listener oninput sur un autre élément. Je le fais avec addEventListener en transmettant une fonction anonyme. Du fait d'utiliser oninput, je ne peux pas faire oElement.oninput = function() {}

              Le problème c'est que dans la fonction anonyme sont passés des références relatives à l'objet sélectionné, donc à moins de la garder en mémoire dans un objet global, je n'y ai plus accès une fois que l'utilisateur sélectionne un autre élément.

              Je m'étonne en fait que le DOM ne propose pas un oElement.removeEventListener("input"); qui supprimerait tous les évènements oninput du oElement. C'est mal pensé. Tout comme il manque une méthode getEventsListeners().
              • Partager sur Facebook
              • Partager sur Twitter

              Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

              Anonyme
                8 janvier 2009 à 12:43:25

                un peu plus clair mais vague encore. Je comprends bien le problème de var globale et tout

                mais tu l'utilise comment ton truc evènement oninput? a quel moment il est executé? Si tu ajoute le truc avec une fonction anonyme (function () { machin.oninput(monobjet); } je suppose) il sert pas un peu a rien ton évènement perso?

                (et dans l'absolu tu ajouter une methode oninput=function (){} à tous tes noeds html)
                • Partager sur Facebook
                • Partager sur Twitter
                  8 janvier 2009 à 12:51:52

                  Ce n'est pas un évènement perso, ce n'est pas du HTML non plus ^^ . C'est du XUL, et oninput est déclenché quand le contenu d'une zone de texte change.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

                  Anonyme
                    8 janvier 2009 à 17:18:08

                    faut préciser :p

                    bah là comme ça, sans code je vois pas. A part espérer EventListenerList() du DOM3 que personne n'a implémenté…

                    Je préfère me galérer sur du code que sur la théorie, ça marche beaucoup mieux pour moi.

                    mais sinon pourquoi tu peux pas faire Element.oninput ? c'est sensé marché quand même non?

                    et surtout si c'est un évènement tu devrais avoir un objet event avec "target" qui te donne l'objet d'ou est parti l'évènement, donc pas besoin de le passer explicitement. Et puis ça dépend comment ton code est fait, mais tu peux peut etre utiliser une closure pour te faire ton petit contexte où tu as ta variable "globale" sans qu'elle aparaisse dans le vrai contexte global.

                    Un petit morceau de code ça aiderai
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 janvier 2009 à 17:37:21

                      Le oElement.oninput ne marche pas, parce que c'est pas géré nativement, tout simplement ^^ . Je peux le faire moi même en XBL mais ça implique que la valeur transmise sera transformée en string, ce qui foire.

                      Effectivement, je peux peut-être essayer de me démerder avec l'event.target, j'y avais pas pensé.

                      Pour te montrer du code, je vois pas trop ce que ça va changer, à part l'addEvenetListener je vois pas quoi te montrer ^^ .

                      Le problème aussi c'est que la fonction qui se charge d'ajouter le listener est une méthode ajoutée par prototype à une classe. Et que chaque élément sélectionnable est rattaché à une instance de cette classe. Ca facilite pas le bidule, et ça rend le code difficile à lire sans avoir le code complet, organisé en fichier XUL, JS et donc les comportements sont gérés par XBL.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

                      Anonyme
                        8 janvier 2009 à 18:09:39

                        heuuu

                        Citation

                        Attributes

                        cols , decimalplaces , disabled , empty , emptytext , hidespinbuttons , increment , label , max , maxlength , min , multiline , newlines , onchange , oninput , preference , readonly , rows , searchbutton , size , spellcheck , tabindex , timeout , type , value , wrap , wraparound



                        plus bas

                        Citation

                        oninput
                        Type: script code
                        This event is sent when a user enters text in a textbox . This event is only called when the text displayed would change, thus it is not called when the user presses non-displayable keys.



                        ?


                        Y'a pas de classe en javascript, que des objets.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 janvier 2009 à 20:09:36

                          Un attribut n'est pas une propriété. Bien sur que oninput est géré en tant qu'attribut XUL, mais pas en tant que propriété.

                          Et on peut parler de classe par extrapolation, en considérant un objet qui est utilisé comme une classe.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

                          Anonyme
                            9 janvier 2009 à 0:25:34

                            Ton attribut peut très bien contenir une fonction. Une fonction est une valeur que peut avoir une variable en javascript, magie.

                            Classe/objet c'est exactement le même pinaillage sur les mots. Encore que non. Classe sous-endend un modèle objet quelconque. Il n'y en a pas a proprement parler en JS. Juste de l'"augmentation d'objets", on rajoute des méthodes sauvagement aux objets que l'on utilise (et c'est ce qu'il faut faire).

                            Citation : Douglas Crockford

                            Five years ago I wrote Classical Inheritance in JavaScript. It showed that JavaScript is a class-free, prototypal language, and that it has sufficient expressive power to simulate a classical system. My programming style has evolved since then, as any good programmer's should. I have learned to fully embrace prototypalism, and have liberated myself from the confines of the classical model.

                            http://javascript.crockford.com/prototypal.html

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 janvier 2009 à 1:19:57

                              Tu ne m'apprends rien là ^^ .

                              Oui on peut mettre une fonction dans un attribut, heureusement même. Mais dans mon cas ça ne m'intéresse pas car je ne peux l'ajouter que via setAttribute, qui va écraser le code qui s'y trouve déjà (oui, car oninput="" est déjà défini en dur, pour une autre utilisation). C'est pour cela que le listener m'intéressait.

                              Je verrai demain pour le event.target et si ça ne va pas, je me tournerai vers le passage d'un id.

                              Quoi qu'il en soit, ce serait bien que le W3C pense à ces problèmes de suppression de listeners :p
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

                              Anonyme
                                9 janvier 2009 à 1:25:39

                                Je me doute, mais tant qu'on est à pinailler…

                                Sinon si t'as 20 (sous entendu devant toi) y'a pas de problème ça sera réglé pas le W3C…
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Supprimer les listeners. Oui, mais...

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown