0

0

JS如何实现通知?Notification API

小老鼠

小老鼠

发布时间:2025-08-14 17:53:02

|

659人浏览过

|

来源于php中文网

原创

浏览器实现桌面通知需先请求用户权限,再调用Notification API显示通知;必须在用户授权后才能发送,且最佳实践是在用户有明确意图时再请求权限,避免一进入页面就弹出,以提升授予权概率,同时可通过tag实现通知替换、actions添加交互按钮,并结合Service Worker实现离线推送,但需注意跨浏览器兼容性、系统级通知限制及防止通知滥用导致用户反感,最终在保障用户体验的前提下提升消息触达效果。

js如何实现通知?notification api

JavaScript实现通知主要依赖浏览器提供的

Notification API
。它允许网页在用户许可的情况下,向桌面发送系统级别的通知消息,即使浏览器处于后台或最小化状态也能触达用户。这对于需要即时提醒、消息推送的应用场景来说,是个非常实用的功能。

解决方案

要实现一个基本的桌面通知,你需要处理两个核心步骤:请求用户权限,以及创建并显示通知。

首先,检查浏览器是否支持

Notification API
。虽然现代浏览器基本都支持,但做个判断总归是稳妥的:

if (!('Notification' in window)) {
    console.warn('当前浏览器不支持桌面通知');
    // 可以提供备用方案,比如页面内消息提示
    return;
}

接下来是请求用户权限。这是最关键的一步,因为未经用户同意,任何通知都无法显示。我个人觉得,这个权限请求的时机和方式,直接决定了用户是否会接受你的通知。最好的做法是,在用户明确表示需要通知(比如点击了一个“开启通知”按钮)之后,再发起请求,而不是页面一加载就弹出来。

function requestNotificationPermission() {
    // 检查当前权限状态
    if (Notification.permission === 'granted') {
        console.log('用户已授予通知权限。');
        return Promise.resolve();
    }

    if (Notification.permission === 'denied') {
        console.warn('用户已拒绝通知权限。');
        // 可以在这里提示用户如何在浏览器设置中重新开启
        return Promise.reject('Permission Denied');
    }

    // 如果是 'default' 或其他状态,则请求权限
    return Notification.requestPermission().then(permission => {
        if (permission === 'granted') {
            console.log('用户已授予通知权限。');
        } else {
            console.warn('用户拒绝了通知权限。');
        }
        return permission;
    });
}

当权限被授予后,你就可以创建并显示通知了。一个通知通常包含标题和一些可选的配置项,比如通知内容、图标、点击行为等等。

function showNotification(title, options = {}) {
    requestNotificationPermission().then(permission => {
        if (permission === 'granted') {
            const defaultOptions = {
                body: '这是一条来自网页的通知。', // 通知主体内容
                icon: '/path/to/your/icon.png', // 通知图标
                image: '/path/to/your/image.png', // 通知内的图片
                badge: '/path/to/your/badge.png', // 徽章图标,主要用于移动设备
                tag: 'my-unique-notification-tag', // 标签,用于替换旧通知
                renotify: true, // 新通知是否应该重新提醒用户(即使tag相同)
                silent: false, // 是否静音
                requireInteraction: false, // 是否需要用户点击才能关闭
                data: {
                    url: 'https://example.com/some-page' // 关联数据,可以在点击事件中获取
                }
            };

            const finalOptions = { ...defaultOptions, ...options };
            const notification = new Notification(title, finalOptions);

            // 监听通知的点击事件
            notification.onclick = function(event) {
                console.log('通知被点击了!', event);
                // 可以在这里打开一个新页面或切换到相关标签页
                if (finalOptions.data && finalOptions.data.url) {
                    window.open(finalOptions.data.url, '_blank');
                }
                notification.close(); // 点击后关闭通知
            };

            // 监听通知的关闭事件
            notification.onclose = function() {
                console.log('通知被关闭了。');
            };

            // 监听通知的错误事件
            notification.onerror = function() {
                console.error('通知显示出错。');
            };

        } else {
            console.warn('无法显示通知,因为权限未授予。');
        }
    }).catch(error => {
        console.error('请求通知权限失败:', error);
    });
}

// 示例:点击按钮显示通知
// 

浏览器通知的权限管理与用户体验?

权限管理是桌面通知的生命线,直接关系到用户对你网站的信任度和留存率。我个人觉得,很多网站在这方面做得并不好,一上来就粗暴地弹出一个权限请求,用户往往不假思索就拒绝了,甚至会产生反感。

核心在于“用户意图”。当用户明确表示出对接收通知的兴趣时,比如他们点击了一个“订阅通知”按钮,或者在完成某个任务后,你询问他们是否希望收到后续进展通知时,才是请求权限的最佳时机。这种“按需请求”的方式,能极大提高用户授予权限的概率。

你需要处理

Notification.permission
的三种状态:

  • granted
    :用户已授权。可以直接显示通知。
  • denied
    :用户已拒绝。此时无法再通过
    requestPermission()
    再次请求,除非用户手动在浏览器设置中更改。你应该给用户提供明确的指导,告诉他们如何重新开启。
  • default
    :用户尚未做出选择。这是你调用
    requestPermission()
    时会弹窗的状态。

用户体验不仅仅是权限弹窗本身,还包括你发送通知的内容、频率和时机。频繁的、无关紧要的通知会导致“通知疲劳”,用户最终会选择屏蔽甚至卸载你的应用。相反,及时、有价值、个性化的通知能增强用户粘性。思考一下,用户真正想知道什么?是订单状态更新,还是新邮件提醒,亦或是某个特定事件的进展?把精力放在这些有实际价值的信息上,通知才能真正发挥作用。

