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

jQuery Discussion :

Suppression d'événement


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Par défaut Suppression d'événement
    Bonsoir à tous,
    Cet AM je bute sur un pb de gestion des évent handlers avec on/off (jQuery 1.71).
    mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $j(document).on("mouseout mouseover click", '.aDeplier', function () {        if (!e) var e = window.event;
        console.log('mouseEvent : '+e.type);
        if(e.type == "click"){
            $j(this).off("mouseout", function(){
            console.log('Off : C bon')
        }); 
        $j(this).prev('img').attr({src: '../Images/Soustraire-9px.png'});
    } 
    syntheseFideplier(this);
    Explication : lorsque la souris est soit over soit out sur un objet je déclenche des actions par syntheseFideplier(this) qui fonctionne bien. Les choses se gâtent quand je veux neutraliser le mouseout en clichant sur l'objet en utilisant la méthode off comme conseillé dans http://api.jquery.com/off/.


    Si qu'un a une piste d'avance merci

  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
    C'est bien, tu as trouvé la page de la doc. Dommage en revanche que tu ne l'ais pas lue !

    Tout d'abord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!e) var e = window.event;
    Ca te sers à quoi cette instruction ? Un événement jQuery passera toujours en paramètre l'objet event associé.

    Sinon, pour supprimer un événement spécifique comme tu le fais, il faut que la fonction associée soit une fonction qui soit elle-même attachée à l'événement ! Dans ton cas, la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function(){
        console.log('Off : C bon')
    }
    n'est associée à aucun événement.
    Ceci dit, même si c'était le cas, ça ne marcherait pas quand même car pour supprimer une fonction spécifique liée à un événement, il faut que cette fonction soit nommée alors que dans ton cas, ce sont des fonctions anonymes qui sont passées.
    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é
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Par défaut
    Citation Envoyé par Bovino Voir le message
    C'est bien, tu as trouvé la page de la doc. Dommage en revanche que tu ne l'ais pas lue !

    Tout d'abord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!e) var e = window.event;
    Ca te sers à quoi cette instruction ? Un événement jQuery passera toujours en paramètre l'objet event associé.
    A rien C juste un reste d'essai antérieur ! dsl
    Citation Envoyé par Bovino Voir le message
    Sinon, pour supprimer un événement spécifique comme tu le fais, il faut que la fonction associée soit une fonction qui soit elle-même attachée à l'événement ! Dans ton cas, la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function(){
        console.log('Off : C bon')
    }
    n'est associée à aucun événement.
    Ceci dit, même si c'était le cas, ça ne marcherait pas quand même car pour supprimer une fonction spécifique liée à un événement, il faut que cette fonction soit nommée alors que dans ton cas, ce sont des fonctions anonymes qui sont passées.
    Désolé de te contredire mais j'ai parfaitement lu la doc et j'en ai retenu que
    handler(eventObject)
    Type: Function()
    A handler function previously attached for the event(s), or the special value false.
    Ce qui veut dire pour moi qu'une fonction() peut être utilisée ce qui s'avère faux à l'usage j'en conviens !
    Maintenant comment je fais pour supprimer l'évènement mouseout en clichant sur l'objet qui a ce eventListener ?
    Désolé mais je n'ai pas compris tes explications.
    D'avance merci pour ton aide

  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
    Manifestement, tu interprètes mal ce que tu lis.
    A handler function previously attached for the event(s), or the special value false.
    Comme je te l'indiquais, le paramètre à passer est une fonction qui a déjà été associée à l'événement, ce qui n'est pas le cas dans ton code.
    D'autre part, je n'ai jamais dit qu'il ne s'agissait pas d'une fonction... j'ai juste dit qu'utiliser une fonction anonyme n'est pas correct, c'est une référence à une fonction qu'il faut utiliser.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(element).on('click', function(){alert('foo')});
    $(element).off('click', function(){alert('foo')});
    ne fonctionnera pas car contrairement à ce que tu sembles croire, même si le code associé est identique, il ne s'agit pas de la même fonction : tu as juste définis deux fonctions anonymes différentes faisant la même chose.
    Pour pouvoir supprimer un gestionnaire, il faut passer à .off() une référence à la fonction passée à .on(), par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function affiche(){
        alert('foo');
    }
    $(element).on('click', affiche);
    $(element).off('click', affiche);
    Une autre solution est de passer par un namespace pour grouper des événements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(element).on('click.action', function(){alert('foo')});
    $(element).off('click.action');
    mais dans ce cas, le paramètre correspondant au handler est inutile pour les raisons suscitées.

    Bref, rien de très nouveau par rapport à ce que dit la doc et notamment les exemples proposés.
    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é
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Par défaut
    Merci pour ta réponse bien explicite et documentée.
    Je reviens vers toi rapidement après avoir (essayé) de mettre en oeuvre ta solution namepace.
    Encore merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Par défaut
    Décidément j'ai du mal avec ce .off()

    j'ai écrit ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(document).on("mouseout.annulerMO mouseover", '.aDeplier', syntheseFideplier(this) );
    $(document).on("click", '.aDeplier', function(){$(this).off('mouseout.annulerMO', false)});
    Rien ne fonctionne pourquoi ?

    J'ai lu attentivement les exemples donnés par jQuery, je pensais avoir compris mais en fait non.

    Grrrr …. Ou est l'erreur ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/08/2011, 17h21
  2. [Dojo] Suppression de l'événement onKeyPress
    Par DevBetty dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 23/11/2009, 14h48
  3. [Toutes versions] détecter l'événement sur insertion/suppression/renommer de feuille
    Par batou22003 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/09/2009, 15h43
  4. Détecter évènement suppression enregistrement
    Par willytito dans le forum VBA Access
    Réponses: 3
    Dernier message: 09/07/2007, 12h00
  5. [VBA]L'ordre des évènements de suppression
    Par DelphiManiac dans le forum Access
    Réponses: 4
    Dernier message: 10/10/2006, 21h56

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