The HTMLMediaElement
method play()
attempts to begin playback of the media. It returns a Promise
which is resolved when playback has been successfully started. Failure to begin playback for any reason, such as permission issues, result in the promise being rejected.
If the user agent is configured not to allow automatic or script-initiated playback of media, calling play()
will cause the returned promise to be immediately rejected with a "NotAllowedError"
. Web sites should be prepared to handle this situation. For example, a site should not present a user interface that assumes playback has begun automatically, but should instead update their UI based on whether the returned promise is resolved or rejected. See the example below for more information.
Note: The play()
method may cause the user to be asked to grant permission to play the media, resulting in a possible delay before the returned promise is resolved. Be sure your code doesn't expect an immediate response.
var promise = HTMLMediaElement.play();
None.
A Promise
which is resolved when playback has been started, or is rejected if for any reason playback cannot be started.
Note: Older browsers may not return a value from play()
.
The promise's rejection handler is called with an exception name passed in as its sole input parameter (as opposed to a traditional exception being thrown). Possible errors include:
NotAllowedError
NotSupportedError
MediaStream
, MediaSource
, Blob
, or File
, for example) doesn't represent a supported media format.Other exceptions may be reported, depending on browser implementation details, media player implementation, and so forth.
This example demonstrates how to confirm that playback has begun and how to gracefully handle blocked automatic playback:
let videoElem = document.getElementById("video"); let playButton = document.getElementById("playbutton"); playButton.addEventListener("click", handlePlayButton, false); playVideo(); async function playVideo() { try { await videoElem.play(); playButton.className = "playing"; } catch(err) { playButton.className = ""; } } function handlePlayButton() { if (videoElem.paused) { playVideo(); } else { videoElem.pause(); playButton.className = ""; } }
In this example, playback of video is toggled off and on by the async
playVideo()
function. It tries to play the video, and if successful sets the class name of the playButton
element to "playing"
. If playback fails to start, the playButton
element's class is cleared, restoring its default appearance. This ensures that the play button matches the actual state of playback by watching for the resolution or rejection of the Promise
returned by play()
.
When this example is executed, it begins by collecting references to the <video>
element as well as the <button>
used to toggle playback on and off. It then sets up an event handler for the click
event on the play toggle button and attempts to automatically begin playback by calling playVideo()
.
You can try out or remix this example in real time on Glitch.
Specification | Status | Comment |
---|---|---|
HTML Living Standard The definition of 'play()' in that specification. | Living Standard | Initial definition; living specification. |
HTML5 The definition of 'play()' in that specification. | Recommendation | Initial definition. |
Note: The WHATWG and W3C versions of the specification differ (as of August, 2018) as to whether this method returns a Promise
or nothing at all, respectively.
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | Yes | Yes | 3.5 | 9 | Yes | Yes |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | Yes | Yes | Yes | Yes | Yes | Yes | ? |
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play