JavaScript无法直接通过BOM获取电池状态,需用Battery Status API(navigator.getBattery()),但仅限HTTPS安全上下文且Safari不支持。

JavaScript 无法直接通过 BOM(Browser Object Model)获取硬件设备的电池充电状态,因为标准 BOM 接口(如 window、navigator、screen 等)不包含电池相关属性。
浏览器原生支持:Battery Status API
现代浏览器(Chrome 38+、Edge 79+、Firefox 52+,不支持 Safari)提供了一个独立的、非 BOM 核心但由浏览器实现的 API —— Battery Status API。它不属于传统 BOM,而是作为 navigator 的扩展能力存在。
- 需通过
navigator.getBattery()异步获取电池对象(返回 Promise) - 成功后返回一个
BatteryManager实例,含以下关键属性:-
charging:布尔值,表示是否正在充电 -
level:浮点数(0–1),当前电量百分比 -
chargingTime:剩余充电秒数(若为Infinity表示已满或未接入电源) -
dischargingTime:预估剩余放电秒数(若为Infinity表示正在充电或未知)
-
- 支持事件监听:
battery.addEventListener('chargingchange', ...)等
实际使用注意事项
该 API 有明确限制和兼容性要求:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
仅在安全上下文生效:必须通过
https://或localhost访问,HTTP 页面会被拒绝 -
Safari 完全不支持(包括 iOS 和 macOS),调用
getBattery()会返回 rejected Promise 或undefined - 部分 Android WebView 或旧版 Chrome 可能行为异常,建议始终做错误处理
- 用户隐私策略下,某些系统(如启用了省电模式或权限限制)可能返回模拟/模糊数据
简易代码示例
以下为健壮调用方式:
if ('getBattery' in navigator) {
navigator.getBattery().then(battery => {
console.log('当前电量:', Math.round(battery.level * 100) + '%');
console.log('是否充电:', battery.charging);
<pre class="brush:php;toolbar:false;">battery.addEventListener('chargingchange', () =>
console.log('充电状态变化:', battery.charging)
);
battery.addEventListener('levelchange', () =>
console.log('电量变化:', Math.round(battery.level * 100) + '%')
);}).catch(err => { console.warn('获取电池信息失败:', err.message); }); } else { console.log('当前浏览器不支持 Battery Status API'); }
没有替代的纯前端方案
不存在其他标准 JavaScript 接口可绕过 Battery Status API 获取真实电池状态:
-
navigator.hardwareConcurrency、navigator.deviceMemory等仅反映 CPU/内存,与电池无关 - 无法通过 Canvas/WebGL 或定时器间接推断电量(精度低、不可靠、违反隐私原则)
- 桌面端 Electron 或移动端 Cordova/React Native 等混合框架可通过原生模块访问,但这已超出纯 Web/BOM 范畴
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










