Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
940 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [js] comment bloquer la propagation d'un evenement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[js] comment bloquer la propagation d'un evenement

n°1411176
anapajari
s/travail/glanding on hfr/gs;
Posté le 21-07-2006 à 15:36:14  profilanswer
 

Un bout de code ça sera plus clair :D

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Exemple</title>
  7.   <script type="text/javascript">
  8.   window.onload= function(){
  9.     var nodes = document.getElementsByTagName('body')[0].getElementsByTagName('*');
  10.     for(var i =0; i<nodes.length; i++){
  11.       nodes[i].onmouseover = function(){
  12.         alert(this.tagName);
  13.       }
  14.     }
  15.   }
  16.   </script>
  17. </head>
  18. <body>
  19. <div>
  20.   <p>dlkmsd fsdfmksd mf sdkfmlsdfksdm ds<a href="pouet.html">pouet</a></p>
  21. </div>
  22. </body>
  23. </html>


 
Et là c'est le drame car lors du survol du lien, il m'affiche succèssivement A, P, DIV, ce qui est somme toute logique je vous l'accorde.  
Maintenant comment faire pour que seul le onmouseover du A soit pris en compte lors du survol de A ( et pas ceux de ses noeuds parents).
J'ai bien trouvé une solution dégueu: remonter tous les noeuds parents et annuler les onmouseover, puis lors du onmouseout les remettre. Mais c'est franchement lourd.
Donc si quelqu'un a une autre solution, je suis preneur ;)
 

mood
Publicité
Posté le 21-07-2006 à 15:36:14  profilanswer
 

n°1411183
gatsu35
Blablaté par Harko
Posté le 21-07-2006 à 16:25:30  profilanswer
 

anapajari a écrit :

Un bout de code ça sera plus clair :D

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Exemple</title>
  7.   <script type="text/javascript">
  8.   window.onload= function(){
  9.     var nodes = document.getElementsByTagName('body')[0].getElementsByTagName('*');
  10.     for(var i =0; i<nodes.length; i++){
  11.       nodes[i].onmouseover = function(){
  12.         alert(this.tagName);
  13.       }
  14.     }
  15.   }
  16.   </script>
  17. </head>
  18. <body>
  19. <div>
  20.   <p>dlkmsd fsdfmksd mf sdkfmlsdfksdm ds<a href="pouet.html">pouet</a></p>
  21. </div>
  22. </body>
  23. </html>


 
Et là c'est le drame car lors du survol du lien, il m'affiche succèssivement A, P, DIV, ce qui est somme toute logique je vous l'accorde.  
Maintenant comment faire pour que seul le onmouseover du A soit pris en compte lors du survol de A ( et pas ceux de ses noeuds parents).
J'ai bien trouvé une solution dégueu: remonter tous les noeuds parents et annuler les onmouseover, puis lors du onmouseout les remettre. Mais c'est franchement lourd.
Donc si quelqu'un a une autre solution, je suis preneur ;)


http://gatsu.ftp.free.fr/html/popu [...] ipale.html :whistle:

n°1411185
anapajari
s/travail/glanding on hfr/gs;
Posté le 21-07-2006 à 16:29:35  profilanswer
 

s'pas beau :o
Parce que moi du coup je suis obligé de me coller un onmouseout sur tous mes objets ... D'ailleurs...
Atta je teste je reviens!

n°1412126
anapajari
s/travail/glanding on hfr/gs;
Posté le 24-07-2006 à 11:07:11  profilanswer
 

2 jours plus tard ... :o
 
Bon même si je voulais eviter la variable en global pour resoudre ce problème, j'ai fini par faire comme dans ton truc gatsu. Seul différence avec le onclick, étant donné qu'il faut gérer le mouseover/out je mets l'objet survolé dans la-dite variable et non juste un booléen.
 
