前端实战:手把手教你实现浏览器通知功能

前端实战:手把手教你实现浏览器通知功能

前端入门:浏览器通知功能从0到1实现指南

作为前端学习者,你可能见过这样的场景:打开网页版聊天工具,就算把浏览器最小化,桌面也会弹出“新消息”提醒;或者某些网站的活动通知,会直接显示在电脑/手机桌面上。这种功能就是「浏览器桌面通知」,今天我们就从零开始,搞懂它、学会用它。

一、先搞懂3个基础问题

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

简单说,就是网页能在浏览器窗口外面(比如电脑桌面、手机屏幕)给你发提醒。哪怕浏览器最小化、甚至页面切到后台,只要权限允许,都能收到通知,不用一直盯着网页。

2. 什么时候会用到它?

常见场景很贴近日常:

  • 网页版微信/QQ的新消息提醒;
  • 工作系统的审批提醒、任务到期通知;
  • 电商网站的订单状态更新(比如“你的快递已发货”);
  • 新闻/小说网站的订阅内容更新提醒。

3. 用起来难吗?有什么限制?

不难!核心就2步:先让用户同意开启通知(申请权限),再发送通知。
关键限制要记好(避免踩坑):

  • 必须在「安全环境」下用:网站要部署在HTTPS服务器上(本地开发用 localhost 可以正常测试,不用纠结HTTPS);
  • 要用户主动同意:不能偷偷发通知,必须先让用户点击“允许”才行;
  • 大部分现代浏览器都支持:Chrome、Edge、Firefox、Safari(手机端也支持,部分需要特殊设置)。

二、核心概念:通知权限(最关键的一步)

浏览器为了保护用户,给通知加了“权限管理”——就像你家开门,必须经过主人同意,外人才能进。权限分3种状态,我们后续代码都要围绕这3种状态处理:

权限状态通俗理解我们能做什么
默认(default)用户还没选过“允许”或“拒绝”可以弹出弹窗,问用户要不要开启通知
允许(granted)用户同意开启通知了直接发通知,不用再问
拒绝(denied)用户之前点了“不允许”不能再弹请求弹窗了,只能引导用户手动去浏览器设置里改
提示:权限是“按网站保存”的,比如你允许了“网页版微信”的通知,不代表其他网站也能发,每个网站要单独申请。

三、从零实现:2个核心功能(附完整代码)

我们把功能拆成2部分:① 申请通知权限 ② 发送通知。下面的代码可以直接复制到你的HTML文件里运行,每一行都加了注释,初学者也能看懂。

第一步:准备HTML基础结构

先建一个简单的HTML文件,包含一个“开启通知”按钮和一个“发送测试通知”按钮,方便我们测试:

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>小白的浏览器通知测试</title><style>/* 新增:给引导按钮加简单样式,默认隐藏 */#guideReEnableBtn{margin-top: 10px;display: none;color: #fff;background-color: #ff7d00;border: none;padding: 8px 16px;border-radius: 4px;cursor: pointer;}#guideReEnableBtn:hover{background-color: #e67100;}</style></head><body><h1>浏览器通知测试</h1><buttonid="requestPermissionBtn">1. 开启通知权限</button><buttonid="sendNoticeBtn"disabled>2. 发送测试通知&lt;/button&gt;&#xA;<!-- 新增:拒绝后显示的引导按钮 --><buttonid="guideReEnableBtn">3. 重新开启通知权限(已拒绝用户点击)</button><script>// 这里放后续的JS代码</script></body></html>

第二步:编写JS核心逻辑(复制到script标签里)

