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 :

addEventListener and dispatchEvent


Sujet :

JavaScript

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Points : 86
    Points
    86
    Par défaut addEventListener and dispatchEvent
    Bonjour,

    Je viens vers ici pour présenter un petit soucis que je rencontre sur des events en javascript.
    J'aimerai pouvoir créer un event personnalisé pour prévenir d'autres objets d'une modification. J'ai donc appliquée cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var event = new CustomEvent("build", { "detail": 42});
    divTimeline.dispatchEvent(event);
    et j'attrape ensuite l'event par ce biais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var listenFunction = function (e){
        console.log(e.details);
    }
    divsideTab.addEventListener("build", listenFunction, false);
    sachant que divsideTab et divTimeline sont simplement des html 'div' (respectivement {document.getElementById("sideTab")} et {document.getElementById('mytimeline')}).

    (la méthode que j'ai suivie vient de )

    Je suis preneur d'idées !

    Merci,
    Cordialement,

    G.S.

  2. #2
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Bonjour,

    Il faut renseigner les propriétés de propagation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var event = new CustomEvent("build", { "bubbles": true, "detail": 42 });

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Points : 86
    Points
    86
    Par défaut
    hello Lysandro,

    Merci pour ta réponse.. Alors en un plus complet, un petit exemple qui montre le bug que j'obtiens : je ne reçois jamais l'alerte de mon 'listenFunction'. Cependant, je rentre bien dans le onClickDIV2 sur chaque clic sur ma DIV2 ..
    Quelqu'un voit le probème ?

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <!DOCTYPE html>
    <html>
    <head>
    	<title>HTML JS Events Test</title>
     
     
    	<script type="text/javascript">
     
    		document.addEventListener("DOMContentLoaded", function (event)
    		{
    			console.log('document is ready. I can sleep now');
    			documentOnLoad();
    		});
     
    		function documentOnLoad()
    		{
     
    			var div1 = document.getElementById("div1");
    			var div2 = document.getElementById("div2");
    			function onClickDIV2(event)
    			{
    				var event = new CustomEvent("build", { "bubbles": true, "details": 42 });
    				div2.dispatchEvent(event);
    				alert("onClickDIV2");
    			}
    			function listenFunction (event)
    			{
    				alert("listenFunction");
    			}
    			div1.addEventListener("build", listenFunction, true);
    			div2.addEventListener("click", onClickDIV2, true);
    		}
     
    	</script>
    </head>
    <body>
    	<div id="div1">HELLO DIV#1</div>
    	<div id="div2">HELLO DIV#2</div>
    </body>
    </html>

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Le customEvent build est dispatché sur la div2, or tu l'écoutes sur la div1

  5. #5
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    En plus de ce qu'à répondu SylvainPV, tu enregistres ton listener en mode capture, ce qui veut dire que même si tu fais le dispatchEvent sur div1 ça ne fonctionnera pas.

    Lors d'un dispatchEvent, les listeners enregistrés en mode capture sur un élément ne sont pas déclenchés par un événement issu de cet élement mais uniquement par des événements issus des descendants de cet élément. Donc, en plus de changer le div sur lequel tu effectue le dispatchEvent, il te faut aussi changer le mode d'enregistrement du listener sur ce div, de façon à ce qu'il soit déclenché lors de la phase de dispatch 'at target'.

    A moins qu'il y ait une erreur dans le html et que div2 soit en fait inclus dans div1 ?

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Points : 86
    Points
    86
    Par défaut
    div1 n'est pas inclus dans div2. J'avais juste mal compris le dispatch, je pensais que c'était simplement un moyen de donner un "propriétaire" à l'event lancé mais non les "receveurs".
    Ca marche avec div1.dispatch au lieu de div2.dispatch...

    Merci à vous 2.

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 11h49
  3. mise en page (Header and Footer) en XML-XSL.
    Par christine dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/03/2004, 16h31
  4. SQL :select et AND
    Par Shabata dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/05/2003, 13h39
  5. Fip, modbus and co...
    Par xave dans le forum Développement
    Réponses: 2
    Dernier message: 24/05/2002, 13h25

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