1. alert, confirm, prompt:浏览器自带的模态对话框。
  2. window.open():用于打开新窗口或标签页,常被滥用弹出广告。
  3. Notification API:现代浏览器提供的桌面通知功能。

下面我将分别介绍如何禁止或控制这三种消息。

js禁止弹出来自网页的消息
(图片来源网络,侵删)

禁止 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"); 时,将不会弹出对话框,而是会执行我们自定义的空函数。

优点

  • 简单直接,一劳永逸。
  • 可以捕获并记录所有被阻止的调用,方便调试。

缺点

js禁止弹出来自网页的消息
(图片来源网络,侵删)
  • 如果某个网页的功能依赖confirmprompt 的返回值(一个“删除”按钮需要用户 confirm),直接返回 falsenull 可能会导致该功能异常。

在控制台执行

如果你只是想在当前网页临时禁止,可以在浏览器开发者工具的控制台中粘贴上面的代码并回车。


禁止 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 桌面通知

这是现代网站请求发送到你桌面(操作系统级别)的通知,用户通常可以在浏览器设置中全局管理这些权限。

在浏览器设置中禁用(推荐)

这是最根本、最有效的方法。

  1. Chrome / Edge: 设置 -> 隐私和安全 -> 网站设置 -> 通知 -> 不允许网站发送通知。
  2. 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 这样的插件不仅能阻止广告,还能有效阻止由广告脚本触发的弹窗和通知。