// 1. 先获取页面上的所有按钮(新增引导按钮)const requestPermissionBtn = document.getElementById('requestPermissionBtn');const sendNoticeBtn = document.getElementById('sendNoticeBtn');const guideReEnableBtn = document.getElementById('guideReEnableBtn');// 新增:获取引导按钮// 2. 定义一个变量,记录通知是否可用(方便后续判断)let isNoticeEnabled =false;// 3. 检测浏览器是否支持通知功能(避免在不支持的浏览器上报错)functioncheckBrowserSupport(){// 浏览器有Notification这个功能,就说明支持if('Notification'in window){returntrue;}else{alert('你的浏览器不支持通知功能,请升级浏览器!');returnfalse;}}// 新增:判断浏览器类型,返回对应通知设置页URL(适配主流浏览器)functiongetBrowserNoticeSettingsUrl(){const userAgent = navigator.userAgent;if(userAgent.includes('Chrome')&&!userAgent.includes('Edg')){// Chrome浏览器return'chrome://settings/content/notifications';}elseif(userAgent.includes('Edg')){// Edge浏览器return'edge://settings/content/notifications';}elseif(userAgent.includes('Firefox')){// Firefox浏览器return'about:preferences#privacy';}else{// 其他浏览器(如Safari)暂不支持直接跳转,返回空return'';}}// 新增:引导用户手动开启权限的函数(点击新按钮时触发,新增跳转功能)functionguideReEnablePermission(){const settingsUrl =getBrowserNoticeSettingsUrl();// 有对应浏览器的设置页URL,提供“直接跳转”选项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. 刷新页面后重新尝试');}}// 4. 申请通知权限(核心函数1)asyncfunctionrequestNoticePermission(){// 先检查浏览器是否支持if(!checkBrowserSupport())return;// 查看当前的权限状态const permission = Notification.permission;if(permission ==='granted'){// 情况1:用户已经允许过了 isNoticeEnabled =true;alert('通知权限已开启!可以发送通知啦~');// 启用“发送测试通知”按钮,隐藏引导按钮 sendNoticeBtn.disabled =false; guideReEnableBtn.style.display ='none';}elseif(permission ==='denied'){// 情况2:用户之前拒绝过,显示引导按钮,隐藏其他无关按钮 guideReEnableBtn.style.display ='block'; sendNoticeBtn.disabled =true;// 提示用户点击新按钮查看步骤(新增跳转说明)alert('你之前拒绝了通知权限!请点击页面上的「重新开启通知权限」按钮,可选择直接跳转到设置页操作。');}else{// 情况3:用户还没选过,弹出请求弹窗try{// 弹出弹窗,等待用户选择(await表示“等用户选完再继续”)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('申请通知权限失败,请刷新页面重试');}}}// 5. 发送通知(核心函数2)functionsendTestNotice(){// 先检查是否有权限if(!isNoticeEnabled){alert('请先点击第一个按钮开启通知权限!');return;}// 创建并发送通知const notice =newNotification('测试通知来啦!',{body:'恭喜你!成功发送了第一条浏览器通知~',// 通知正文icon:'https://img.icons8.com/fluency/96/000000/notification.png',// 通知图标(网上找的免费图标,可替换)tag:'test-notice',// 相同tag的通知会替换旧的,避免重复堆积silent:false// 是否静音(false=有提示音,true=没声音)});// 点击通知时的操作:打开浏览器窗口,并关闭通知 notice.onclick=function(){ window.focus();// 把浏览器调到前台 notice.close();// 关闭通知};// 3秒后自动关闭通知(避免一直留在桌面)setTimeout(()=>{ notice.close();},3000);}// 新增:绑定引导按钮的点击事件 guideReEnableBtn.addEventListener('click', guideReEnablePermission);// 6. 给原有按钮绑定点击事件(点击按钮触发对应的函数) requestPermissionBtn.addEventListener('click', requestNoticePermission); sendNoticeBtn.addEventListener('click', sendTestNotice);

