我想要一个函数来告诉我鼠标光标在哪个元素上。
因此,例如,如果用户的鼠标悬停在此文本区域(带有 id wmd-input
)上,则调用window.which_element_is_the_mouse_on()
在功能上等同于$("#wmd-input")
。
我想要一个函数来告诉我鼠标光标在哪个元素上。
因此,例如,如果用户的鼠标悬停在此文本区域(带有 id wmd-input
)上,则调用window.which_element_is_the_mouse_on()
在功能上等同于$("#wmd-input")
。
有一个非常酷的函数叫做document.elementFromPoint
它听起来像什么。
我们需要的是找到鼠标的 x 和 y 坐标,然后使用这些值调用它:
var x = event.clientX, y = event.clientY,
elementMouseIsOver = document.elementFromPoint(x, y);
在较新的浏览器中,您可以执行以下操作:
document.querySelectorAll( ":hover" );
这将为您提供鼠标当前按文档顺序悬停的项目的 NodeList。NodeList 中的最后一个元素是最具体的,前面的每个元素都应该是父级、祖级等等。
虽然以下内容可能实际上并没有回答问题,因为这是谷歌搜索的第一个结果(谷歌人可能不会问完全相同的问题:),希望它能提供一些额外的输入。
实际上有两种不同的方法可以获取鼠标当前所在的所有元素的列表(对于较新的浏览器,也许):
正如在dherman 的回答中,可以打电话
var elements = document.querySelectorAll(':hover');
然而,这假设只有孩子会覆盖他们的祖先,这通常是这种情况,但一般情况下并非如此,尤其是在处理 SVG 时,其中 DOM 树的不同分支中的元素可能相互重叠。
这个方法用于document.elementFromPoint(x, y)
查找最顶层元素,暂时隐藏它(因为我们在同一上下文中立即恢复它,浏览器实际上不会渲染这个),然后继续查找第二个顶层元素......看起来有点hacky,但是当树中存在相互遮挡的兄弟元素时,它会返回您期望的内容。请找到这篇文章以获取更多详细信息,
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;
}
尝试两者,并检查它们的不同回报。
elementFromPoint()
只获取 DOM 树中的第一个元素。这主要是没有足够的开发人员的需求。要在当前鼠标指针位置获取多个元素,这是您需要的功能:
document.elementsFromPoint(x, y) . // Mind the 's' in elements
这将返回给定点下所有元素对象的数组。只需将鼠标 X 和 Y 值传递给此函数。
更多信息在这里:DocumentOrShadowRoot.elementsFromPoint()
对于不受支持的非常旧的浏览器,您可以使用此答案作为后备。
以下代码将帮助您获取鼠标指针的元素。结果元素将显示在控制台中。
document.addEventListener('mousemove', function(e) {
console.log(document.elementFromPoint(e.pageX, e.pageY));
})