html和javascript无法控制关机或感知低电压,因web运行在沙箱中,无权访问硬件电源管理;真正关机由pmic或内核响应电压跌落触发,前端仅能通过原生集成方案间接监测。

HTML 没有“函数”能控制关机,更不会因低电压自动关机——这是对 Web 技术边界的常见误解。 关机行为由硬件电源管理模块(如 PMIC)或操作系统内核(如 Linux 的 poweroff、Windows 的 ACPI 事件)响应物理电压跌落触发,浏览器和 HTML 完全无权访问这些底层能力。
为什么 HTML 和 JavaScript 无法感知低电压
浏览器运行在操作系统提供的沙箱环境中,所有硬件 I/O(包括电源状态)都被严格隔离。即使设备已因欠压触发硬件复位,document 对象早已销毁,window.addEventListener('beforeunload') 都来不及执行。
- Web API 中不存在读取电池电压、电源状态或触发关机的接口(
navigator.getBattery()已被废弃,且仅支持充电/放电状态,不提供电压数值) -
XMLHttpRequest或fetch在断电前毫秒级中断,不会抛出可捕获的“低电压错误” - 所谓“HTML 函数”本身不存在——HTML 是标记语言,不包含可执行逻辑
实际供电不稳时前端可能观察到的现象
电压波动不会让页面“调用关机函数”,但会通过系统层间接影响前端运行时表现:
- CPU 降频导致
requestAnimationFrame掉帧、setTimeout延迟增大 - 内存供电不足引发浏览器进程被 OS OOM killer 终止,表现为白屏后直接回到桌面(无 JS 错误日志)
- USB-C/Type-C 供电不稳时,外接显示器闪屏,连带 Chrome 渲染线程卡死,控制台出现
GPU process crashed - 嵌入式设备(如树莓派+Chromium kiosk)在输入电压低于 4.65V 时,
document.visibilityState可能异常切换为hidden,但这只是渲染进程崩溃的副产物,非主动检测
需要监测电源状态时的可行路径
若业务场景真需应对供电风险(如工业 HMI、车载终端),必须绕过浏览器,采用原生集成方案:
- Linux 设备:通过
/sys/class/power_supply/下的voltage_now文件轮询(需 root 权限),配合systemd服务监听并触发dbus通知到 Electron 主进程 - Windows IoT:调用
Win32_BatteryWMI 类,用 Node.js 的win32api模块读取EstimatedVoltage - Android WebView:需自定义
WebViewClient,在 Java 层监听BatteryManager广播,再用addJavascriptInterface暴露安全方法给前端 - 绝对避免在网页中尝试
exec('sudo shutdown -h now')—— 浏览器无 shell 权限,且该命令在容器化环境(Docker/K8s)中根本不可用
真正决定设备是否关机的,是主板上的电压监控芯片(如 TI TPS65912)输出的 PWR_GOOD 信号,它比任何 JavaScript 执行都早几百微秒拉低。你写的 onbatterychange 回调,永远收不到那一次掉电事件。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











