HTMLMediaElement:play() 方法
该 HTMLMediaElement
play()
方法尝试开始媒体播放。它返回一个 Promise
,当播放成功开始时,该 Promise 将被解析。
由于任何原因(例如权限问题)导致播放失败,都会导致 Promise 被拒绝。
语法
play()
参数
无。
返回值
一个 Promise
,当播放开始时被解析,或者如果由于任何原因无法开始播放而被拒绝。
注意:2019 年之前发布的浏览器可能不会从 play()
返回值。
异常
Promise 的拒绝处理程序被调用,其中 DOMException
对象作为其唯一的输入参数传递(而不是抛出传统的异常)。可能的错误包括
NotAllowedError
DOMException
-
如果用户代理(浏览器)或操作系统不允许在当前上下文或情况下播放媒体,则提供。例如,浏览器可能要求用户通过点击“播放”按钮来显式启动媒体播放,因为存在 权限策略。
NotSupportedError
DOMException
-
如果媒体源(例如,可以指定为
MediaStream
、MediaSource
、Blob
或File
)不表示受支持的媒体格式,则提供。
可能会报告其他异常,具体取决于浏览器实现细节、媒体播放器实现等。
使用说明
尽管“自动播放”一词通常被认为是指在页面加载后立即开始播放媒体的页面,但 Web 浏览器的自动播放策略也适用于任何脚本启动的媒体播放,包括对 play()
的调用。
如果 用户代理 配置为不允许自动或脚本启动的媒体播放,则调用 play()
将导致返回的 Promise 立即被拒绝,并显示 NotAllowedError
。网站应准备好处理这种情况。例如,网站不应提供假设播放已自动开始的用户界面,而应根据返回的 Promise 是否已完成或拒绝来更新其 UI。有关更多信息,请参阅下面的 示例。
注意:play()
方法可能会导致系统提示用户授予播放媒体的权限,从而导致在解析返回的 Promise 之前可能存在延迟。请确保您的代码不期望立即响应。
有关自动播放和自动播放阻止的更深入信息,请参阅我们的文章 媒体和 Web Audio API 的自动播放指南。
示例
此示例演示如何确认播放已开始以及如何优雅地处理被阻止的自动播放
let videoElem = document.getElementById("video");
let playButton = document.getElementById("playbutton");
playButton.addEventListener("click", handlePlayButton, false);
playVideo();
async function playVideo() {
try {
await videoElem.play();
playButton.classList.add("playing");
} catch (err) {
playButton.classList.remove("playing");
}
}
function handlePlayButton() {
if (videoElem.paused) {
playVideo();
} else {
videoElem.pause();
playButton.classList.remove("playing");
}
}
在此示例中,视频的播放由 async
playVideo()
函数切换打开和关闭。它尝试播放视频,如果成功,则将 playButton
元素的类名设置为 "playing"
。如果播放未能启动,则 playButton
元素的类将被清除,恢复其默认外观。这通过监视 play()
返回的 Promise
的解析或拒绝来确保播放按钮与实际播放状态匹配。
此示例在执行时,首先收集对 <video>
元素以及用于切换播放打开和关闭的 <button>
的引用。然后,它为播放切换按钮上的 click
事件设置事件处理程序,并尝试通过调用 playVideo()
自动开始播放。
您可以在 Glitch 上实时试用或重新混合此示例。
规范
规范 |
---|
HTML 标准 # dom-media-play-dev |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。