You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测JavaScript对鼠标移动的监听(浏览器扩展及页面JS方案)

嘿,这两个问题都挺实用的,我来给你详细拆解一下:

1. 如何通过浏览器扩展检测自身鼠标移动是否被某段JavaScript跟踪?

有几个靠谱的思路,不管是用浏览器自带工具还是自己写扩展逻辑都能实现:

  • 用浏览器开发者工具快速排查
    打开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;
      }
    });
    
2. 能否通过JavaScript检测当前页面中是否存在其他JavaScript脚本监听鼠标移动?

你的猜测完全正确,检查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或父元素上,所以一定要检查顶层元素。

  • 标准兼容方案:提前注入脚本记录监听
    要是想兼容所有浏览器,最好在页面加载初期就注入脚本,重写addEventListeneronmousemove的setter(就像第一个问题里的扩展逻辑),这样能全程记录所有绑定的mousemove监听,之后只要检查记录的数量就能判断是否存在跟踪脚本。不过这种方法没法捕获页面加载完成前已经绑定的监听,所以时机很重要。

  • 特殊情况:轮询鼠标位置的脚本
    还有一种少见的跟踪方式:用setInterval轮询鼠标坐标。这种情况你可以通过检测页面中的轮询任务,或者监控clientX/clientY这类鼠标坐标的读取行为来排查,但这种方式效率极低,大部分跟踪脚本不会这么做。

内容的提问来源于stack exchange,提问作者user82587

火山引擎 最新活动