广告加载后能否移除?油猴脚本执行顺序及Tampermonkey配置疑问
我之前也碰到过这种动态广告加载导致脚本失效的情况,核心问题就是广告不是页面初始DOM的一部分,而是后续通过JS动态插入的,所以即使脚本在页面加载完成后运行,也赶不上广告的加载时机。下面分两个浏览器的情况给你具体解决方案:
Firefox + Greasemonkey
1. 先调整脚本运行时机
首先可以试试修改脚本的@run-at指令,Greasemonkey默认是document-end,你可以改成:
// @run-at document-idle
这个选项会等到页面所有资源(包括大部分动态脚本)加载完成后再执行,但如果广告是延迟加载的(比如滚动到某个位置才加载),这个方法可能还是不够。
2. 监听DOM变化(终极方案)
对于动态插入的广告,最可靠的方式是用MutationObserver来监听DOM的新增元素,一旦广告元素出现就立即移除。举个简单的例子:
// 替换成你实际要移除的广告元素选择器,比如广告的class是"ad-box" const adSelector = ".ad-box"; // 创建DOM变化观察者 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { // 检查新增节点里的广告元素 const ads = document.querySelectorAll(adSelector); ads.forEach(ad => ad.remove()); }); }); // 配置监听范围:监听body下所有子节点的新增 observer.observe(document.body, { childList: true, subtree: true }); // 先移除页面已加载的广告 document.querySelectorAll(adSelector).forEach(ad => ad.remove());
这个脚本会持续监听页面DOM的变化,不管广告什么时候加载,只要出现就会被移除。
Chrome + Tampermonkey
你提到配置了运行时选项但无效,大概率是因为广告是动态异步加载的,单纯调整运行时机还是追不上广告的加载节奏。Tampermonkey的@run-at选项和Greasemonkey逻辑一致,你可以先确认脚本里有没有设置正确的指令:
// @run-at document-idle
如果还是不行,同样需要用上文的MutationObserver方法,这个方案在两个浏览器是通用的。另外,你可以在脚本开头加一行日志,看看脚本实际执行的时间:
console.log("去广告脚本执行时间:", new Date().toLocaleString());
然后在浏览器开发者工具的Network面板里看广告请求的加载时间,对比一下就能明确是不是脚本执行太早了。
另外,有些网站会刻意隐藏广告元素的特征,这时候你可能需要调整广告选择器——比如通过父元素的class、属性来定位广告,而不是只看广告本身的标识。
内容的提问来源于stack exchange,提问作者Permafr0st

