是的,您可以绑定不是直接在视频元素上触发的事件:
btn.onclick = e => vid.play();
<button id="btn">play</button><br>
<video id="vid" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4"></video>
因此,您可以将此按钮替换为任何其他要求用户单击的启动画面,并且您将被授予播放视频的权限。
但是为了保持这种能力,您必须在事件处理程序本身内至少调用一次视频play
方法。
不工作:
btn.onclick = e => {
// won't work, we're not in the event handler anymore
setTimeout(()=> vid.play().catch(console.error), 5000);
}
<button id="btn">play</button><br>
<video id="vid" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4"></video>
正确修复:
btn.onclick = e => {
vid.play().then(()=>vid.pause()); // grants full access to the video
setTimeout(()=> vid.play().catch(console.error), 5000);
}
<button id="btn">play</button><br>
<video id="vid" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4"></video>
Ps:这是specs 定义的受信任事件列表,我不确定 Safari 是否仅限于这些,也不确定是否包含所有这些。
关于 Chrome 和准备多个 MediaElements 的重要说明
Chrome 有一个由每个主机的最大并发请求数引起的长期错误,这确实会影响页面中的 MediaElement 播放,将它们的数量限制为 6。
这意味着您不能使用上述方法在页面中准备超过 6 个不同的 MediaElement。
不过,至少存在两种解决方法:
- 似乎一旦 MediaElement 被标记为user-approved,它就会保持这个状态,即使你改变了它的 src。因此,您最多可以准备 MediaElements,然后在需要时更改它们的 src。
- Web Audio API,同时也关注这个用户手势要求,一旦允许就可以播放任意数量的音频源。因此,由于该
decodeAudioData()
方法,人们可以将所有音频资源加载为 AudioBuffers,甚至可以加载来自视频媒体的音频资源,这些图像流可以<video>
与 AudioBuffer 并行显示在静音元素中。