确定鼠标指针位于Javascript顶部的哪个元素

Tom*_*man 95 javascript mouse dom

我想要一个函数,告诉我鼠标光标在哪个元素上.

因此,例如,如果用户的鼠标位于此textarea(带有id wmd-input)上,则调用window.which_element_is_the_mouse_on()将在功能上等效于$("#wmd-input")

qwe*_*ymk 133

DEMO

有一个非常酷的功能叫做document.elementFromPoint听起来像.

我们需要的是找到鼠标的x和y坐标,然后使用这些值调用它:

var x = event.clientX, y = event.clientY,
    elementMouseIsOver = document.elementFromPoint(x, y);
Run Code Online (Sandbox Code Playgroud)

document.elementFromPoint

jQuery事件对象

  • 答案没有解释什么是“事件”,以及它是如何形成的 (3认同)
  • 惊人的。有没有办法在不捕获事件的情况下获取鼠标的坐标?(可能不是我假设)。如果这是不可能的,那么不幸的是,我不认为这种方法比 `event.target` 或其他方法更好 (2认同)
  • 这是一种奇怪的方式.如果你发现了一个事件,为什么不使用`event.target`? (2认同)

dhe*_*man 58

在较新的浏览器中,您可以执行以下操作:

document.querySelectorAll( ":hover" );
Run Code Online (Sandbox Code Playgroud)

这将为您提供鼠标当前按文档顺序排列的项目的NodeList.NodeList中的最后一个元素是最具体的,每个前面的元素应该是父元素,祖父母元素,等等.

  • 我有一种感觉,它的性能很糟糕.. 在 `mousemove` 上调用它可能会损害性能 (3认同)
  • 当我在其他<li>元素之上拖动`<li>`时,这似乎不起作用。 (2认同)
  • 我用`$(':hover')创建了一个小提琴,但它基本上是一样的:http://jsfiddle.net/pmrotule/2pks4tf6/ (2认同)
  • `(function(){var q = document.querySelectorAll(“:hover”); return q [q.length-1];})()` (2认同)

her*_*h10 44

虽然以下可能实际上没有回答这个问题,因为这是谷歌搜索的第一个结果(谷歌搜索者可能不会问完全相同的问题:),希望它能提供一些额外的输入.

实际上有两种不同的方法来获取鼠标当前所有元素的列表(对于较新的浏览器,可能):

"结构"方法 - 升序DOM树

正如在dherman的回答中,人们可以打电话

var elements = document.querySelectorAll(':hover');
Run Code Online (Sandbox Code Playgroud)

然而,这假设只有孩子将覆盖他们的祖先,这通常是这种情况,但通常不是这样,特别是在处理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;
}
Run Code Online (Sandbox Code Playgroud)

尝试两者,并检查他们的不同回报.

  • @ herrlich10对于https://developer.mozilla.org/en-US/docs/Web/API/Document/elementsFromPoint来说,这似乎是一个不错的填充.如果您的受支持的浏览器集中存在该API,我认为您可以使用它. (4认同)
  • 请参阅“Document.elementsFromPoint(x, y)” /sf/answers/2226411841/ (3认同)

Kar*_*ler 11

elementFromPoint()只获取DOM树中的第一个元素.这对于开发人员的需求来说大多不够.因此有这个很好的功能:

document.elementsFromPoint(x, y) . // mind the 's'
Run Code Online (Sandbox Code Playgroud)

这将返回给定点下的所有元素对象的数组.

对于不支持此版本的旧浏览器,您可以将此答案用作后备

有关旧浏览器兼容性的更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/API/document/elementsFromPoint

  • 它现在在 2018 年得到了很好的支持。 (3认同)

Rob*_*obG 6

鼠标悬停事件会冒泡,因此您可以在主体上放置一个侦听器并等待它们冒泡,然后抓住event.targetevent.srcElement:

function getTarget(event) {
    var el = event.target || event.srcElement;
    return el.nodeType == 1? el : el.parentNode;
}

<body onmouseover="doSomething(getTarget(event));">
Run Code Online (Sandbox Code Playgroud)


Ry-*_*Ry- 5

您可以mouseover在一些合适的祖先上查看事件的目标:

var currentElement = null;

document.addEventListener('mouseover', function (e) {
    currentElement = e.target;
});
Run Code Online (Sandbox Code Playgroud)

这是一个演示。


小智 5

以下代码将帮助您获取鼠标指针的元素。结果元素将显示在控制台中。

document.addEventListener('mousemove', function(e) {
    console.log(document.elementFromPoint(e.pageX, e.pageY)); 
})
Run Code Online (Sandbox Code Playgroud)

  • 如果页面滚动则不起作用。请改用“e.clientX”和“e.clientY”(在 Firefox 59 上测试)。 (3认同)

Zib*_*bri 5

演示:D

在代码片段窗口中移动鼠标:D

<script>
document.addEventListener('mouseover', function (e) {
    console.log ("You are in ", e.target.tagName);
});
</script>
Run Code Online (Sandbox Code Playgroud)