如何通过Tampermonkey禁用网站指定JavaScript脚本以阻止弹窗
如何通过Tampermonkey禁用网站指定JavaScript脚本以阻止弹窗
嘿,我来帮你搞定这个问题!你在Chrome DevTools里能手动禁用脚本,但要通过Tampermonkey自动实现,核心就是在脚本加载前拦截它的请求,让浏览器根本不执行那个触发弹窗的脚本。下面给你两种可行的方案,按需选择:
方案一:完全拦截目标脚本加载
这种方法最直接,和你在DevTools里禁用脚本的效果一致。需要注意的是,必须让Tampermonkey脚本在页面最开始就运行,才能赶在目标脚本加载前设置拦截。
直接复制下面的代码到你的Tampermonkey脚本里,记得修改对应的网站匹配规则:
// ==UserScript== // @name 拦截框架脚本阻止弹窗 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 拦截指定的framework脚本,阻止触发 unwanted popup // @author 你自己的名字 // @match *://website.com/* // 替换成目标网站的完整域名匹配,比如*://www.website.com/* // @run-at document-start // 关键!必须在文档加载前运行,才能拦截脚本请求 // @grant none // ==/UserScript== (function() { 'use strict'; // 监听所有资源加载前的事件,捕获阶段触发 window.addEventListener('beforeload', function(e) { // 目标脚本的完整URL const targetScript = 'https://website.com/_next/static/chunks/framework-ca706bf673a13738.js'; // 匹配到目标脚本就阻止加载 if (e.target.src === targetScript) { e.preventDefault(); e.stopPropagation(); console.log('成功拦截目标脚本:', targetScript); } }, true); })();
关键细节说明:
@run-at document-start:这行是核心中的核心,只有让Tampermonkey脚本在页面初始化的最早期运行,才能在目标脚本发出请求前就设好拦截器,不然脚本已经加载完就晚了。beforeload事件+捕获阶段:第三个参数true让事件在捕获阶段触发,比默认的冒泡阶段更早处理,能避开网站可能的其他事件监听干扰。- 如果目标脚本的URL会更新(比如哈希值变化),可以改用模糊匹配:
// 只要URL包含指定路径片段就拦截 if (e.target.src.includes('/_next/static/chunks/framework-')) { e.preventDefault(); e.stopPropagation(); }
方案二:仅禁用弹窗函数(不影响脚本其他功能)
如果完全禁用那个脚本后,网站的其他功能出问题了,说明这个脚本是网站必需的。这时候可以换个思路:找到触发弹窗的具体函数,重写它让它失效。
假设触发弹窗的函数叫showUnwantedPopup,可以用下面的脚本:
// ==UserScript== // @name 禁用弹窗触发函数 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 重写弹窗函数,阻止 unwanted popup 弹出 // @author 你自己的名字 // @match *://website.com/* // @run-at document-end // @grant none // ==/UserScript== (function() { 'use strict'; // 重写目标弹窗函数,让它什么都不做 window.showUnwantedPopup = function() { console.log('弹窗函数已被禁用'); // 如果需要保留原函数的部分逻辑,可以在这里调用原函数但跳过弹窗代码 // 比如原函数接收参数,你可以根据需求调整 }; })();
怎么找到弹窗函数?
你可以在Chrome DevTools里:
- 点击弹窗触发的元素,查看绑定的事件
- 在Sources面板里搜索关键词(比如“popup”“modal”),定位到触发弹窗的函数
测试验证
设置好脚本后,刷新目标页面,打开浏览器控制台(F12),如果看到我们脚本里的日志输出,就说明拦截/禁用成功了,再点击触发弹窗的元素,应该就不会弹出那个讨厌的窗口啦。
备注:内容来源于stack exchange,提问作者Digitas Merero




