如何检测JavaScript对鼠标移动的监听(浏览器扩展及页面JS方案)
嘿,这两个问题都挺实用的,我来给你详细拆解一下:
有几个靠谱的思路,不管是用浏览器自带工具还是自己写扩展逻辑都能实现:
用浏览器开发者工具快速排查
打开Chrome/Firefox的DevTools(按F12就行),切换到Elements面板,选中<body>或者整个文档节点,然后看右侧的Event Listeners标签,找到mousemove事件——这里会列出所有绑定的回调函数。点击每个回调的链接就能跳转到对应的代码位置,一眼就能知道是不是有脚本在跟踪你的鼠标。
另外,Performance面板也很好用:点击录制按钮,然后移动鼠标,录制结束后在Main线程的调用栈里找mousemove相关的回调执行,能直观看到跟踪行为的触发过程。通过浏览器扩展自定义检测逻辑
如果你要做扩展自动检测,可以重写全局的addEventListener方法,拦截所有绑定mousemove事件的操作,记录下对应的脚本源和回调:const originalAddEventListener = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function(type, listener, options) { if (type === 'mousemove') { // 这里可以记录监听的元素、回调信息,甚至上报到扩展后台 console.log(`抓到mousemove监听:元素${this.tagName},回调内容:${listener.toString()}`); // 要是想阻止跟踪,这里可以不调用原方法,但可能影响页面正常功能 } return originalAddEventListener.call(this, type, listener, options); };别忘了还有用
onmousemove属性绑定的监听,得重写这个属性的setter:Object.defineProperty(Element.prototype, 'onmousemove', { set: function(listener) { console.log(`抓到onmousemove监听:元素${this.tagName}`); this._onmousemove = listener; }, get: function() { return this._onmousemove; } });
你的猜测完全正确,检查DOM监听器确实是可行的方案,不过要注意不同浏览器的支持情况:
用Chromium系浏览器的非标准API:
getEventListeners
Chrome、Edge这类Chromium内核的浏览器提供了getEventListeners全局方法(注意:Firefox不支持这个),能直接获取指定元素上的所有事件监听:// 获取document和body上的mousemove监听 const docListeners = getEventListeners(document).mousemove || []; const bodyListeners = getEventListeners(document.body).mousemove || []; if (docListeners.length + bodyListeners.length > 0) { console.log('页面里有脚本在监听鼠标移动!'); }这个方法简单直接,但要注意事件委托的情况——有些脚本会把监听绑定在
document或父元素上,所以一定要检查顶层元素。标准兼容方案:提前注入脚本记录监听
要是想兼容所有浏览器,最好在页面加载初期就注入脚本,重写addEventListener和onmousemove的setter(就像第一个问题里的扩展逻辑),这样能全程记录所有绑定的mousemove监听,之后只要检查记录的数量就能判断是否存在跟踪脚本。不过这种方法没法捕获页面加载完成前已经绑定的监听,所以时机很重要。特殊情况:轮询鼠标位置的脚本
还有一种少见的跟踪方式:用setInterval轮询鼠标坐标。这种情况你可以通过检测页面中的轮询任务,或者监控clientX/clientY这类鼠标坐标的读取行为来排查,但这种方式效率极低,大部分跟踪脚本不会这么做。
内容的提问来源于stack exchange,提问作者user82587




