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 :

nettoyer les événements parasites


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Par défaut nettoyer les événements parasites
    J'essaye de faire à la main un gestionnaire de Drag&Drop. Pour le moment, cela fonctionne seulement avec FireFox.

    http://dcaig.free.fr/test/testDragAndDrop.html

    J'ai réglé plusieurs effets de bord en jouant sur les "useCapture", sur les "preventDefault()" et sur les "return false" en fin de fonction de callBack.

    Il me reste un détail gênant : lorsque je drague l'objet, je traîne une sélection temporaire du texte sur le fond de ma page ET dans mon objet dragable. C'est assez disgracieux, surtout si je mets des images.

    Savez-vous comment résoudre ce problème ?

    Archeboc

  2. #2
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Par défaut
    Soyons plus précis. Lorsque je crée mon écouteur de déplacement, j'utilise la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    document.addEventListener(
                  'mousemove', target.dd.modifiePosition, true);
    pourquoi un écouteur sur le document ? Pourquoi est-ce que je ne le mets pas directement sur l'objet à déplacer ? Parce si je le mets directement sur l'objet à déplacer, lorsque ma souris sort de l'objet que je drague (à cause d'un ralentissement machine) il perd l'événement, et l'objet reste en rade derrière ma souris.

    J'ai mis un paramètre useCapture=true. Cela signifie que mon callback est lancé AVANT la descente de l'événement vers le reste du document.

    Par ailleurs, à la fin de mon callback (la fonction modifiePosition), j'ai mis à la fois un preventDefault(), un stopPropagation() et un "return false". Si avec tout cela l'événement arrive à amorcer la descente vers le reste du document, il s'appelle MacGyver.

    Alors quoi ? Y aurait-il un autre événement qui est fired par le browser lorsque je déplace ma souris ?

    Archeboc.

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.onmousedown=function(){return false}

  4. #4
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Citation Envoyé par archeboc Voir le message
    J'ai mis un paramètre useCapture=true. Cela signifie que mon callback est lancé AVANT la descente de l'événement vers le reste du document.
    Je trouve que ta phrase porte un petit peu à confusion, la capture
    permet d'éviter que les gestionaires d'évènement associés à des éléments
    enfants de celui qui capture ne soient appelés. (je sais pas si c'est ce que
    tu entendais par descente de l'évènement)

    La sélection est un traitement par défaut du navigateur, donc comme tu
    l'as dit: preventDefault() semble être la bonne approche. Maintenant, la
    sélection est le fait de mousedown et mousemove, peut-être que le
    preventDefault sur le mousemove est pas suffisant. (cf. javatwister)

    IE6 supporte pas la capture, mais tu n'en as pas besoin. (je sais pas si IE7 supporte)

    Peux-tu poster un peu de code pour qu'on puisse tester ?

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    je te propose une rustine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //variable globale
    var saveSelectionStart = document.onselectstart;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.modifiePosition = function(evt){
       document.onselectstart=function(){ return false; };
       ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.lacheDD = function(evt){
       document.onselectstart=saveSelectionStart;
       ...
    ça supprime ton problème d'affichage disgracieux

  6. #6
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Par défaut
    Avant de cliquer sur le fameux bouton "résolu", est-ce que quelqu'un pourrait m'expliquer la différence entre "return false" et "preventDefault".

    Ce que je comprends, c'est que même si, avec "return false", on bloque l'événement dans la phase de capture, avant qu'il ne touche la cible, ce bloquage ne concerne que les callbacks de mon script, et pas ceux attachés par défaut par le navigateur.

    Sous FF, lorsqu'on fait un drag&Drop sur une image (ex : le bandeau developpez.com du haut de cette page), une icone "interdit" apparaît. Ce comportement par défaut est extrèmement gênant si on veut faire un vrai Drag & Drop, et le "return false" ne suffit pas à le désactiver.

    Je suis preneur de tout élément qui justifie cette observation, et qui explique la différence de fond entre "preventDefault" et "return false".

    Archeboc.

Discussions similaires

  1. Nettoyer les anciens évènements
    Par Pedro4 dans le forum AWT/Swing
    Réponses: 0
    Dernier message: 13/09/2011, 17h24
  2. [JACOB] récupérer les événements d'objet COM
    Par zlavock dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 12/05/2005, 13h07
  3. [HTML] Probleme avec les événement OnChange et OnClick
    Par G_Kill dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 04/05/2005, 16h06
  4. [fenetre à onglets] Intercepter les événements des panels
    Par Regis.C dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 14/04/2005, 10h50
  5. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38

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