J'en avais besoin, en gros pour faire une demo sur le code html d'une page. ça marche nickel sous FF, mais il y a 2/3 merdouilles sous IE ( par exemple les retours à la ligne sont niqués et il rajoute encore des attributs sur les inputs), mais m'en fous un peu :D
Voila le source(non commenté, et bien gorret par endroit) si ça interesse quelqu'un:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Source html Element</title>
  7.   <script type="text/javascript">
  8.   //<![CDATA[
  9.   var highLightColor = 'red';
  10.   var elOver = null;
  11.   window.onload = function (e){
  12.     var aNode = document.createElement('a');
  13.     aNode.appendChild(document.createTextNode('Demarrer'));
  14.     aNode.setAttribute('id', 'start');
  15.     aNode.setAttribute('href', 'nojs.html');
  16.     aNode.onclick = function (e){
  17.       startDemo();
  18.       return false
  19.     }
  20.     document.getElementsByTagName('body')[0].appendChild(aNode);
  21.   }
  22.   function startDemo(){
  23.     nodes = document.getElementsByTagName('body')[0].getElementsByTagName('*');
  24.     for(var i = 0; i<nodes.length; i++){
  25.       if ( nodes[i].id != 'start' ){
  26.         nodes[i].onmouseover = function (e){
  27.           if ( elOver == null){
  28.             elOver = this;
  29.             this.style.backgroundColor = highLightColor;
  30.             displaySrc(this);
  31.           }
  32.         }
  33.         nodes[i].onmouseout = function(e){
  34.           if ( elOver == this){
  35.             elOver = null;
  36.           }
  37.           this.style.backgroundColor = '';
  38.         }
  39.       }
  40.     }
  41.     var dispContent = document.createElement('div');
  42.     dispContent.setAttribute('id','dispContent');
  43.     var clDemo = document.createElement('input');
  44.     clDemo.setAttribute('type', 'button');
  45.     clDemo.setAttribute('value', 'X');
  46.     clDemo.onclick = endDemo;
  47.     dispContent.appendChild(clDemo);
  48.     var dispNode = document.createElement('div');
  49.     dispNode.setAttribute('id','dispNode');
  50.     dispContent.appendChild(dispNode);
  51.     document.getElementsByTagName('body')[0].appendChild(dispContent);
  52.   }
  53.   function endDemo(){
  54.     document.getElementById('dispContent').parentNode.removeChild(document.getElementById('dispContent'));
  55.     nodes = document.getElementsByTagName('body')[0].getElementsByTagName('*');
  56.     for(var i = 0; i<nodes.length; i++){
  57.       if ( nodes[i].id != 'start' ){
  58.         nodes[i].onmouseover = null;
  59.         nodes[i].onmouseout = null;
  60.       }
  61.     }
  62.   }
  63.   function displaySrc(el){
  64.     try{
  65.       var nodeSrc = ''
  66.       for(var i=0; i<el.attributes.length; i++){
  67.          nodeSrc += el.attributes[i].nodeName+"='"+el.attributes[i].value+"' ";
  68.       }
  69.       nodeSrc = "<"+el.tagName.toLowerCase()+" "+nodeSrc;
  70.       if ( el.innerHTML.length != 0){
  71.         nodeSrc += ">"+el.innerHTML+"</"+el.tagName.toLowerCase()+">";
  72.       } else {
  73.         nodeSrc += "/>";
  74.       }
  75.       nodeSrc = nodeSrc.replace("background-color: "+highLightColor+";", '');
  76.       nodeSrc = nodeSrc.replace(/ style=('|" ){2}/g, '');
  77.       /*** needed for IE ***/
  78.       nodeSrc = nodeSrc.replace(/ [A-z]+=''/g, '');
  79.       nodeSrc = nodeSrc.replace(/ [A-z]+='null'/g, '');
  80.       nodeSrc = nodeSrc.replace(/ hideFocus='false'/, '');
  81.       nodeSrc = nodeSrc.replace(/ disabled='false'/, '');
  82.       nodeSrc = nodeSrc.replace(/ tabIndex='0'/, '');
  83.       nodeSrc = nodeSrc.replace(/ contentEditable='inherit'/, '');
  84.       nodeSrc = nodeSrc.replace(/ +>/, '>');
  85.       /*** end IE ***/
  86.       document.getElementById('dispNode').innerHTML = '<xmp>'+nodeSrc+'</xmp>';
  87.     }
  88.     catch(ex){
  89.       alert("Unknown element" );
  90.     }
  91.   }
  92.   //]]>
  93.   </script>
  94.   <style type="text/css">
  95.   fieldset{
  96.     margin: 10px;
  97.   }
  98.   form{
  99.     padding: 10px;
  100.     background-color: blue;
  101.   }
  102.   #dispContent{
  103.     position: absolute;
  104.     left: 0px;
  105.     bottom: 0px;
  106.     border: 1px solid black;
  107.     margin: 5%;
  108.     width: 90%;
  109.     height: 200px;
  110.     background-color: white;
  111.   }
  112.   #dispNode{
  113.     margin: 5px;
  114.     border: 1px solid black;
  115.   }
  116.   </style>
  117. </head>
  118. <body>
  119. <h1>Demonstation</h1>
  120. <p>Un paragraphe de blabla avec <a href="lien.html">un lien</a></p>
  121. <form action="truc" method="post">
  122.    <fieldset class="f">
  123.      <legend>Champs 1</legend>
  124.      <input type="text" name="f1" id="champs1" value="pouet"/>
  125.    </fieldset>
  126. </form>
  127. <div>
  128.    <p> Blavlfm dcmdlaa <span id="s" style="font-weight:bolder;">span</span></p>
  129. </div>
  130. </body>
  131. </html>

n°1412159
gizmo
Posté le 24-07-2006 à 11:32:12  profilanswer
 

Et pourquoi tu n'utilises pas simplement l'event canceling? http://www.quirksmode.org/js/events_order.html

n°1412178
anapajari
s/travail/glanding on hfr/gs;
Posté le 24-07-2006 à 11:48:24  profilanswer
 

gizmo a écrit :

Et pourquoi tu n'utilises pas simplement l'event canceling? http://www.quirksmode.org/js/events_order.html


Raaha voila une solution propre comme je les aime :love:  ( sauf evidement la différence d'implémentation IE/FF mais c'est pas comme si c'était surprenant)...
 
Merci bien pour ce lien  :jap:  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [js] comment bloquer la propagation d'un evenement

 

Sujets relatifs
Bloquer un script pour attendre la fin des traitements[WinForm] ContextMenu : évènement quand le menu disparait
Annuler un évènement javasript (RESOLU)Bloquer l'accès à un fichier utilisé
[WxWidgets] Evènement clavierFaire durer un évènement pendant x jours en php
wxWidgets déclencher un evenement à une date préciseBloquer l'accès d'un répertoire
Détecter un évènement dans une classeBloquer le champ texte d'un input type file
Plus de sujets relatifs à : [js] comment bloquer la propagation d'un evenement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR