[js] comment bloquer la propagation d'un evenement

comment bloquer la propagation d'un evenement [js] - HTML/CSS - Programmation

Marsh Posté le 21-07-2006 à 15:36:14    

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 ;)
 

Reply

Marsh Posté le 21-07-2006 à 15:36:14   

Reply

Marsh Posté le 21-07-2006 à 16:25:30    

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:

Reply

Marsh Posté le 21-07-2006 à 16:29:35    

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!

Reply

Marsh Posté le 24-07-2006 à 11:07:11    

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>

Reply

Marsh Posté le 24-07-2006 à 11:32:12    

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

Reply

Marsh Posté le 24-07-2006 à 11:48:24    

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:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed