跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端实现浏览器通知功能指南

浏览器通知功能实现指南 浏览器桌面通知允许网页在浏览器窗口外发送提醒。即使浏览器最小化或页面切到后台,只要权限允许,用户也能收到通知。 一、基础概念 什么是浏览器桌面通知? 网页能在浏览器窗口外面(如电脑桌面、手机屏幕)发送提醒。无需一直盯着网页。 常见应用场景 网页版聊天工具的新消息提醒; 工作系统的审批提醒、任务到期通知; 电商网站的订单状态更新; 新闻/小说网站的订阅内容更新提醒。 使用限制…

极客零度发布于 2026/4/6更新于 2026/5/2279K 浏览
前端实现浏览器通知功能指南

浏览器通知功能实现指南

浏览器桌面通知允许网页在浏览器窗口外发送提醒。即使浏览器最小化或页面切到后台,只要权限允许,用户也能收到通知。

一、基础概念

1. 什么是浏览器桌面通知?

网页能在浏览器窗口外面(如电脑桌面、手机屏幕)发送提醒。无需一直盯着网页。

2. 常见应用场景
  • 网页版聊天工具的新消息提醒;
  • 工作系统的审批提醒、任务到期通知;
  • 电商网站的订单状态更新;
  • 新闻/小说网站的订阅内容更新提醒。
3. 使用限制
  • 安全环境:网站需部署在 HTTPS 服务器上(本地开发用 localhost 可正常测试);
  • 用户授权:必须先让用户点击'允许'才能发送;
  • 浏览器支持:Chrome、Edge、Firefox、Safari(手机端部分需特殊设置)。

二、通知权限

浏览器对通知有权限管理,权限分 3 种状态:

权限状态通俗理解我们能做什么
默认(default)用户还没选过'允许'或'拒绝'可以弹出弹窗,问用户要不要开启通知
允许(granted)用户同意开启通知了直接发通知,不用再问
拒绝(denied)用户之前点了'不允许'不能再弹请求弹窗了,只能引导用户手动去浏览器设置里改

提示:权限是'按网站保存'的,每个网站要单独申请。

三、代码实现

1. 准备 HTML 基础结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>浏览器通知测试</title>
<style>
#guideReEnableBtn {
  margin-top: 10px;
  display: none;
  color: #fff;
  : ;
  : none;
  :  ;
  : ;
  : pointer;
}
 {
  : ;
}



浏览器通知测试
1. 开启通知权限
2. 发送测试通知
3. 重新开启通知权限(已拒绝用户点击)



background-color
#ff7d00
border
padding
8px
16px
border-radius
4px
cursor
#guideReEnableBtn
:hover
background-color
#e67100
</style>
</head>
<body>
<h1>
</h1>
<button id="requestPermissionBtn">
</button>
<button id="sendNoticeBtn" disabled>
</button>
<button id="guideReEnableBtn">
</button>
<script>
// 这里放后续的 JS 代码
</script>
</body>
</html>
2. 编写 JS 核心逻辑
// 1. 获取页面上的所有按钮
const requestPermissionBtn = document.getElementById('requestPermissionBtn');
const sendNoticeBtn = document.getElementById('sendNoticeBtn');
const guideReEnableBtn = document.getElementById('guideReEnableBtn');

// 2. 定义一个变量,记录通知是否可用
let isNoticeEnabled = false;

// 3. 检测浏览器是否支持通知功能
function checkBrowserSupport() {
  if ('Notification' in window) {
    return true;
  } else {
    alert('你的浏览器不支持通知功能,请升级浏览器!');
    return false;
  }
}

// 4. 判断浏览器类型,返回对应通知设置页 URL
function getBrowserNoticeSettingsUrl() {
  const userAgent = navigator.userAgent;
  if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) {
    return 'chrome://settings/content/notifications';
  } else if (userAgent.includes('Edg')) {
    return 'edge://settings/content/notifications';
  } else if (userAgent.includes('Firefox')) {
    return 'about:preferences#privacy';
  } else {
    return '';
  }
}

// 5. 引导用户手动开启权限的函数
function guideReEnablePermission() {
  const settingsUrl = getBrowserNoticeSettingsUrl();
  if (settingsUrl) {
    const choice = confirm('请按以下步骤开启通知权限:\n\n1. 点击「确定」直接跳转到浏览器通知设置页\n2. 在设置页找到当前网站,将通知权限改为「允许」\n3. 刷新当前页面即可生效\n\n如果跳转失败,请手动操作:点击地址栏左侧小锁图标→找到「通知」→改为「允许』');
    if (choice) {
      try {
        window.open(settingsUrl, '_blank');
      } catch (error) {
        alert('跳转失败,请手动操作:点击地址栏左侧小锁图标→找到「通知」→改为「允许』');
      }
    }
  } else {
    alert('请按以下步骤手动开启通知权限:\n\n1. 点击浏览器地址栏左侧的「小锁图标」🔒\n2. 在弹出的菜单中找到「通知」选项\n3. 把「通知」状态从「阻止」改成「允许』\n4. 刷新页面后重新尝试');
  }
}

// 6. 申请通知权限(核心函数 1)
async function requestNoticePermission() {
  if (!checkBrowserSupport()) return;

  const permission = Notification.permission;
  if (permission === 'granted') {
    isNoticeEnabled = true;
    alert('通知权限已开启!可以发送通知啦~');
    sendNoticeBtn.disabled = false;
    guideReEnableBtn.style.display = 'none';
  } else if (permission === 'denied') {
    guideReEnableBtn.style.display = 'block';
    sendNoticeBtn.disabled = true;
    alert('你之前拒绝了通知权限!请点击页面上的「重新开启通知权限」按钮,可选择直接跳转到设置页操作。');
  } else {
    try {
      const userChoice = await Notification.requestPermission();
      if (userChoice === 'granted') {
        isNoticeEnabled = true;
        alert('你同意了通知权限!');
        sendNoticeBtn.disabled = false;
        guideReEnableBtn.style.display = 'none';
      } else {
        alert('你拒绝了通知权限,无法收到通知哦~\n如果后续想开启,可点击页面上的「重新开启通知权限」按钮,支持直接跳转到设置页。');
        guideReEnableBtn.style.display = 'block';
      }
    } catch (error) {
      console.error('申请权限失败:', error);
      alert('申请通知权限失败,请刷新页面重试');
    }
  }
}

// 7. 发送通知(核心函数 2)
function sendTestNotice() {
  if (!isNoticeEnabled) {
    alert('请先点击第一个按钮开启通知权限!');
    return;
  }

  const notice = new Notification('测试通知来啦!', {
    body: '恭喜你!成功发送了第一条浏览器通知~',
    icon: 'https://img.icons8.com/fluency/96/000000/notification.png',
    tag: 'test-notice',
    silent: false
  });

  notice.onclick = function () {
    window.focus();
    notice.close();
  };

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

// 8. 绑定事件
guideReEnableBtn.addEventListener('click', guideReEnablePermission);
requestPermissionBtn.addEventListener('click', requestNoticePermission);
sendNoticeBtn.addEventListener('click', sendTestNotice);
3. 测试步骤
  1. 将 HTML 代码保存为 .html 文件;
  2. 使用 Chrome、Edge 等现代浏览器打开(建议使用 VS Code 的 Live Server 插件,地址栏显示 http://localhost);
  3. 点击'1. 开启通知权限'按钮,选择'允许';
  4. 允许后,'发送测试通知'按钮变亮;
  5. 如果选择'拒绝',页面会显示「重新开启通知权限」按钮,点击后可跳转设置页;
  6. 点击'2. 发送测试通知'按钮,桌面会弹出通知,3 秒后自动关闭。

四、常见问题

1. 点击'开启权限'没反应?

原因:浏览器不支持,或者打开方式不是 localhost/HTTPS。 解决:用 Chrome/Edge 浏览器,用 VS Code 的 Live Server 打开。

2. 弹不出权限弹窗?

原因:之前拒绝过权限,浏览器会持久化保存'拒绝'状态。 解决:点击「重新开启通知权限」按钮,跳转到浏览器设置页将权限改为「允许」。

3. 发送通知后,桌面没显示?

原因:系统通知被关闭了。 解决:

  • Windows:打开「设置→系统→通知和操作」,确保'通知'开启,并且浏览器通知权限开启;
  • Mac:打开「系统设置→通知」,找到对应的浏览器,开启'允许通知'。
4. 手机上测试没效果?

原因:手机浏览器要求'通知请求必须由用户主动点击触发',且部分手机需要在系统设置里开启浏览器通知。 解决:用手机浏览器打开文件(确保手机和电脑在同一个网络),手动点击'开启权限'按钮。

五、进阶技巧

  1. 自定义通知内容:将 new Notification 里的标题、body 换成变量,实现动态通知;
  2. 避免通知堆积:使用 tag 配置项,相同 tag 的通知会替换旧的;
  3. 离线也能发通知:学习「Service Worker」,搭配 Notification API 实现离线通知;
  4. 浏览器设置页快速跳转:通过判断浏览器类型,实现点击按钮直接跳转到通知设置页。

六、总结

浏览器通知功能的核心是「先申请权限,再发送通知」。注意'安全环境(HTTPS/localhost)'和'用户主动授权'这两个关键点,即可顺利实现功能。

目录

  1. 浏览器通知功能实现指南
  2. 一、基础概念
  3. 1. 什么是浏览器桌面通知?
  4. 2. 常见应用场景
  5. 3. 使用限制
  6. 二、通知权限
  7. 三、代码实现
  8. 1. 准备 HTML 基础结构
  9. 2. 编写 JS 核心逻辑
  10. 3. 测试步骤
  11. 四、常见问题
  12. 1. 点击“开启权限”没反应?
  13. 2. 弹不出权限弹窗?
  14. 3. 发送通知后,桌面没显示?
  15. 4. 手机上测试没效果?
  16. 五、进阶技巧
  17. 六、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端实战:从零实现浏览器桌面通知功能
  • 前端实现浏览器桌面通知功能
  • 亲历者讲述程序员过度工作导致精神崩溃的原因
  • 即答侠 InterviewAssistant 技术解析:AI 面试辅助与简历优化实战
  • Python 文件路径操作指南:遍历、过滤与文件管理
  • 医疗 AI 新范式:数理模型重构传统大模型
  • 大模型领域必须掌握的30个核心概念解析
  • 深入解析 WebView 的概念、功能、应用场景及优劣势
  • 从零部署 Llama-2-7b-chat-hf 构建企业级 AI 对话系统
  • 数据结构:单链表基础与实现
  • Java 异常处理:核心原理与实战最佳实践
  • MySQL 变量详解:系统、用户自定义与局部变量应用
  • 从零部署 Llama-2-7b-chat-hf 构建 AI 对话系统
  • 数据结构基础:顺序表的定义与实现
  • Java 面试核心知识点梳理:基础、并发与容器
  • 基于 Q-Learning 的无人机三维动态避障路径规划与 Matlab 实现
  • 基于 YOLOv8/v11 与 LLM 的 Web 目标检测及人脸识别系统
  • Windows 下 Nginx 配置指南:Vue 前端与后端服务一体化部署
  • ChatTTS WebUI 使用指南:轻松制作拟真语音
  • C++ 二叉搜索树(BST)核心原理与实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online