You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击通知框关闭失效:旧通知无响应或打开新标签问题排查

问题分析与解决方案

问题原因

你代码里的核心问题是全局变量n被重复覆盖:每次调用notif()函数,都会把新创建的Notification实例赋值给全局的n。当旧通知的点击事件触发时,n已经指向了最新生成的通知实例,所以点击旧通知实际操作的是最新的那个通知,自然就出现了只有最新通知能正常关闭、旧通知无响应或行为异常的情况。

修复方法

把n改成notif函数的局部变量,让每个Notification实例都拥有独立的引用,这样点击事件里的n就会指向当前创建的那个通知,点击对应通知就能关闭它自己。

修改后的完整代码:

function notif() {
    // 将n改为函数内的局部变量,不再使用全局变量
    const n = new Notification('the Title', {
        body: 'the Body',
        requireInteraction: false
    });

    setTimeout(() => {
        n.close()
    }, 3000);

    n.onclick = function () {
        n.close();
    };
}

$.ajax({
    dataType: 'json',
    url: "fun.php",
    success: function (response) {
        let data = response.data;
        let data_len = data.length;
        for (var i = 0; i < data_len; i++) {
            notif();
        }
    }
});

额外优化(可选)

如果需要给每个通知展示不同的标题和内容,可以给notif函数添加参数,适配接口返回的数据:

function notif(notifTitle, notifBody) {
    const n = new Notification(notifTitle, {
        body: notifBody,
        requireInteraction: false
    });

    setTimeout(() => {
        n.close()
    }, 3000);

    n.onclick = function () {
        n.close();
    };
}

$.ajax({
    dataType: 'json',
    url: "fun.php",
    success: function (response) {
        let data = response.data;
        for (var i = 0; i < data.length; i++) {
            // 传入接口返回的对应字段
            notif(data[i].title, data[i].body);
        }
    }
});

内容的提问来源于stack exchange,提问作者saeed saeedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:25:05