获取当前在鼠标下的元素而不使用鼠标事件

Bla*_*goh 4 javascript xpcom firefox-addon mouseevent

WRT构建Firefox附加组件.

是否可以通过一些XPCOM或javascript方法获取鼠标下的元素?(非js-ctypes请,因为这需要操作系统特异性)

当用户按下Ctrl+ Shift+ 时,我想检测鼠标下面的内容M.

现在mouseover,当用户按下这个热键时,我正在为文档添加一个监听器,所以当他移动它时我可以在鼠标下面获取该元素,而不是当他按下热键组合时正好在鼠标下面的元素.

nma*_*ier 10

我只是查看源代码获取(或存储并提供)光标位置的代码.我没有找到任何可以使用的东西(来自Javascript,XPCOM或不是).我可能错过了一些东西...... MXR是你的朋友.

但是,如果你想避免mousemove(这通常是一个好主意),你可以只寻找最里面的悬停元素,例如像这样.

function getInnermostHovered() {
    var n = document.querySelector(":hover");
    var nn;
    while (n) {
        nn = n;
        n = nn.querySelector(":hover");
    }
    return nn;
}
Run Code Online (Sandbox Code Playgroud)

(小提琴演示原理)

虽然这是我认为的黑客攻击,但它似乎在大多数情况下都能正常工作,但如果元素通过禁用鼠标事件将会失败pointer-events.可能还有其他我没想过的问题......

当然,当文档没有悬停元素时(例如鼠标实际上不在文档中),这可以不返回任何内容.

  • 这确实是一个聪明的想法 - 我相信它可以被简化,但是使用 querySelectorAll 因为它的顺序应该始终是这样的,即您想要的元素位于末尾。即 `function getInnermostHovered() { return [].slice.call(document.querySelectorAll(':hover')).pop(); }` (2认同)
  • 事实上, `Array.from(document.querySelectorAll(":hover")).pop()` 可以工作,但是对于非常大的文档,根据浏览器引擎,我可以想象它会遍历整个树寻找 `:hover ` 而递归的 `.querySelector` 会尽早修剪子树。或者也许重要的浏览器已经对其进行了足够的优化...需要一些性能测试。 (2认同)