获取JavaScript电池电量

7

/!\强烈不建议使用window.navigator.battery {{link1:,此问题现已不值得检查,谢谢/!\

我想获取当前系统的电池电量。这是我想要获得的输出:

如果是台式机(无电池) 电池电量:100%

如果是笔记本电脑 电池电量:XXX%(取决于电量水平)

因此,我在JSFiddle中尝试了Mozilla Foundation的片段window.navigator.battery

问题: 在Chrome 20+版本(目前为46),控制台仍然会出现错误:

Uncaught TypeError: Cannot read property 'addEventListener' of undefined

所以我理解的是,用假定电池电量实例化的对象battery没有返回任何内容。

有人已经解决了这个问题吗?

当此片段可用时,我的算法的重点是确定用户不能执行哪些操作,关于剩余电池电量。例如,我不希望用户执行可能会将其电池电量降至临界点并使关键操作失败的重型操作。


3
请注意,你提供的 JSFiddle 链接只是首页,没有指向具体演示问题的 fiddle。 - Heretic Monkey
##Chrome 60:## 输入 > window.navigator.battery
输出 < undefined
- undefined
由于它已被弃用,我将在此问题的顶部提及它,谢谢。 - Anwar
1
一行代码:navigator.getBattery().then(battery => console.log(battery.level)); - Basj
5个回答

9

来自该页面的英文版

此功能已从Web标准中删除。虽然一些浏览器仍可能支持它,但正在被淘汰过程中。不要在旧项目或新项目中使用它。使用它的页面或Web应用程序可能随时会中断。

battery属性已被弃用,并已由Navigator.getBattery()方法替换,返回一个电池Promise。尽管它的支持仍然是部分的。


我刚刚发现法语文档已经过时了,因为我将URL切换到英文版本后,实际上看到了“depecrated message”错误提示。 - Anwar

7

警告

请勿在生产环境中使用以下答案,因为它已被弃用。由于隐私和安全问题,规范将进行重新制定,因此可能会出现更改和故障。

答案

为了回答自己的问题,感谢@Quentin提供给我的文档帮助,我使用BatteryManager.level函数和承诺Navigator.getBattery()达到了我的目标。可以在此处找到提供工作代码段的链接:https://developer.mozilla.org/en-US/docs/Web/API/BatteryManager/level

以下JSFiddle在控制台(F12)中显示剩余电池电量的值(我尚未在桌面上验证输出,因此如果在桌面上不起作用,请纠正我):

JSFiddle

JavaScript

navigator.getBattery().then(function(battery) {

    var level = battery.level;

    console.log(level);
});

4
编辑:这个已经不起作用了。

It's relatively easy, although using navigator.battery is not recommended because it is deprecated.

let batterySupported = document.getElementById("battery-supported"),
  batteryLevel = document.getElementById("battery-level"),
  chargingStatus = document.getElementById("charging-status"),
  batteryCharged = document.getElementById("battery-charged"),
  batteryDischarged = document.getElementById("battery-discharged");

let success = function(battery) {
  if (battery) {
    function setStatus() {
      console.log("Set status");
      batteryLevel.innerHTML = Math.round(battery.level * 100) + "%";
      chargingStatus.innerHTML = (battery.charging) ? "" : "not ";
      batteryCharged.innerHTML = (battery.chargingTime == "Infinity") ?
        "Infinity" : parseInt(battery.chargingTime / 60, 10);
      batteryDischarged.innerHTML = (battery.dischargingTime == "Infinity") ?
        "Infinity" : parseInt(battery.dischargingTime / 60, 10);
    }

    // Set initial status
    setStatus();

    // Set events
    battery.addEventListener("levelchange", setStatus, false);
    battery.addEventListener("chargingchange", setStatus, false);
    battery.addEventListener("chargingtimechange", setStatus, false);
    battery.addEventListener("dischargingtimechange", setStatus, false);
  } else {
    throw new Error('Battery API not supported on your device/computer');
  }
};

let error = function(error) {
  batterySupported.innerHTML = error.message;
};

navigator.getBattery() //returns a promise
  .then(success)
  .catch(error);
<h1>
  Battery API demo
</h1>

<p id="battery-supported"></p>

<p>Battery level: <b id="battery-level"></b></p>

<p>Battery status: <b id="charging-status"></b><b>charging</b></p>

<p>Battery will be fully charged in <b id="battery-charged"></b> minutes.
</p>

<p>Battery will be discharged in <b id="battery-discharged"></b> minutes.
</p>


3

event.target.level 是事件处理程序中的级别值。

navigator.getBattery().then((battery) => {

    battery.ondischargingtimechange = (event) => { 
       console.warn(`Discharging : `, event.target.level) 
    };

    battery.onchargingtimechange = (event) => { 
       console.info(`Charging : `, event.target.level) ;
    };
});

Jsfiddle上的实时示例

截屏


这个答案与@Zeratops的答案有何不同? - Heretic Monkey
1
这是一个实时输出,因为使用了事件处理程序@MikeMcCaughan。 - Abdennour TOUMI
@AbdennourTOUMI,你有JSFiddle来测试吗? - Anwar
1
@Anwar!答案中已添加了一个Jsfiddle链接。 - Abdennour TOUMI
感谢您更新了您的答案!在我的华为P20上,显示的充电时间没有改变(即使我在充电时保持屏幕打开)。可能是与原生Android浏览器的实现问题。得在Android Chrome上试试。无论如何,感谢您的建议,我想这个电池API很难驾驭... - Anwar

2

Navigator.getBattery()现在已经过时。虽然它在某些浏览器中仍然可以使用,但不建议使用,因为它随时可能被删除。


谢谢@Temkit,我会在自己的答案中添加这个关键信息。 - Anwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接