alert,confirm,prompt:浏览器自带的模态对话框。window.open():用于打开新窗口或标签页,常被滥用弹出广告。NotificationAPI:现代浏览器提供的桌面通知功能。
下面我将分别介绍如何禁止或控制这三种消息。

(图片来源网络,侵删)
禁止 alert, confirm, prompt
这三种方法是阻塞式的,会中断脚本的执行和用户的交互,要禁止它们,最直接的方法就是覆盖它们。
全局覆盖(推荐)
这是最常用且最有效的方法,你可以在你的脚本运行前,先重写这些方法。
// 覆盖 alert 方法
window.alert = function(message) {
// 你可以什么都不做,让它静默消失
// console.log('一个 alert 被阻止了:', message);
};
// 覆盖 confirm 方法
window.confirm = function(message) {
// 阻止 confirm,并默认返回 false(或者 true,取决于你的需求)
console.log('一个 confirm 被阻止了:', message);
return false; // 或者 return true;
};
// 覆盖 prompt 方法
window.prompt = function(message, defaultValue) {
// 阻止 prompt,并返回 null
console.log('一个 prompt 被阻止了:', message);
return null;
};
// 当网页中执行 alert("Hello"); 时,将不会弹出对话框,而是会执行我们自定义的空函数。
优点:
- 简单直接,一劳永逸。
- 可以捕获并记录所有被阻止的调用,方便调试。
缺点:

(图片来源网络,侵删)
- 如果某个网页的功能依赖于
confirm或prompt的返回值(一个“删除”按钮需要用户confirm),直接返回false或null可能会导致该功能异常。
在控制台执行
如果你只是想在当前网页临时禁止,可以在浏览器开发者工具的控制台中粘贴上面的代码并回车。
禁止 window.open() 弹出窗口
window.open() 主要用于打开新标签页或窗口,但也常被用于广告弹窗,控制它比控制 alert 稍复杂一些,因为它可能是由用户点击事件触发的。
全局覆盖 window.open
和 alert 类似,我们可以覆盖 window.open 方法。
// 记录原始的 open 方法
const originalOpen = window.open;
// 覆盖 open 方法
window.open = function(url, target, features) {
// 你可以在这里添加逻辑来决定是否允许打开
// 只允许特定域名打开
const allowedDomains = ['example.com', 'my-safe-site.org'];
const isAllowed = allowedDomains.some(domain => url.includes(domain));
if (isAllowed) {
console.log('允许打开:', url);
return originalOpen.call(this, url, target, features);
} else {
console.log('阻止打开:', url);
// 返回 null,表示打开失败
return null;
}
};
更严格的禁止(阻止所有):
const originalOpen = window.open;
window.open = function() {
console.log('一个 window.open 调用被阻止了。');
return null;
};
结合事件委托(处理广告)
很多弹窗广告是通过 window.open 在一个 click 事件处理器中触发的,我们可以利用事件委托来阻止它们。
// 阻止所有非用户主动触发的 window.open
// 这个方法更复杂,通常用于浏览器扩展或高级用户脚本
document.addEventListener('click', function(event) {
// 检查事件的目标是否是一个可能触发弹窗的元素
// 检查它的 href 或 onclick 属性
const element = event.target;
if (element.tagName === 'A' || element.tagName === 'BUTTON') {
// 检查点击事件是否是“真正的”用户点击
// 这里的逻辑可以很复杂,例如检查事件可信任性等
// 一个简单的判断是检查事件是否由鼠标或触摸触发
if (event.isTrusted) {
// 如果是用户主动点击,我们允许它
// 但我们仍然可以在这里拦截并检查 URL
console.log('用户点击了:', element);
}
}
}, true); // 使用捕获阶段,以便在事件触发前拦截
重要提示:现代浏览器(如 Chrome, Firefox)有内置的弹出窗口阻止程序。window.open 不是在用户直接点击事件(如 onclick)中调用的,它通常会被浏览器自动阻止。
禁止 Notification API 桌面通知
这是现代网站请求发送到你桌面(操作系统级别)的通知,用户通常可以在浏览器设置中全局管理这些权限。
在浏览器设置中禁用(推荐)
这是最根本、最有效的方法。
- Chrome / Edge: 设置 -> 隐私和安全 -> 网站设置 -> 通知 -> 不允许网站发送通知。
- Firefox: 设置 -> 隐私与安全 -> 权限 -> 通知 -> 去掉“允许网站发送通知”的勾选。
通过代码拒绝权限请求
如果网站正在请求通知权限,你可以在你的脚本中模拟用户点击“拒绝”。
// 检查当前的权限状态
// 'default' = 用户尚未决定
// 'granted' = 已授权
// 'denied' = 已拒绝
if (window.Notification && Notification.permission === 'default') {
// 如果权限是默认状态,我们可以直接请求,然后模拟拒绝
// 注意:这不能强制拒绝,它只是改变了请求的结果
Notification.requestPermission().then(function(permission) {
// 我们无法改变用户的选择,但我们可以记录
console.log('用户对通知的最终选择是:', permission);
});
}
// 更激进的方法:覆盖 requestPermission
const originalRequestPermission = Notification.requestPermission;
Notification.requestPermission = function() {
console.log('一个网站正在请求通知权限,已自动拒绝。');
// 直接返回一个已拒绝的 Promise
return Promise.resolve('denied');
};
// 这样,任何调用 Notification.requestPermission() 的代码都会立即得到 'denied' 的结果。
总结与最佳实践
| 消息类型 | 禁止方法 | 优点 | 缺点 |
|---|---|---|---|
alert/confirm/prompt |
全局覆盖 (window.alert = ...) |
简单、彻底,可记录日志。 | 可能破坏依赖返回值的网页功能。 |
window.open() |
全局覆盖 (window.open = ...) |
可以精细控制哪些链接可以打开。 | 可能阻止合法的新窗口打开功能。 |
Notification API |
浏览器设置 | 根本解决,影响全局,一劳永逸。 | 需要用户手动操作。 |
对于开发者/高级用户:
- 浏览器扩展/油猴脚本:如果你想让这些规则在多个网站上自动生效,最好的方式是编写一个浏览器扩展或一个 Greasemonkey/Tampermonkey 用户脚本,这些脚本会在页面加载时自动执行上述覆盖代码。
对于普通用户:
- 使用浏览器内置功能:现代浏览器通常已经内置了强大的弹窗和通知管理功能,在浏览器设置中调整这些选项是最安全、最推荐的方式。
- 安装广告拦截插件:像 uBlock Origin 这样的插件不仅能阻止广告,还能有效阻止由广告脚本触发的弹窗和通知。
