HTMLMediaElement.play() 傳回了一個承諾

自動在網路上播放音訊和視訊是一項強大的功能,同時也有不同平台的限制。目前,大多數的電腦版瀏覽器會一律允許網頁在沒有使用者互動的情況下,透過 JavaScript 開始播放 <video><audio> 內容。 不過,大多數行動瀏覽器需要明確的使用者手勢,才能播放 JavaScript 啟動播放。這樣可以確保行動裝置使用者 (許多人需支付頻寬費用,或可能在公共環境) 的使用者在未明確與頁面互動的情況下,才會意外開始下載及播放媒體。

一直以來,我們都很難判斷是否需要使用者互動才能開始播放,以及偵測 (自動) 嘗試播放時發生的錯誤。有多種解決方法,但不太理想。為解決這項不確定性,我們改進基礎 play() 方法的修正結果已非預期時間,現在此做法已成為網路平台,並首度在 Chrome 50 中實作。

<video><audio> 元素的 play() 呼叫現在會傳回 Promise。如果播放成功,Promise 就會完成,但如果播放失敗,Promise 就會遭拒,並顯示錯誤訊息說明失敗情形。讓您編寫直覺化的程式碼,如下所示:

var playPromise = document.querySelector('video').play();

// In browsers that don’t yet support this functionality,
// playPromise won’t be defined.
if (playPromise !== undefined) {
    playPromise.then(function() {
    // Automatic playback started!
    }).catch(function(error) {
    // Automatic playback failed.
    // Show a UI element to let the user manually start playback.
    });
}

除了偵測 play() 方法是否成功之外,新的 Promise 介面可讓您判定 play() 方法成功的時間。在某些情況下,網路瀏覽器可能會決定延後開始播放時間。舉例來說,電腦版 Chrome 必須等到分頁出現後,才會開始播放 <video>。實際開始播放之後,Promise 才會執行要求,也就是說,在播放媒體之前,then() 中的程式碼都不會執行。先前判斷 play() 是否成功的方法,例如等待一定時間的 playing 事件,以及假設並未觸發,便很容易在延遲播放情境中產生偽陰性結果。

我們發布了這項新功能的實際範例。在支援這個 Promise 介面的瀏覽器 (例如 Chrome 50) 中查看變數。注意:頁面會在你造訪時自動播放音樂。(當然,當然不是!)

危險區域

<video> 中的 <source>play() 承諾不會拒絕

如果是 <video src="not-existing-video.mp4"\>play() 承諾會意外拒絕,因為影片不存在。如果是 <video><source src="not-existing-video.mp4" type='video/mp4'></video>play() 承諾絕不會拒絕。只有在沒有有效來源時才會發生。

Chromium 錯誤