桌面通知的高级功能与实际应用场景?

Notification API 不仅仅是弹个窗那么简单,它还提供了一些高级功能,让通知更具交互性和实用性。我尤其喜欢

actions
tag
这两个属性,它们让通知变得“活”起来。

交互式通知(Actions):你可以在通知中添加按钮,让用户直接在通知上进行操作,而无需打开网页。比如,一个新消息通知可以有“回复”和“标记已读”两个按钮。

悦灵犀AI
悦灵犀AI

一个集AI绘画、问答、创作于一体的一站式AI工具平台

下载
showNotification('新邮件', {
    body: '来自张三的邮件:关于项目进度的讨论。',
    icon: '/path/to/mail-icon.png',
    actions: [
        { action: 'reply', title: '回复', icon: '/path/to/reply-icon.png' },
        { action: 'mark-read', title: '标记已读', icon: '/path/to/read-icon.png' }
    ],
    data: { messageId: '12345' }
}).then(notification => {
    notification.addEventListener('actionclick', event => {
        console.log(`用户点击了动作:${event.action}`);
        if (event.action === 'reply') {
            // 打开回复界面
            window.open(`/compose?replyTo=${event.notification.data.messageId}`, '_blank');
        } else if (event.action === 'mark-read') {
            // 调用API标记邮件已读
            console.log(`标记邮件 ${event.notification.data.messageId} 为已读`);
        }
        notification.close();
    });
});

通知的替换与更新(Tag)

tag
属性非常有用。如果你发送多个逻辑上相同的通知(比如同一个聊天会话的新消息),你可以给它们设置相同的
tag
。这样,当新的通知到来时,它会替换掉之前带有相同
tag
的通知,而不是堆叠显示,避免了通知栏的混乱。
renotify
属性则控制替换时是否再次发出声音或震动。

Service Worker 与推送通知:这是桌面通知最强大的应用场景之一。结合

Service Worker
Push API
,你的网站可以在用户关闭浏览器后,仍然接收到服务器发送的推送消息,并在后台触发通知。这意味着你的应用可以实现真正的离线消息推送和后台任务提醒,极大地扩展了通知的能力范围。例如,一个电商网站可以在用户下单后,即使关闭了页面,也能在商品发货时收到通知。这通常涉及服务器端发送推送消息,Service Worker 接收并处理这些消息,然后调用
self.registration.showNotification()
来显示。

实际应用场景非常广泛:

  • 即时通讯:新消息提醒、@提醒。
  • 任务管理:截止日期提醒、任务分配通知。
  • 电商物流:订单状态更新(发货、签收)。
  • 新闻媒体:突发新闻推送、订阅内容更新。
  • 日历/日程:会议提醒、事件通知。
  • 金融:股价变动、交易提醒。

跨浏览器兼容性与潜在挑战?

尽管

Notification API
已经相当成熟,但在实际开发中,仍然会遇到一些兼容性和其他挑战,需要开发者去应对。我记得有一次,在调试一个通知功能时,发现某个浏览器上的图标显示有点问题,这让我意识到即使是标准API,也可能存在细微的差异。

浏览器兼容性:主流的现代浏览器(Chrome, Firefox, Edge, Safari)都支持

Notification API
,但具体实现细节和支持的
options
属性可能略有不同。例如,
actions
属性在一些旧版本浏览器或特定移动浏览器上可能不完全支持。
badge
属性主要在Android Chrome上显示效果明显。在开发时,最好查阅 MDN 或 Can I use 网站,了解目标用户群体的浏览器兼容性情况。对于不支持的浏览器,应提供优雅降级方案,比如在页面内显示一个消息提示条。

用户操作系统层面的限制:这是一个常常被忽略但又非常重要的点。即使你的网页代码完美无缺,用户操作系统(Windows, macOS, Android, iOS)的通知设置也会影响通知的显示。例如,用户可能开启了“勿扰模式”,或者在系统设置中禁用了特定应用的通知权限。这些情况是前端代码无法直接控制的,只能通过引导用户去检查系统设置来解决。

通知滥用与用户疲劳:这是最大的“非技术”挑战。如果你的网站过于频繁地发送通知,或者发送的通知内容对用户价值不大,用户很快就会感到厌烦,并选择关闭通知,甚至将你的网站加入黑名单。一旦用户拒绝了通知权限,重新获取就非常困难。因此,通知策略需要深思熟虑,注重用户体验和价值传递。

安全考量:虽然

Notification API
本身是安全的,但如果被恶意网站利用,可能会成为网络钓鱼或垃圾信息的载体。浏览器通常会限制通知必须在安全上下文(HTTPS)下才能使用,这也从一定程度上保障了安全性。

Service Worker 的复杂性:虽然

Service Worker
带来了强大的后台推送能力,但它的学习曲线相对陡峭,涉及缓存策略、生命周期管理、事件处理等多个方面。调试
Service Worker
也比普通的 JavaScript 更复杂一些,需要开发者投入更多精力。

总的来说,

Notification API
是一个非常有用的工具,但要用好它,除了掌握技术细节,更要理解用户行为和体验,才能真正发挥其价值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

864

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

752

2023.11.06

edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1454

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

383

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

950

2025.04.24

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

399

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

108

2024.02.23

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.3万人学习

Excel 教程
Excel 教程

共162课时 | 14.9万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号