第三步:测试步骤(跟着做就能成功)

  1. 把上面的HTML代码复制到一个文本文件里,把文件后缀改成 .html(比如 notice-test.html);
  2. 用Chrome、Edge等现代浏览器打开这个文件(注意:打开方式是“直接双击文件”,地址栏会显示 file:///...,但测试时可能弹不出权限弹窗?没关系,用VS Code的“Live Server”插件打开(地址栏显示http://localhost:5500/...),就能正常测试了);
  3. 点击“1. 开启通知权限”按钮:
    第一次点击会弹出浏览器的权限弹窗,选择“允许”;
  4. 允许后,“发送测试通知”按钮会变亮(从灰色变成可点击);
  5. 如果选择“拒绝”,页面会显示「重新开启通知权限」按钮,点击后可选择直接跳转到浏览器设置页,或查看手动开启步骤。
  6. 点击“2. 发送测试通知”按钮:桌面会弹出通知,有标题、正文和图标,3秒后自动关闭;点击通知会把浏览器调到前台。
  7. 点击“1. 开启通知权限”按钮:第一次点击会弹出浏览器的权限弹窗,选择“允许”;

四、常见问题排查(初学者必看)

  1. 如果选择“拒绝”,页面会显示「重新开启通知权限」按钮,点击可查看手动开启步骤。
  2. 允许后,“发送测试通知”按钮会变亮(从灰色变成可点击);

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

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

2. 弹不出权限弹窗?

原因:之前拒绝过权限,浏览器会持久化保存“拒绝”状态,后续无法通过代码再次弹出权限申请弹窗(这是浏览器的保护机制,避免网站反复骚扰用户)。
解决:我们可以在页面添加「重新开启通知权限」的专门按钮,点击后可选择直接跳转到浏览器设置页(适配Chrome/Edge/Firefox),操作更便捷(已更新上方代码)。具体操作流程:

  1. 点击页面上的「重新开启通知权限(已拒绝用户点击)」按钮;
  2. 点击「确定」直接跳转到通知设置页(跳转失败则按弹窗提示手动操作);
  3. 在设置页找到当前网站,将通知权限从「阻止」改为「允许」;
  4. 刷新当前页面,或重新点击「开启通知权限」按钮,即可正常使用通知功能。

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

原因:系统通知被关闭了(不是浏览器的问题)。
解决:

  • Windows:打开「设置→系统→通知和操作」,确保“通知”开启,并且浏览器(比如Chrome)的通知权限也开启;
  • Mac:打开「系统设置→通知」,找到对应的浏览器,开启“允许通知”。

4. 手机上测试没效果?

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

五、进阶小技巧(学会更实用)

  1. 自定义通知内容:发送通知时,把 new Notification('标题', {配置}) 里的标题、body换成变量,就能实现“动态通知”(比如显示不同的消息内容);
  2. 避免通知堆积:用 tag 配置项,相同tag的通知会替换旧的(比如连续发两条“新消息”通知,只会显示最新的一条);
  3. 离线也能发通知:如果需要“页面关闭后还能收到通知”,可以学习「Service Worker」(进阶知识点),搭配Notification API就能实现离线通知;
  4. 浏览器设置页快速跳转:通过判断浏览器类型,可实现点击按钮直接跳转到通知设置页,避免用户手动找路径(本文已实现该功能,适配主流浏览器)。

六、总结

浏览器通知功能的核心就是「先申请权限,再发送通知」,学习者只要记住这2步,再跟着上面的代码和步骤测试,就能快速上手。关键是要注意“安全环境(HTTPS/localhost)”和“用户主动授权”这两个点,避开常见坑就能顺利实现功能啦~

如果需要在实际项目中使用,只要把上面的测试代码稍作修改(比如替换图标、修改通知内容),就能直接用在自己的网页里!

Read more

*ARINC 825,一种航电通信总线标准

*ARINC 825,一种航电通信总线标准

1. 它是什么 ARINC 825 是一个航空电子领域的技术标准,主要规范了在航空器内部如何使用一种名为“控制器局域网”(CAN)的数据总线进行通信。可以把它理解为航空界为CAN总线制定的一套精细的“交通规则”和“车辆制造标准”。 在生活中,CAN总线类似于小区或办公楼里的内部电话网络,各个房间(设备)可以通过这个网络互相通话。而ARINC 825 则详细规定了在这个高端、高安全要求的“航空大厦”里,这个内部电话应该用什么线路、怎么拨号、说什么语言、通话的优先级如何安排,以确保沟通绝对可靠、有序。 2. 它能做什么 它的核心作用是实现航空器上不同电子设备之间稳定、高效、可预测的数据交换。这些设备包括飞行控制系统、发动机指示系统、舱内压力控制系统等。 例如,想象一架飞机的机翼上有多个传感器,监测结冰情况。这些传感器需要将“探测到冰”这个消息快速、可靠地告知除冰系统和飞行员显示面板。ARINC 825 确保了这条关键消息能在复杂的电子环境中,像消防通道一样,拥有最高优先级,

无人机 RGB+热红外融合检测建筑裂缝与渗漏,34 层高楼约 2 小时

无人机 RGB+热红外融合检测建筑裂缝与渗漏,34 层高楼约 2 小时

导读 住宅建筑的外立面检测传统上依赖人工——爬脚手架、挂绳索、拿检测仪逐面墙检查。一栋 34 层高楼,人工检测需要 2-3 天,覆盖率只有 40-60%,而且肉眼看不到墙体内部的渗漏。 深圳大学团队提出了一套无人机 RGB+热红外双模态检测方案:用 DJI Mavic 3 Thermal 无人机同时拍摄可见光和热红外图像,可见光用于检测裂缝,热红外用于检测渗漏(水分蒸发导致的温度异常)。在深圳三个住宅小区的实测中,裂缝检测 mIoU 达到 87.86%,渗漏检测 mIoU 达到 79.05%。一栋 34 层高楼的完整外立面检测约 2 小时完成,覆盖率  ≥95% 。 论文信息 * 标题:UAV and Deep Learning

基于分布式光纤声波传感(DAS)的无人机入侵探测技术与应用

基于分布式光纤声波传感(DAS)的无人机入侵探测技术与应用

一、背景概述 随着无人机技术的普及,其在航拍、巡检、物流等领域发挥积极作用的同时,也带来了“低空入侵”与“非法飞行”等安全隐患。在机场、军事设施、能源基础设施及重要园区等重点区域,传统的雷达、视频或无线电监测手段在低空、隐身性、小目标**场景下仍存在一定局限。 分布式光纤声波传感系统(Distributed Acoustic Sensing,DAS)作为一种被动式、长距离、连续监测的感知技术,为无人机入侵预警提供了新的技术路径。 二、DAS 在无人机入侵监测中的基本原理 DAS 系统利用相干光时域反射原理,将普通通信光纤转化为沿线连续分布的振动与声波传感单元。当无人机在目标区域低空飞行、起降或悬停时,会在地面及周围结构中产生可被感知的物理扰动,包括: * 旋翼气流引起的地面微振动 * 无人机起降过程中的冲击与共振 * 低空飞行产生的特征性声波信号 这些信号通过光纤传导至 DAS 主机,经过高速采集与数字信号处理,可实现实时感知与精确定位。 三、无人机入侵场景下的 DAS 监测模式

全屋智能家居的最强大脑!极空间部署全屋AI自动化方案『Miloco』

全屋智能家居的最强大脑!极空间部署全屋AI自动化方案『Miloco』

全屋智能家居的最强大脑!极空间部署全屋AI自动化方案『Miloco』 哈喽小伙伴们好,我是Stark-C~ 说到智能化家居大家都不陌生,毕竟大家或多或少都使用过,或者正在使用。 不知道大家发现没有,目前的智能家居基本都很“被动”,比如说智能灯要么靠“喊”,要么靠“感应”,空调的提前预热或制冷需要我们远程开启,家里的摄像头只是能看画面,但“看不懂”发生了什么。。。 总的来说,现在很多的智能家居广义上说其实只是在“执行命令”,而不是“理解场景”。它们更像是听话的小助手,却没有一个能主动思考、能理解你生活习惯的“大脑”。 如是,小米科技带来的『Miloco』来了! 关于Miloco 🔺Miloco(Xiaomi Local Copilot)是小米在去年十一月份(2025年11月)发布的,据说是一款“智能家居未来探索方案”,该方案以米家摄像机为视觉信息来源,打通全屋IoT设备,实现简单、便捷的全屋智能生态。该项目目前Github上开源,并且正在快速的发展壮大中。 Github主页地址: