Aunque es posible que lo siguiente no responda realmente a la pregunta, ya que este es el primer resultado de la búsqueda en Google (es posible que el usuario no haga exactamente la misma pregunta :), espero que proporcione información adicional.
En realidad, hay dos enfoques diferentes para obtener una lista de todos los elementos sobre los que se encuentra actualmente el mouse (para los navegadores más nuevos, tal vez):
El enfoque "estructural": árbol DOM ascendente
Como en la respuesta de Dherman, uno puede llamar
var elements = document.querySelectorAll(':hover');
Sin embargo, esto supone que solo los hijos se superpondrán a sus antepasados, lo que suele ser el caso, pero no es cierto en general, especialmente cuando se trata de SVG, donde los elementos en diferentes ramas del árbol DOM pueden superponerse entre sí.
El enfoque "visual": basado en la superposición "visual"
Este método utiliza document.elementFromPoint(x, y)
para encontrar el elemento superior, ocultarlo temporalmente (ya que lo recuperamos inmediatamente en el mismo contexto, el navegador no lo renderizará), luego busca el segundo elemento superior ... Parece un poco hacky, pero devuelve lo que espera cuando hay, por ejemplo, elementos hermanos en un árbol ocluyéndose entre sí. Encuentre esta publicación para obtener más detalles,
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;
}
Pruebe ambos y compruebe sus diferentes rendimientos.