API 是 Application Programming Interface 的縮寫,它定義了軟件架構層次之間的交互。藉助 API,程序員可以在軟件開發中輕鬆地執行復雜的任務。如果沒有 API,那麼程序員的生活會很悲慘,沒有合適(例如安全)的數據訪問,要了解不必要的底層細節,等等。
在 Web API 中,有非常有用的對象、屬性和函數可用於執行小到訪問 DOM 這樣的小任務,大到處理音頻、視頻、圖形這樣的複雜任務。
一些著名的 Web API
如果你有 Web 開發背景,那麼你已經在使用其中的許多工具了。下面是一些非常著名的 Web API。
- Canvas
- Fetch
- History
- Geolocation
- DOM
- Console
- Drag & Drop API
在本文中,我將介紹另外 10 個不那麼流行的 Web API。不那麼流行並不意味着它們沒有用處。你可以在項目的各種用例中使用它們。讓我們逐個看一下。
摘要
如果你想立即查看源代碼或演示,請移步下面的鏈接:
源代碼:
https://github.com/atapas/demolab/tree/master/code/src/demos/web-apis
演示:
注意:Web API 只不過是使用原生 JavaScript 編寫和公開的接口、函數、對象和屬性。然而,Web API 的使用並不僅限於基於原生 JavaScript 的應用程序。在基於 Angular、React 或 Vue 開發的應用程序中使用它們也非常簡單。
本文中演示 Web API 的所有示例都是用 ReactJS 編寫的。你可以在上面提到的 GitHub 鏈接中找到它們。歡迎創建分支、修改及使用!
Web API 的一大痛點
使用 Web API 的一大痛點是,它們中的大多數還沒有標準化。這意味着,對 Web API 的支持可能因瀏覽器供應商的不同而有所不同。例如,你可能會發現一個 API 可以在 Chrome 瀏覽器上使用,但是 Firefox 或 Edge 瀏覽器還不支持它。
我建議通過以下兩種方法進行檢查:
- 在Can I Use網站上查看 Web API 的支持情況,只需要輸入名稱即可;
- 如果特定的 Web API 不受支持,則實現回退或反饋。大多數 Web API 都提供了方法檢查 Web API 是否受支持。當不受支持的時候,你可以實現回退,或者至少向用戶提供反饋。
不那麼知名但有用的 Web API
好了,讓我們來看下這些 API,希望對你有用。
1. 📺 Fullscreen API
你是否需要在全屏模式下顯示什麼 DOM 元素?遊戲應用程序、在線視頻平臺(如 YouTube)等是非常需要全屏的用例。
Fullscreen API 提供了以全屏模式顯示特定元素(及其子元素)的方法。有一個方法可以讓我們在不需要全屏模式時退出該模式。不僅如此,當 DOM 元素轉換到全屏模式或脫離全屏模式時,這個 API 還可以幫助執行任何操作。
在下面的例子中,我最喜歡的聖誕老人可以輕鬆地進入全屏模式及退出。
你是否需要在全屏模式下顯示什麼 DOM 元素?遊戲應用程序、在線視頻平臺(如 YouTube)等是非常需要全屏的用例。
Fullscreen API
提供了以全屏模式顯示特定元素(及其子元素)的方法。有一個方法可以讓我們在不需要全屏模式時退出該模式。不僅如此,當 DOM 元素轉換到全屏模式或脫離全屏模式時,這個 API 還可以幫助執行任何操作。
在下面的例子中,我最喜歡的聖誕老人可以輕鬆地進入全屏模式及退出。
在下面的代碼中,manageFullScreen()函數在一個 id 爲fs_id的元素上使用requestFullscreen()API。
const manageFullscreen = () => {
document.getElementById('fs_id').requestFullscreen();
}
Id 爲 fs_id 的元素是一個包含子元素(即聖誕老人圖片)的 DIV。
<div className="column">
<div id="fs_id">
<Img fixed={imageData.image.childImageSharp.fixed} alt="santa" />
</div>
<StyledButton
onClick={manageFullscreen}>
Enter Fullscreen with Santa
</StyledButton>
</div>
你可以檢查一下瀏覽器是否支持 Fullscreen API。
if (document.fullscreenEnabled) {
setSupported(true);
} else {
setSupported(false);
}
另外可以留意下這兩個有用的處理程序:
另外可以留意下這兩個有用的處理程序:
- onfullscreenchange:一個處理 fullscreenchange 事件的事件處理程序;
- onfullscreenerror:一個處理 fullscreenerror 事件的事件處理程序。
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-fullscreen/
2. 📋 Clipboard Async API
什麼是剪切板?
剪切板是一些操作系統提供的一個緩衝區,用於短期存儲,以及應用程序內部和應用程序之間的數據傳輸。
使用剪切板主要可以執行三種操作,它們是copy
、cut
和paste
。Clipboard API 提供 了響應這三種操作的能力。
有趣的是,複製內容到剪切板是開放的,不需要用戶許可。但是,要將內容從剪切板粘貼到用戶應用程序則需要授權。這是使用另一個名爲Permission API的 Web API 實現的。
下面是一個簡單的複製 - 粘貼操作示例:
下面的代碼檢查瀏覽器是否支持該 API:
if (navigator.clipboard
&& navigator.clipboard.read
&& navigator.clipboard.write) {
setSupported(true);
} else {
setSupported(false);
}
下面是將內容寫入剪切板的 Async API 函數:
async function performCopy(event) {
event.preventDefault();
try {
await navigator.clipboard.writeText(copyText);
console.log(`${copyText} copied to clipboard`);
} catch (err) {
console.error('Failed to copy: ', err);
}
}
Async API 函數從剪切板讀取內容,並用它做一些事情:
async function performPaste(event) {
event.preventDefault();
try {
const text = await navigator.clipboard.readText();
setPastetext(text);
console.log('Pasted content: ', text);
} catch (err) {
console.error('Failed to read clipboard contents: ', err);
}
}
注意:通過包含 Clipboard Async API,就可以不用 document.execCommad() 函數了,因爲它現在已經過時了。
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-clipboard-apis/
3. 🧐 Resize Observer API
你是否希望針對 DOM 元素內容或邊框的變化做一些操作?你是否考慮自己編寫一個處理程序?如果我告訴你,已經有 Web API 實現提供了一個呢?
在下面的示例中,我們可以使用範圍滑動條來調整按鈕的大小。當按鈕大小被調整時,我們還想控制文本顏色,而按鈕並不知道。
首先,創建一個按鈕並指定 id,稍後我們可以使用這個 id 訪問該按鈕:-
<StyledButton id="dumbBtnId">
I am a Dumb Button
</StyledButton>
現在,創建一個滑動條,使用 HTML5 的 input 類型 range。當滑動條的值變化時會觸發 resize() 函數。
<div>
<input
onChange={(event) => resize(event)}
type="range"
min={minRange}
max={maxRange}
defaultValue={rangeValue} />
</div>
resize() 函數根據滑動條的範圍值設置按鈕的寬度,從而動態地調整其大小:
const resize = event => {
const value = event.target.valueAsNumber;
setRangeValue(value);
let dumbBtn = document.getElementById('dumbBtnId');
dumbBtn.style.width = `${value}px`;
}
到目前爲止,沒什麼問題吧?現在,對於範圍值的每一次改變,按鈕大小都將被調整。我們用 ResizeObserver 觀察這個變化並改變按鈕文本的顏色。
useEffect(() => {
try {
let dumbBtn = document.getElementById('dumbBtnId');
var resizeObserver = new ResizeObserver(entries => {
for(const entry of entries) {
// Get the button element and color it
// based on the range values like this,
entry.target.style.color = 'green`;
}
});
resizeObserver.observe(dumbBtn);
} catch(e) {
setSupported(false);
console.log(e);
}
}, [rangeValue]);
演示鏈接:
https://demo.greenroots.info/web-apis/web-api-resize-observer/
4. 📷 Image Capture API
圍繞音頻,視頻等用戶媒體,有一些很酷而且很有用的 API。我喜歡Image Capture API
,它可以幫助我們捕捉圖像或從視頻設備(如網絡攝像頭)抓取幀。不僅如此,你還可以在捕捉圖像或抓取幀時執行操作。
首先,獲得用戶媒體訪問權限。在這種情況下,我們獲得了網絡攝像頭的訪問權限。
navigator.mediaDevices.getUserMedia({video: true})
.then(mediaStream => {
document.querySelector('video').srcObject = mediaStream;
const track = mediaStream.getVideoTracks()[0];
setTrack(track);
}).catch(error => {
console.error(` ${error} is not yet supported`);
setError(error);
});
就像剪切板粘貼操作,攝像頭媒體訪問權限必須由用戶授予。
現在抓取一幀,並做些操作。在這個例子中,我只是在畫布上畫出這一幀。
const imageCapture = new ImageCapture(track);
imageCapture.grabFrame()
.then(imageBitmap => {
const canvas = document.querySelector('#grabFrameCanvas');
drawCanvas(canvas, imageBitmap);
}).catch(error => {
console.log(error);
setError(error);
});
我也可以拍一張照片並做類似的事情。
const imageCapture = new ImageCapture(track);
imageCapture.takePhoto().then(blob => createImageBitmap(blob))
.then(imageBitmap => {
const canvas = document.querySelector('#takePhotoCanvas');
drawCanvas(canvas, imageBitmap);
}).catch(error => {
console.log(error);
setError(error);
});
要停止接收攝像頭的視頻流,只需要在正在運行的視頻追蹤上運行 stop() 方法。
const videoOff = () => {
track.stop();
}
另外留意下下面的方法:
- getPhotoCapabilities():獲取可用配置選項的範圍。
- getPhotoSettings():獲取當前照片的配置設置。
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-image-capture/
5. 📡 Broadcast Channel API
Broadcast Channel API允許瀏覽上下文(窗口、標籤頁、iframe)和同源 worker 之間進行通信。考慮這樣一個用例,在你從一個在瀏覽器標籤頁中運行的應用程序註銷時,你希望將其廣播到在同一瀏覽器的其他標籤中打開的應用程序實例。
在下面的示例中,發送方向接收方發送消息,同樣的消息會廣播到瀏覽上下文(在本例中爲標籤頁)。
第一步是使用唯一名創建一個廣播通道,還要定義要廣播的內容(消息)。
const CHANNEL_NAME = "greenroots_channel";
const bc = new BroadcastChannel(CHANNEL_NAME);
const message = 'I am wonderful!';
要廣播消息,在通道上調用 postMessage() 方法並傳入消息。
const sendMessage = () => {
bc.postMessage(message);
}
在接收端,廣播監聽者接收到消息通知。
const CHANNEL_NAME = "greenroots_channel";
const bc = new BroadcastChannel(CHANNEL_NAME);
bc.addEventListener('message', function(event) {
console.log(`Received message, "${event.data}", on the channel, "${CHANNEL_NAME}"`);
const output = document.getElementById('msg');
output.innerText = event.data;
});
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-broadcast/
6. ⏱️ Performance Interface API
Performance接口主要提供以下三個 API:
- Navigation
- Memory
- Timing
下面是輸出內存使用情況的例子:
console.log(performance.memory);
下面是另一個示例,它獲得導航的性能統計數據:
const [entry] = performance.getEntriesByType("navigation");
console.table(entry)
演示鏈接:
https://demo.greenroots.info/web-apis/web-api-performance/
7. 🔋 Battery Status API
對於你的筆記本電腦、PC 或設備,你想知道所有關於電池的信息嗎?是的,有這樣一個 Web API,名爲Battery Status API
。這個 API 可以幫助我們瞭解所有信息,如電池是否正在充電,還有多少電量,並提供了與充電相關的狀態變化的處理程序。
下面的示例顯示了我在插入和拔出筆記本電腦充電器時的狀態變化:
下面的代碼解釋瞭如何處理和使用與電池相關的信息。-
navigator.getBattery().then(function (battery) {
// handle the charging change event
battery.addEventListener("chargingchange", function () {
console.log("Battery charging? " + (battery.charging ? "Yes" : "No"));
});
// handle charge level change
battery.addEventListener("levelchange", function () {
console.log("Battery level: " + battery.level * 100 + "%");
});
// handle charging time change
battery.addEventListener("chargingtimechange", function () {
console.log( "Battery charging time: " + battery.chargingTime + " seconds");
});
// handle discharging time change
battery.addEventListener("dischargingtimechange", function () {
console.log("Battery discharging time: " + battery.dischargingTime + " seconds");
});
});
我喜歡這個 API,它用起來很有趣。不好的是,這個 API 將來可能會被淘汰。
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-battery/
8. 📶 Network Information API
Network Information API 提供關於網絡類型(例如“WiFi”、“蜂窩”等)、數據保存模式、帶寬等信息。
console.log(navigator.connection);
演示鏈接:
https://demo.greenroots.info/web-apis/web-api-network-info/
9. 📳 Vibration API
這是另一個連接到系統硬件並執行操作的示例。Vibration API 提供了啓動設備振動(瞬間或持續)和停止振動的方法。
useEffect(() => {
if (start) {
// vibrate for 2 seconds
navigator.vibrate(2000);
} else {
// stop vibration
navigator.vibrate(0);
}
}, [start]);
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-vibration/
10. 🤙 Bluetooth API
該 Web API 讓你可以連接到藍牙設備。
navigator.bluetooth.requestDevice({
acceptAllDevices: true
}).then(device => {
setDeviceName(device.name);
setDeviceId(device.id)
setDeviceConnected(device.connected);
}).catch(err => {
console.log(err);
setError(true);
})
演示鏈接:
https://demo.greenroots.info/web-apis/web-apis-bluetooth/
更多 API
- Payment Request API:爲商家和用戶提供一致的支付體驗。
- Touch Events:提供相對底層的 API,可用於支持特定於應用程序的多點觸控交互,如雙指手勢。
- Page Visibility:提供可供監視的事件,以瞭解文檔何時可見或隱藏。
- Channel Messaging API:另一種在瀏覽上下文中發送消息的好方法。然而,與廣播不同的是,它是一對一地發送信息。