OVH Cloud OVH Cloud

Événement déclenché sur un objet erroné

22 réponses
Avatar
Claude Schneegans
Bonjour,

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>

</body>
</html>

2 réponses

1 2 3
Avatar
Jean
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


Avatar
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...

1 2 3