Хотя на самом деле следующее не может ответить на вопрос, так как это первый результат поиска в Google (гуглер может не задавать точно такой же вопрос :), надеюсь, он даст дополнительный ввод.
Естьфактически два разных подхода к получению списка всех элементов, над которыми в данный момент находится мышь (возможно, для более новых браузеров):
«Структурный» подход - восходящее дерево DOM
Как и в ответе Дермана,можно назвать
var elements = document.querySelectorAll(':hover');
Однако это предполагает, что только их дети будут перекрывать своих предков, что обычно имеет место, но в целом это не так, особенно при работе с SVG, где элемент находится в разных ветвях дерева DOM.могут перекрывать друг друга.
«Визуальный» подход - основан на «визуальном» перекрытии
Этот метод использует document.elementFromPoint(x, y)
, чтобы найти самый верхний элемент, временно скрыть его (так как мы немедленно восстанавливаем егов том же контексте браузер фактически не будет отображать это), а затем перейдите к поиску второго по величинеelement ... Выглядит немного странно, но возвращает то, что вы ожидаете, когда, например, элементы дерева и сестры в дереве перекрывают друг друга.Пожалуйста, найдите этот пост для более подробной информации,
function allElementsFromPoint(x, y) {
var element, elements = [];
var old_visibility = [];
while (true) {
element = document.elementFromPoint(x, y);
if (!element || element === document.documentElement) {
break;
}
elements.push(element);
old_visibility.push(element.style.visibility);
element.style.visibility = 'hidden'; // Temporarily hide the element (without changing the layout)
}
for (var k = 0; k < elements.length; k++) {
elements[k].style.visibility = old_visibility[k];
}
elements.reverse();
return elements;
}
Попробуйте оба варианта и проверьте их различный доход.