navigator.vibrate()不提供震动反馈数据,因其是单向轻量级提示接口,无传感器读数、执行状态或事件回调;仅返回true表示调用成功,不保证实际震动发生。

HTML5 的 navigator.vibrate() 只能触发震动,不能“获取”震动反馈数据——它没有返回传感器读数、持续时间误差、电机状态或实际执行结果。
为什么 Vibration API 不提供震动反馈数据
该 API 是单向命令式接口,设计目标是轻量级提示(如消息提醒),而非硬件闭环控制。浏览器不暴露底层振动器的传感器数据(比如加速度计读数、马达响应延迟、是否被系统静音/禁用等),也没有回调或事件通知震动是否真实发生。
-
navigator.vibrate()返回true仅表示“调用成功”,不保证震动已执行(例如:设备不支持、用户未授权、系统设置为静音、页面不在前台) - 无
vibrationstart/vibrationend事件,无法监听实际起止时刻 - Android/iOS 对震动权限和上下文限制严格:iOS 仅允许在用户手势(如
click、touchend)后首次调用;后续调用可能被忽略
如何间接判断震动是否大概率生效
虽不能取数,但可通过组合策略提高对震动行为的可观测性:
- 检查
navigator.vibrate是否存在且为函数:if ('vibrate' in navigator && typeof navigator.vibrate === 'function') { /* 可尝试调用 */ } - 在用户手势回调中立即调用,并记录时间戳:
button.addEventListener('click', () => { const start = performance.now(); const ok = navigator.vibrate(200); console.log('vibrate() returned:', ok, 'at', start); }); - 配合
document.visibilityState排查前台状态影响:if (document.visibilityState !== 'visible') { console.warn('Page not visible — vibration likely blocked'); }
常见失败场景与对应现象
以下情况均导致 navigator.vibrate() 静默失败(返回 true,但无震动):
立即学习“前端免费学习笔记(深入)”;
- iOS Safari:页面加载后未经过用户手势激活,首次调用以外的任何调用
- Android Chrome:设备处于“请勿打扰”模式,或在设置中关闭了“触感反馈”
- 所有平台:页面被切换到后台标签页后再唤起震动
- 部分定制 Android 系统(如 MIUI):需手动开启“网页振动”开关(隐藏较深,通常在「设置 > 应用设置 > 浏览器 > 权限管理」中)
真正需要震动反馈数据(如校准触觉强度、测量响应延迟、做无障碍反馈验证)的应用,必须绕过浏览器限制,走原生层(如 Capacitor + Android Vibrator API 或 iOS UIFeedbackGenerator),再通过桥接把传感器/日志回传到 Web 层。纯 HTML5 + Vibration API 没有取数路径。











