Regardez à l'adresse suivante:
http://www.contentbox.com/claude/test/testEvent.htm
Le script parcoure tous les éléments du document, et pour chaque élément
de liste LI,
il lui assigne un événement de type onmouseover
La fonction appelée par l'événement vérifie le nom de balise de l'objet,
ça devrait toujours être
un LI, mais ô surprise, des fois l'objet est le UL, et dans ce cas une
alarme est déclenchée.
Comment se peut-ce, puisqu'aucun UL n'a d'événement attaché ? Bizarre hein ?
Promenez la souris sur le menu, et tout d'un coup, pouf ! C'est un UL
qui déclenche.
Le plus curieux, c'est que Mords-y-la semble avoir le même problème.
Si c'est un comportement normal, j'aimerais bien en avoir une explication.
Merci.
Voilà le code :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Untitled</title>
<STYLE>
ul {
background-color: #B9D2FF;
margin:0px;
padding: 0;
position:absolute;
border: solid 1px #AAAAAA;
}
ul li {
width: 125px;
margin: 0;
padding: 0;
background-color: #628BFF;
color: #DFE6F5;
border: 1px outset;
list-style: none;
}
UL LI UL {
left:110px;
top:5px;
}
</STYLE>
</head>
<body>
<UL id="0">
<li id="1">item 1
<UL id="1.0">
<li id="1.1">item 1.1</li>
<li id="1.3">item 1.3</li>
<li id="1.4">item 1.4</li>
</ul></li>
<li id="2">item 2</li>
<li id="3">item 3</li>
<li id="4">item 4</li>
</ul>
<SCRIPT>
function init(m)
{
var el = m.childNodes;
for (var l = 0; l<el.length; l++)
{
if(el[l].tagName)
{
var tag = el[l].tagName.toLowerCase();
if (tag == "ul")
{
//do not attach event if UL container, but process its LIs
init (el[l]);
}
else if (tag == "li")
{
//attach event to list element ONLY
if(document.all)el[l].attachEvent('onmouseover', show);
else el[l].addEventListener("mouseover", show, false);
init (el[l]);
}
}
}
}
function show(e)
{
var li;
if (document.all)li=event.srcElement;
else li=e.target;
if (li.tagName != "LI")alert("over" + li.id + " : tag is " +
li.tagName);
}
init(document.body);
</SCRIPT>
Or justement, ça fait partie du fonctionnement de l'event bubbling ...
Ouais, je crois que la clé du problème est là. À mon tour d'avouer avoir mal compris le fonctionnement de srcElement. Je pensais que "Object that receives the event that fired" ça désignait l'élément auquel est attaché l'événement. Or il appert que ça désigne plutôt celui qui a déclenché le processus au départ. Mon sens cartésien m'aura mal guidé, car en effet, qu'est que ça peut bien me ?%$&?* de savoir quel est l'élément déclencheur, ce qui m'intéresse, c'est de connaître l'élément que MOI j'avais choisi pour être mis au courant de l'événement.
La standard y a pensé avec la propriété currentTarget : http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces
(donc sous Mozilla : e.currentTarget).
Mais IE ne suis pas le standard ... Pour avoir +/- le correspondant dans IE (mais ça fonctionne aussi sous Mozilla) on peut avoir recours au mot clé "this" de j(ava)script dans le handler pour autant que le handler soit défini en ligne (<element onclick="blablabla"> ou
element.onclick=handler function handler(){ alert(this.id) bla bla bla }
Décidément, ce standard W3C a été établi par des sombres crétins qui n'ont jamais aligné deux lignes de code dans leur vie. ;-)
-- Jean - JMST Belgium
Or justement, ça fait partie du fonctionnement de l'event bubbling ...
Ouais, je crois que la clé du problème est là.
À mon tour d'avouer avoir mal compris le fonctionnement de srcElement.
Je pensais que "Object that receives the event that fired" ça désignait
l'élément auquel est attaché l'événement.
Or il appert que ça désigne plutôt celui qui a déclenché le processus au
départ.
Mon sens cartésien m'aura mal guidé, car en effet, qu'est que ça peut bien
me ?%$&?* de savoir quel est l'élément
déclencheur, ce qui m'intéresse, c'est de connaître l'élément que MOI
j'avais choisi pour être mis au courant
de l'événement.
La standard y a pensé avec la propriété currentTarget :
http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces
(donc sous Mozilla : e.currentTarget).
Mais IE ne suis pas le standard ...
Pour avoir +/- le correspondant dans IE (mais ça fonctionne aussi sous
Mozilla) on peut avoir recours au mot clé "this" de j(ava)script dans
le handler pour autant que le handler soit défini en ligne (<element
onclick="blablabla"> ou
element.onclick=handler
function handler(){
alert(this.id)
bla bla bla
}
Décidément, ce standard W3C a été établi par des sombres crétins qui n'ont
jamais aligné deux lignes de code dans leur vie. ;-)
Or justement, ça fait partie du fonctionnement de l'event bubbling ...
Ouais, je crois que la clé du problème est là. À mon tour d'avouer avoir mal compris le fonctionnement de srcElement. Je pensais que "Object that receives the event that fired" ça désignait l'élément auquel est attaché l'événement. Or il appert que ça désigne plutôt celui qui a déclenché le processus au départ. Mon sens cartésien m'aura mal guidé, car en effet, qu'est que ça peut bien me ?%$&?* de savoir quel est l'élément déclencheur, ce qui m'intéresse, c'est de connaître l'élément que MOI j'avais choisi pour être mis au courant de l'événement.
La standard y a pensé avec la propriété currentTarget : http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces
(donc sous Mozilla : e.currentTarget).
Mais IE ne suis pas le standard ... Pour avoir +/- le correspondant dans IE (mais ça fonctionne aussi sous Mozilla) on peut avoir recours au mot clé "this" de j(ava)script dans le handler pour autant que le handler soit défini en ligne (<element onclick="blablabla"> ou
element.onclick=handler function handler(){ alert(this.id) bla bla bla }
Décidément, ce standard W3C a été établi par des sombres crétins qui n'ont jamais aligné deux lignes de code dans leur vie. ;-)
-- Jean - JMST Belgium
Claude Schneegans
La standard y a pensé avec la propriété currentTarget :
Ah, merci pour le tuyau.
Mais IE ne suis pas le standard ...
Certes, mais l'ennui, c'est que les clients suivent Microstuff et se foutent pas mal des standards, et moi je suis mes clients...
La standard y a pensé avec la propriété currentTarget :
Ah, merci pour le tuyau.
Mais IE ne suis pas le standard ...
Certes, mais l'ennui, c'est que les clients suivent Microstuff et se
foutent pas mal des standards, et moi je suis mes clients...