返回博客

JavaScript 获取鼠标所在区域的 DOM 元素

本文介绍了几种 JavaScript 获取鼠标所在区域 DOM 元素的方法,包括遍历元素、为所有元素添加事件监听器以及在 body 上监听 mousemove 事件,并对每种方法的优缺点进行了分析。最后,文章感谢了提供帮助的群友。

Mt.r
|

近期我在写一个插件,需要获取鼠标移动时,鼠标位置下的 dom 元素。

笨办法,遍历元素标签

遍历页面上所有带 magic-hover 类名的元素

var hoverEls = document.querySelectorAll('.magic-hover');
hoverEls.forEach((item, i) => {
  item.addEventListener('mouseenter', (event) => {
    // 添加鼠标移入事件
  });

  item.addEventListener('mouseleave', (event) => {
    // 添加鼠标移出事件
  });
});

这段代码有个明显的缺点,第一你得主动去给元素添加 magic-hover 的类名

第二,运行代码之后,后面新增的元素不会触发事件

进阶,给所有元素加上事件

document.querySelectorAll('*').forEach(function (node) {
  node.onmouseover = (e) => {
    // 鼠标移入事件
  };
  node.mouseout = (e) => {
    // 鼠标移出事件
  };
});

解决了需要自己给元素加类名问题,但是仍然存在运行代码之后,后面新增的元素不会触发事件这样的问题。

而且存在性能问题,你想想,如果页面上有大量的元素,每个元素都挂载上事件监听,可能会引发性能问题吧。

大佬指点

群里的 凌寒初见资深 API 调用师时间大师_Logic,这三位大佬指出,可以用事件监听方法。直接在 body 上进行监听就可以了,代码如下。

document.body.onmousemove = (event) => {
  console.log('event.target :>> ', event.target);
};

document.body.onclick = (event) => {
  console.log('event.target :>> ', event.target);
};

这两段代码,越用越香,太香太好使了。

然后资深全栈开发(真),chrome 底层开发专家 - 凌寒初见 还指出了 F12 DevTools 中元素选择器的源码地址

源码路径 \third_party\blink\renderer\core\dom\events\event.cc

后记

  • 书山有路勤为径,学海无涯苦作舟 - 代码应该还有优化的余地,但是目前效果已经很棒了。
  • 百度两分钟,群里一小时 - 有时候还是问问群友比较好,通过讨论研究,也能进步。

感谢分享代码的朋友的开源和分享,感谢群友的帮助和支持