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

Ext JS / Sencha Discussion :

Surcharger un event handler


Sujet :

Ext JS / Sencha

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut Surcharger un event handler
    Bonjour,

    J'utilise la librairie OpenLayers (pour la création de cartes) et ExtJS (avec son extension GeoExt qui repose sur OpenLayers).
    J'ai une carte (objet OpenLayers.Map) qui réagit à un click de l'utilisateur. La propriété events permet de gérer les événements de la carte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    map = new OpenLayers.Map();
    map.events.on({
    	click : function(evt){
                 traitement1;
            }
    });
    Je voudrais changer cette réaction directement après le premier click sur la carte. Pour cela, j'ai imbriqué le même click handler dans lui même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    map.events.on({
    	click : function(evt){
                   traitement1;
                   map.events.on({
    	           click : function(evt){
                             traitement2;
                       }
                  });
           }
    });
    Le comportement que j'obtiens au premier click correspond bien au traitement1. Mais au deuxième click j'obtiens le traitement1 et ensuite le traitement2, alors que je ne veux que le traitement2.

    Y a-t-il une façon d'obtenir le résultat que je cherche ?

    Cordialement.

    PS : Dans les codes ci-dessus, je n'utilise qu'OpenLayers : pas de ExtJs. Si il y a une meilleure manière de faire avec ExtJs je suis preneur.

  2. #2
    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 : 55
    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
    Il faut désactiver le premier... J'imagine que si tu as un .on(), il doit y avoir un .off().
    Ceci dit, il faudrait que tu précises certaines choses :
    • à quoi correspondent les éléments présents dans ton code ;
    • quelle librairie tu utilises.
    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

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut
    Effectivement, il y a un "un()" pour désactiver la réaction (de la carte aux événements) que l'on a activée avec "on()".
    La façon de faire est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Cette fonction doit être déclarée à l'extérieur de map.events.on() pour pouvoir désenregistrer l'événement click.
    var mafnc = function(e){...};
     
    // Activer
    map.events.on({
    	click : mafnc
    });
     
    // Desactiver
    map.events.un({
    	click : mafnc
    });
    Mais le problème est que j'ai une erreur avec ce code (sachant que je l'ai déjà utilisé avant sans problèmes dans une application pure OpenLayers, sans ExtJS). L'erreur est dans le fichier OpenLayers.js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TypeError: d.func.apply is not a function
    Cette erreur je ne l'ai pas quand je déclare mafnc dans map.events.on()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    map.events.on({
    	click : function(e){...}
    });
    Mais l'inconvénient, avec ce dernier code, est que je ne peux pas désenregistrer l'événement click puisque map.events.un() a besoin de la fonction-même (non seulement de son contenu) utilisée lors de l'enregistrement de l'événement click.

    J'ai donc pensé à ne pas désenregistrer l'événement click mais à recharger son enregistrement en lui attribuant une fonction qui ne fait rien.
    Tout cela pour éviter l'erreur évoquée ci-dessus.

  4. #4
    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 : 55
    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
    Difficile de comprendre que c'est ExtJS que tu utilises (et donc de te rediriger vers le forum éponyme ).

    Concernant ton problème, c'est le comportement normal.
    Si tu déclares un événement à l'aide d'un gestionnaire du DOM Level 1 (en gros, via les attributs HTML ou propriétés JavaScript onevent), alors ils ne correspondent qu'à des propriétés de l'objet DOM associé et en tant que propriétés peuvent être écrasés par une redéclaration.
    En revanche, l'interface Event (utilisée par la majorité des framework) permet "d'empiler" les déclarations, d'où le comportement que tu as.
    D'autre part, cette interface enregistre une référence à une fonction et avec la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .on(){
        click: function(){...}
    }
    la fonction passée en référence est une fonction anonyme, qui n'aura donc pas la même signature que celle passée dans .un() même si son contenu est identique. Tu ne peux donc pas supprimer un gestionnaire utilisant une fonction anonyme.
    La solution la plus simple serait de transférer ce que tu appelles traitement1 dans une fonction nommée afin de pouvoir l'enregistrer et la supprimer.
    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

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut
    Je te remercie pour cette réflexion.
    En fait, j'utilise les librairies OpenLayers et ExtJS dans mon application (j'ai mis les détails dans mon premier post). Dans la partie du code que j'ai exposée, il n'y a qu'OpenLayers qui est utilisée.
    Je soupçonne que l'erreur obtenue lors de l'exécution de map.events.un() (cf. mon post n.2) est causée par ExtJs car :
    1- le code se situe dans Ext.onReady(function(){...});
    2- quand j'utilise mon application avec OpenLayers et sans aucune autre librairie, je n'ai pas cette erreur.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/08/2007, 13h37
  2. event handler et accès anonyme
    Par @melie dans le forum SharePoint
    Réponses: 5
    Dernier message: 25/08/2007, 19h17
  3. Réponses: 1
    Dernier message: 15/08/2007, 15h45
  4. Birt Event Handler
    Par medbass dans le forum BIRT
    Réponses: 8
    Dernier message: 07/08/2006, 14h51
  5. Problème avec event handler
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2005, 09h31

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