navigator.vibrate() 是唯一标准震动API,但仅限用户手势首次触发且受HTTPS、硬件、系统设置等多重限制,Notification API不支持震动,iOS基本不可用。

navigator.vibrate() 是唯一标准方式,但绝大多数“通知振动”场景根本不能用它实现——它不响应系统通知,只响应你代码里手动触发的调用。
为什么 Notification API 发不出震动
浏览器的 Notification 对象本身不带震动能力。即使你在 new Notification() 的 options 里写 vibrate: [200],这个字段会被完全忽略。Chrome、Firefox、Safari 都不支持该字段,也没有相关规范草案。系统级通知(如 PWA 安装后收到的推送)是否震动,完全由操作系统控制:Android 可能在通知设置里统一开关;iOS 则从不为网页通知提供震动权限。
navigator.vibrate() 必须在用户手势中首次调用
这是最常卡住开发者的硬限制:页面加载完直接执行 navigator.vibrate(100),哪怕绑在 DOMContentLoaded 或 setTimeout 里,都会静默失败(返回 true 但无震动)。真实可用路径只有:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 必须绑定在用户明确交互事件内:如
button.addEventListener('click', ...)、canvas.ontouchend、input.onchange - 首次合法调用后,后续可在非手势上下文调用(比如 WebSocket 收到消息后震动),但前提是该页面已成功触发过至少一次
- iOS Safari 要求更苛刻:即使有点击,也得确保「设置 > 辅助功能 > 触感反馈」已开启,且仅接受 ≤15ms 单次值(
navigator.vibrate(15))
真机测试前必须检查三项
模拟器或 DevTools 传感器模拟基本无效,以下三项缺一不可:
- 页面必须运行在 HTTPS 下(HTTP 环境下
navigator.vibrate直接为undefined) - 设备需有物理震动马达(多数安卓手机有,iPad 和 Mac 基本没有)
- Android 用户要确认系统设置里没关「触感反馈」,部分厂商(如小米)还需单独打开「网页振动」权限(藏在「浏览器 > 权限管理」里)
别把震动当核心反馈手段
navigator.vibrate() 返回 true 不代表震动一定发生——它只表示“调用被接受”,而实际执行受制于系统静音、后台标签页、请勿打扰模式等十余种状态。真正关键的操作确认(如支付成功、表单提交)必须依赖视觉动画 + 音效,震动只是锦上添花。iOS 上尤其如此:它连 API 都不暴露,检测到 /iPhone|iPad/.test(navigator.userAgent) 就该直接跳过整段逻辑。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










