你(可能)不知道的web api

awesome23發表於2018-12-16

簡介

作為前端er,我們的工作與web是分不開的,隨著HTML5的日益壯大,瀏覽器自帶的webapi也隨著增多。本篇文章主要選取了幾個有趣且有用的webapi進行介紹,分別介紹其用法、用處以及瀏覽器支援度,同時我也分別為這幾個api都做了一個簡單的demo(真的很簡單,樣式等於沒有~)這幾個api分別是:

  • page lifecycle
  • onlineState
  • 利用deviceOrientation製作一個隨著手機旋轉的正方體
  • battery status
  • custom event
  • 利用execCommand完成一個簡單的富文字

page lifecycle(網頁生命週期)

介紹

我們可以用document.visibitilityState來監聽網頁可見度,是否解除安裝,但是在手機和電腦上都會現這種情況,就是比如說頁面開啟過了很久沒有開啟,這時你看在瀏覽器的tab頁中看著是可以看到內容的,但是點進去卻需要載入。chrome68新增了 freezeresume事件,來完善的描述一個網頁從載入到解除安裝,包括瀏覽器停止後臺程式,釋放資源各種生命階段。從一個生命週期階段到另外一個生命週期階段會觸發不同的事件,比如onfocus,onblur,onvisibilitychange,onfreeze等等,通過這些事件我們可以響應網頁狀態的轉換。具體的教程推薦大家看看阮一峰大神的教程

用法

window.addEventListener('blur',() => {})
window.addEventListener('visibilitychange',() => {
    // 通過這個方法來獲取當前標籤頁在瀏覽器中的啟用狀態。
    switch(document.visibilityState){
        case'prerender': // 網頁預渲染 但內容不可見
        case'hidden':    // 內容不可見 處於後臺狀態,最小化,或者鎖屏狀態
        case'visible':   // 內容可見
        case'unloaded':  // 文件被解除安裝
    }
});
複製程式碼

用處

大家可以看下這個demo

你(可能)不知道的web api
所以說,這個API的用處就是用來響應我們網頁的狀態,比如說我們的頁面是在播放視訊或者是一個網頁的遊戲,你可以通過這個API來去做出對應的響應,暫停視訊,遊戲暫停等等。

瀏覽器支援度

page visibilituState

你(可能)不知道的web api

online state(網路狀態)

這個API就很簡單了,就是獲取當前的網路狀態,同時也有對應的事件去響應網路狀態的變化。

用法

window.addEventListener('online',onlineHandler)
window.addEventListener('offline',offlineHandler)
複製程式碼

用處

比如說我們的網站是視訊網站,正在播放的時候,網路中斷了,我們可以通過這個API去響應,給使用者相應的提示等等。

瀏覽器支援度

你(可能)不知道的web api

Vibration(震動)

讓手機震動~~~ 嗯,就這麼簡單。

用法

// 可以傳入一個大於0的數字,表示讓手機震動相應的時間長度,單位為ms
navigator.vibrate(100)
// 也可以傳入一個包含數字的陣列,比如下面這樣就是代表震動300ms,暫停200ms,震動100ms,暫停400ms,震動100ms
navigator.vibrate([300,200,100,400,100])
// 也可以傳入0或者一個全是0的陣列,表示暫停震動
navigator.vibrate(0)
複製程式碼

用處

用來給使用者一個提示,比如說資料校驗失敗,當然震動不止這點作用,大家自己去擴充套件吧~~~

瀏覽器支援度

你(可能)不知道的web api

device orientation(陀螺儀)

通過繫結事件來獲取裝置的物理朝向,可以獲取到三個數值,分別是:

  • alpha:裝置沿著Z軸的旋轉角度

你(可能)不知道的web api

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

你(可能)不知道的web api

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

你(可能)不知道的web api

用法

window.addEventListener('deviceorientation',e => {
    console.log('Gamma:',e.gamma);
    console.log('Beta:',e.beta);
    console.log('Alpha:',e.Alpha);
})
複製程式碼

用處

這種自然是web VR 中的使用場景會相對較多。這是我寫的一個小demo

你(可能)不知道的web api

瀏覽器支援度

你(可能)不知道的web api

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('當前瀏覽器不支援~~~')
}
複製程式碼

用處

用來溫馨的提示使用者當前電量~~~

瀏覽器支援度

這個瀏覽器的支援度很低。。。。

你(可能)不知道的web api

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,效果如下:

你(可能)不知道的web api

瀏覽器支援度

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實現的。

瀏覽器支援度

你(可能)不知道的web api

最後

就先介紹到這些,web api越來越多,當然每個人不可能全都熟記於心,這篇文章也只是簡單介紹一下,還有很多有意思而且很重要的API,比如:web componentsservice workergenric sensor等等,不過這些都有很多人在鑽研,同時文件相對較多。 相信你看完這些至少已經知道這些API的大概用法了,如果有興趣瞭解用法的話,可以去看下我寫的demo,也可以去看看MDN文件去深入研究一下。

參考

相關文章