低电量~低~低~电量~ 吕士轩-低电量
今天要分享的也是一个使用情境偏少的 API,但如果你有想要做移动端的应用的话,或许可以尝试使用看看。
Battery API 是一个与使用者的装置电池相关的 API,我们可以透过它来得知电池的相关资讯,也可以监听电量的变化,以此来做到一些提示或警告的功能效果。
装置电池的资讯会被包裹在一个叫做 BatteryManager 的物件中,要取得该物件的话,我们必须要透过呼叫 navigator.getBattery
来取得:
navigator.getBattery().then(battery => {
console.log(battery) // BatteryManager
});
可以看到,互叫後 getBattery
回传的是 Promise,其被 resolve
後才会传递 BatteryManager 给我们,所以我们要用 then
去串接取得。
取得 BatteryManager 後,我们就可以看到里面会有四个比较重要的属性:
{
charging: true, // 是否正在充电
chargingTime: 2940, // 多少时间会满电(单位:秒)
dischargingTime: Infinity, // 多少时间会没电(单位:秒)
level: 0.86 // 目前的电量 (乘上100,即为百分比)
}
其中比较特别的是 chargingTime
和 dischargingTime
,若是目前装置正在充电,那 dischargingTime
必为 Infinity
,反之为充电时 chargingTime
必为 Infinity
。
而除了上面这四个属性之外呢,你还会看到四个事件属性,让你可以监听不同的电量事件:
{
onchargingchange: null, // 监听充电状态
onchargingtimechange: null, // 监听满电时间
ondischargingtimechange: null, // 监听没电时间
onlevelchange: null // 监听电量
}
只要像下面这样撰写的话就可以在电池状态有变更的时候触发 Callback:
navigator.getBattery().then(battery => {
battery.onchargingchange = function() {
console.log(this.level)
}
// 或是这样写也可以
battery.addEventListener("chargingchange", function {
console.log(this.level)
})
});
接下来我们只要透过以上这些属性就可以做到这样的一个小应用:
<div class="battery-level"></div>
<div class="battery-wrap"></div>
const batteryLevel = document.querySelector(".battery-level")
const batteryWrap = document.querySelector(".battery-wrap")
navigator.getBattery().then(battery => {
const count = Math.floor(battery.level / 0.20);
const callback = function() {
batteryLevel.textContent = battery.level * 100 + "%";
batteryWrap.innerHTML = "";
for(let i = 0; i < count; i++) {
const batteryLevel = document.createElement("div");
batteryLevel.setAttribute("class", "battery");
batteryWrap.appendChild(batteryLevel);
}
}
battery.onlevelchange = callback;
callback();
});
虽然 Battery API 并不是非常重要的功能,但其实浏览器能够实作出来让我们使用也是蛮方便的,毕竟要如何应用就要看大家的创意发挥,总比我们有想法却没有工具实践来得好。习得 Battery API 後,你有什麽应用它的 idea 吗?
前言 我明明记得我昨天就PO==,结果今天看到通知才发现被中断了,算了哈哈,那我这边就慢慢PO好了,...
好,今天来讲阵列,其实阵列很长一段时间都困扰着我 直到我自己重新看过一遍,才稍微解惑一些 那接下来就...
前言 使用者在操作页面或输入网址後,要下载档案(不局限於 PDF 档案),可以使用 Ruby on ...
前几天说了很多建置系统的方法但是对於监控系统没有太多的说明,今天就来一个 CloudWatch 传送...
挑战目标: MockNative Camp前端 今天原本是要来refactor和解决hover的问题...