Хотя нижеследующее может фактически не отвечать на вопрос, поскольку это первый результат поиска в Google (гуглер может не задавать точно такой же вопрос :), надеюсь, он предоставит дополнительные данные.
На самом деле существует два разных подхода к получению списка всех элементов, над которыми в данный момент находится мышь (возможно, для новых браузеров):
«Структурный» подход - восходящее дерево DOM
Как и в ответе Дхермана , можно позвонить
var elements = document.querySelectorAll(':hover');
Однако это предполагает, что только дочерние элементы будут перекрывать своих предков, что обычно имеет место, но в целом неверно, особенно при работе с SVG, где элементы в разных ветвях дерева DOM могут перекрывать друг друга.
«Визуальный» подход - основан на «визуальном» перекрытии.
Этот метод используется, document.elementFromPoint(x, y)
чтобы найти самый верхний элемент, временно скрыть его (поскольку мы восстанавливаем его немедленно в том же контексте, браузер фактически не будет его отображать), а затем перейдите к поиску второго самого верхнего элемента ... Выглядит немного хакерским, но он возвращает то, что вы ожидаете, когда есть, например, элементы-братья и сестры в дереве, перекрывающие друг друга. Пожалуйста, найдите этот пост для более подробной информации,
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;
}
Попробуйте оба варианта и проверьте их разные варианты возврата.