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>。只有在實際開始播放時,承諾才會兌現,也就是說,只有在媒體開始播放時,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 錯誤