告别弹窗骚扰:三步打造你的自动关闭弹窗广告脚本(附完整代码)
目录导读
- 为什么弹窗广告是“过街老鼠”?——用户痛点与浏览器生态现状
- 脚本原理拆解——从DOM侦测到自动点击的完整逻辑链
- 手把手实战教学——基于JavaScript与Python的两种主流方案
- 高阶优化与避坑指南——防止误关、性能损耗与常见异常处理
- 核心问答(FAQ)——解决你关于脚本的一切疑问
为什么弹窗广告是“过街老鼠”?

在浏览新闻、查阅资料或在线购物时,突然弹出的全屏遮罩广告、右下角悬浮窗或“假关闭”按钮,不仅严重干扰视线,更可能暗藏恶意链接,据2024年海外安全机构报告,约23%的网页弹窗包含钓鱼风险,虽然浏览器自带的拦截器能过滤部分“开屏弹窗”,但对于网站内通过setTimeout延时加载或伪装成“优惠通知”的动态弹窗,传统拦截几乎无能为力,这正是我们需要自动关闭弹窗广告的脚本的核心理由——精准、即时、可自定义。
脚本原理拆解
自动关闭脚本的本质是“监听-识别-触发”三步曲:
- 监听:通过
MutationObserver(DOM变动观察器)持续监听网页中body节点的新增子元素。 - 识别:一旦检测到新增的高
z-index(层叠优先级)节点,或包含特定关键词(如“立即领取”、“×”样式异常)的元素,判定为弹窗。 - 触发:模拟用户点击该元素上的关闭按钮(通常是
class含close或data-dismiss属性的节点),或直接移除该DOM节点。
手把手实战教学
方案A:浏览器油猴脚本(Tampermonkey)——适用于Chrome/Edge/Firefox
// ==UserScript==
// @name 自动关闭弹窗广告
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 自动移除页面内动态加载的弹窗容器
// @match *://*/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
function killPopup() {
// 常见弹窗根特征:具备以下class或id之一
const popupSelectors = [
'.modal', '.popup', '.dialog', '#modal-root',
'[class*="overlay"]', '[class*="layui-layer"]'
];
popupSelectors.forEach(sel => {
document.querySelectorAll(sel).forEach(node => {
// 排除必要的登录对话框(可加白名单判断)
if (!node.textContent.includes('登录')) {
node.remove(); // 直接移除节点
console.log('[KillPopup] 已移除弹窗:', node.className);
}
});
});
}
// 核心:监听DOM变化
const observer = new MutationObserver(mutations => {
mutations.forEach(m => {
if (m.addedNodes.length > 0) killPopup();
});
});
observer.observe(document.body, { childList: true, subtree: true });
// 页面初始加载时也执行一次
window.addEventListener('load', killPopup);
})();
方案B:Python + Selenium(适用于自动化测试或需模拟真实浏览器的场景)
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://example.com")
time.sleep(3) # 等待页面渲染
# 尝试定位并点击关闭按钮(适用于常规弹窗结构)
try:
close_btn = driver.find_element(By.XPATH, "//div[contains(@class,'close')]")
close_btn.click()
print("已点击关闭按钮")
except:
# 若找不到按钮,则使用JS强制删除父元素
driver.execute_script("""
var items = document.querySelectorAll('.modal, .popup');
items.forEach(item => item.remove());
""")
print("已通过JS移除弹窗容器")
driver.quit()
高阶优化与避坑指南
- 避免“误杀”:许多网站使用
modal类作为正常的图片预览层,优化方案是加入白名单关键词过滤,如仅当弹窗内包含“红包”、“抽奖”、“限时秒杀”等高频广告词时才触发移除。 - 性能损耗控制:
MutationObserver在每个节点变化时都会触发回调,如果页面频繁更新(如直播弹幕),会导致卡顿,建议在回调函数中加入5秒的防抖(debounce)逻辑。 - 特例处理:个别网站使用Shadow DOM(影子DOM)封装弹窗,常规
querySelector无法穿透,需使用document.querySelector('* /deep/ .popup')或改用puppeteer的无头浏览器方案。
核心问答(FAQ)
Q1:安装脚本后,为什么部分弹窗还是无法关闭?
A:这通常是因为弹窗的关闭按钮是客户端事件绑定的,直接删除DOM虽然移除了视觉层,但残留的事件监听可能导致页面报错,建议先尝试模拟点击真正的关闭按钮(button[aria-label="Close"]),若失败再执行node.remove()。
Q2:脚本是否会影响网站的正常功能(如下载文件)? A:有潜在风险,某些网站会将“确认下载”弹窗也做成广告样式,建议在脚本中增加域名白名单数组,对于信任的核心网站(如网银、政府网站)跳过执行。
Q3:是否有现成的浏览器插件替代脚本? A:有,如uBlock Origin(过滤规则)或AdGuard(元素隐藏),但它们的响应速度是“纯CSS隐藏”,即弹窗仍在内存中加载,会消耗流量,而脚本直接移除DOM节点,更彻底且节省资源。
自动关闭弹窗广告的脚本是提升网页浏览舒适度的利器,通过上述两种方案,你只需十几行代码就能实现“弹窗秒杀”的体验,但请务必注意,脚本应仅用于个人浏览器环境,切勿用于攻击或干扰他人网站的正常运营,如果你希望获得更智能的过滤(如基于机器学习识别广告图片),可在搜索引擎中查找“Puppeteer 弹窗拦截”或“Crowdsec 弹窗库”获取进阶思路,打开你的浏览器控制台,亲手写一个属于你的“弹窗终结者”吧!