你(可能)不知道的web api
作為前端er,我們的工作與web是分不開的,隨著HTML5/">HTML5的日益壯大,瀏覽器自帶的webapi也隨著增多。本篇文章主要選取了幾個有趣且有用的webapi進行介紹,分別介紹其用法、用處以及瀏覽器支援度,同時我也分別為這幾個api都做了一個簡單的 ofollow,noindex">demo (真的很簡單,樣式等於沒有~)這幾個api分別是:
- page lifecycle
- onlineState
- 利用deviceOrientation製作一個隨著手機旋轉的正方體
- battery status
- custom event
- 利用execCommand完成一個簡單的富文字
page lifecycle(網頁生命週期)
介紹
我們可以用document.visibitilityState來監聽網頁可見度,是否解除安裝,但是在手機和電腦上都會現這種情況,就是比如說頁面開啟過了很久沒有開啟,這時你看在瀏覽器的tab頁中看著是可以看到內容的,但是點進去卻需要載入。chrome68添加了 freeze 和 resume 事件,來完善的描述一個網頁從載入到解除安裝,包括瀏覽器停止後臺程序,釋放資源各種生命階段。從一個生命週期階段到另外一個生命週期階段會觸發不同的事件,比如onfocus,onblur,onvisibilitychange,onfreeze等等,通過這些事件我們可以相應網頁狀態的轉換。具體的教程推薦大家看看阮一峰大神的教程。
用法
window.addEventListener('blur',() => {}) window.addEventListener('visibilitychange',() => { // 通過這個方法來獲取當前標籤頁在瀏覽器中的啟用狀態。 switch(document.visibilityState){ case'prerender': // 網頁預渲染 但內容不可見 case'hidden':// 內容不可見 處於後臺狀態,最小化,或者鎖屏狀態 case'visible':// 內容可見 case'unloaded':// 文件被解除安裝 } }); 複製程式碼
用處
大家可以看下這個demo

所以說,這個API的用處就是用來相應我們網頁的狀態,比如說我們的頁面是在播放視訊或者是一個網頁的遊戲,你可以通過這個API來去做出對應的相應,暫停視訊,遊戲暫停等等。
瀏覽器支援度
page visibilituState
online state(網路狀態)
這個API就很簡單了,就是獲取當前的網路狀態,同時也有對應的事件去相應網路狀態的變化。
用法
window.addEventListener('online',onlineHandler) window.addEventListener('offline',offlineHandler) 複製程式碼
用處
比如說我們的網站是視訊網站,正在播放的時候,網路中斷了,我們可以通過這個API去相應,給使用者相應的提示等等。
瀏覽器支援度
這個是page visibility

Vibration(震動)
讓手機震動~~~ 嗯,就這麼簡單。
用法
// 可以傳入一個大於0的數字,表示讓手機震動相應的時間長度,單位為ms navigator.vibrate(100) // 也可以傳入一個包含數字的陣列,比如下面這樣就是代表震動300ms,暫停200ms,震動100ms,暫停400ms,震動100ms navigator.vibrate([300,200,100,400,100]) // 也可以傳入0或者一個全是0的陣列,表示暫停震動 navigator.vibrate(0) 複製程式碼
用處
用來給使用者一個提示,比如說資料校驗失敗,當然震動不止這點作用,大家自己去擴充套件吧~~~
瀏覽器支援度

device orientation(陀螺儀)
通過繫結事件來獲取裝置的物理朝向,可以獲取到三個數值,分別是:
- alpha:裝置沿著Z軸的旋轉角度

- beta:裝置沿著X軸的旋轉角度

- gamma:裝置沿著Y軸的旋轉角度

用法
window.addEventListener('deviceorientation',e => { console.log('Gamma:',e.gamma); console.log('Beta:',e.beta); console.log('Alpha:',e.Alpha); }) 複製程式碼
用處
這種自然是web VR 中的使用場景會相對較多。這是我寫的一個小demo

瀏覽器支援度

battery status
這個API就使用來獲取當前的電池狀態
用法
// 首先去判斷當前瀏覽器是否支援此API if ('getBattery' in navigator) { // 通過這個方法來獲取battery物件 navigator.getBattery().then(battery => { // battery 物件包括中含有四個屬性 // charging 是否在充電 // level剩餘電量 // chargingTime 充滿電所需事件 // dischargingTime當前電量可使用時間 const { charging, level, chargingTime, dischargingTime } = battery; // 同時可以給當前battery物件新增事件對應的分別時充電狀態變化 和 電量變化 battery.onchargingchange = ev => { const { currentTarget } = ev; const { charging } = currentTarget; }; battery.onlevelchange = ev => { const { currentTarget } = ev; const { level } = ev; } }) } else { alert('當前瀏覽器不支援~~~') } 複製程式碼
用處
用來溫馨的提示使用者當前電量~~~
瀏覽器支援度
這個瀏覽器的支援度很低。。。。

execCommand 執行命令
當將HTML文件切換成設計模式時,就會暴露出 execcommand 方法,然後我們可以通過使用這個方法來執行一些命令,比如複製,剪下,修改選中文字粗體、斜體、背景色、顏色,縮排,插入圖片等等等等。
用法
用法也很簡單,這裡簡單介紹幾個,詳細的介紹大家可以去MDN上看看。 這個API接受三個引數,第一個是要執行的命令,第二個引數mdn上說是Boolean用來表示是否展現使用者介面,但我也沒測試出來有什麼不同,第三個引數就是使用對應命令所需要傳遞的引數。
// 一般不會直接去操作我們本身的HTML文件,可以去插入一個iframe然後通過contentDocument來獲取、操作iframe中的HTML文件。 let iframe = document.createElement('ifram'); let doc = iframe.contentDocument; // 首先要將HTML文件切換成設計模式 doc.designMode = 'on'; // 然後就可以使用execCommand 這個命令了; // 執行復制命令,複製選中區域 doc.execCommand('copy') // 剪下選中區域 doc.execCommand('cut') // 全選 doc.execCommand('selectAll') // 將選中文字變成粗體,同時接下來輸入的文字也會成為粗體, doc.execCommand('bold') // 將選中文字變成斜體,同時接下來輸入的文字也會成為斜體, doc.execCommand('italic') // 設定背景顏色,,比如設定背景色為紅色,就傳入 'red'即可 doc.execCommand('backColor',true,'red') 複製程式碼
用處
我用這些命令簡單的寫了一個富文字的demo,大家可以看一下 Demo ,效果如下:

瀏覽器支援度
CustomEvent (自定義事件)
大家都知道各種事件是如何繫結的,但是有時候這些事件不夠用呢,custom event就可以解決這樣的問題。
用法
let dom = document.querySelector('#app'); // 繫結事件, 傳遞過來的值可以通過ev.detail 來獲取 dom.addEventListener('log-in',(ev) => { const { detail } = ev; console.log(detail);// hello }) // 派發事件,需要傳入兩個引數,一個是事件型別,另外一個是一個物件,detail就是傳遞過去的值 dom.dispatchEvent(new CustomEvent('log-in',{ detail:'hello' })) 複製程式碼
用處
繫結自定義事件,最近很火的框架 Omi ,其中的自定義事件就是基於customEvent實現的。