function onMouseOut(event) {
//this is the original element the event handler was assigned to
var e = event.toElement || event.relatedTarget;
if (e.parentNode == this || e == this) {
return;
}
alert('MouseOut');
// handle mouse event here!
}
document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);
J'ai fait une démo rapide en JsFiddle, avec toutes les CSS et HTML nécessaires, regardez-la...
EDIT CORRECTION du lien pour la prise en charge des navigateurs croisés http://jsfiddle.net/RH3tA/9/
NOTE que cela ne vérifie que le parent immédiat, si le div parent a des enfants imbriqués, vous devez d'une manière ou d'une autre parcourir les éléments parents à la recherche de l'"élément originel".
EDIT exemple pour les enfants imbriqués
EDIT Corrigé pour les navigateurs croisés
function makeMouseOutFn(elem){
var list = traverseChildren(elem);
return function onMouseOut(event) {
var e = event.toElement || event.relatedTarget;
if (!!~list.indexOf(e)) {
return;
}
alert('MouseOut');
// handle mouse event here!
};
}
//using closure to cache all child elements
var parent = document.getElementById("parent");
parent.addEventListener('mouseout',makeMouseOutFn(parent),true);
//quick and dirty DFS children traversal,
function traverseChildren(elem){
var children = [];
var q = [];
q.push(elem);
while (q.length > 0) {
var elem = q.pop();
children.push(elem);
pushAll(elem.children);
}
function pushAll(elemArray){
for(var i=0; i < elemArray.length; i++) {
q.push(elemArray[i]);
}
}
return children;
}
Et un nouveau JSFiddle , EDIT lien actualisé
1 votes
J'ai fini par résoudre le problème en utilisant un délai d'attente et en l'effaçant au survol des éléments enfants.
0 votes
Bonjour, j'ai regardé votre démo mais lorsque je passe sur les éléments dans le panneau en bas à droite, rien ne se passe ?
1 votes
J'ai trouvé cette réponse si vous cherchez à empêcher un mouseout sur l'événement parent lorsque vous passez la souris sur un élément enfant : javascript mouseover/mouseout .
1 votes
Regardez @Zach Saucier réponse enterrée ci-dessous