В Chrome, как вы обнаружили, событие mouseout
вызывается всякий раз, когда вы переходите от родительского элемента (для которого зарегистрирован обработчик) и дочерних элементов, содержащихся в нем.
Простое исправление заключается виспользуйте jQuery, который будет имитировать mouseleave
события (которые не страдают от этой проблемы) в браузерах, которые его не поддерживают.
В качестве альтернативы, в вашем обработчике mouseout
посмотрите на свойство toElement
события, и просмотрите его родительский список и посмотрите, есть ли ваш первоначальный родитель в этом списке.Обрабатывайте свое действие только в том случае, если его нет в списке.
document.getElementById('outer').addEventListener('mouseout', function(ev) {
var el = ev.toElement;
while (el && el !== document.body) {
if (el === this) {
console.log('mouseout ignored');
return; // enclosed - don't do anything
}
el = el.parentNode;
}
console.log('mouseout');
}, false);
демо на http://jsfiddle.net/raybellis/s4EQT/