Предлагаемое решение
evt.target == evt.currentTarget
это хорошо, но есть случаи, когда это не помогает.
Пример: структура меню в стиле suckerfish со вложенными списками ul / li.
Событие mousemove происходит от ссылки внутри элемента списка, который является дочерним элементом ul-list, который снова является дочерним элементом другого элемента списка. Типично для html-структуры меню с подменю.
Evt.target будет тегом ссылки, но нас интересует перемещение мыши по элементу списка.
Еще хуже: тег link может содержать теги span или img или другие вложенные элементы. Тогда evt.target будет этот промежуток или img.
Кажется, что здесь работает, чтобы перехватить событие на родительском / корневом элементе, а затем проверить родителей evt.target.
Как это (с JQuery),
var $menu = $('div#menu');
$('body').mousemove(function(evt){
var element = evt.target;
// find the deepest list item that was affected by this mouseover event.
var list_item;
var in_menu = false;
while (element) {
if (element == $menu[0]) {
in_menu = true;
break;
}
else if (!list_item && element.tagName == 'LI') {
// we found a list item, but we are not sure if we are inside the menu tree.
list_item = element;
}
}
// do something with the result.
if (!in_menu) {
.. // close all submenus
}
if (list_item) {
.. // open the submenu for this list item.
}
else {
// mouse in menu, but not hovering an item.
// leave the submenus open. (?)
}
});
Возможно, что-то из этого может быть сокращено с помощью jQuery, например, $ (evt.target) .parents (). Is ($ menu), но я не смог заставить это работать Кроме того, я предполагаю, что этот явный цикл с element.tagName быстрее.