javascript - 为什么 video.requestPictureInPicture() 只能工作一次?
问题描述
我正在尝试通过 Javascript onscroll 功能进入和退出视频的 PIP 模式,我只能进入和退出此模式一次。这是我的代码笔:
if (!myVideo.paused && myVideo.currentTime > 0
&& !myVideo.ended && !isVideoPIP) {
console.log('runPip')
myVideo.requestPictureInPicture()
.then(()=>{isVideoPIP = true;})
.catch(e=>console.log(e.message))
}
https://codepen.io/Greggg/pen/WBdeJG
我第二次收到此错误消息“如果画中画中还没有元素,则必须处理用户手势。”
解决方案
如果它不起作用,那是因为scroll
它不是用户信任事件的一部分。
现在,有时它的工作原理实际上很奇怪......但有一个合理的解释。
用户信任的事件通常被认为存在相当长的一段时间,但它们最终应该会消失:
btn_500ms.onclick = e => trigger_in(500); // works
btn_6s.onclick = e => trigger_in(6000); // fails
function trigger_in(ms) {
setTimeout(() => {
video.requestPictureInPicture()
.then(() => {
// auto-exit in 1s
setTimeout(() => {
document.exitPictureInPicture();
}, 1000);
})
.catch(console.error);
}, ms);
};
<video id="video" controls="" muted loop autoplay src="https://media.w3.org/2010/05/sintel/trailer.webm"></video>
<button id="btn_500ms">trigger PiP in 500ms</button>
<button id="btn_6s">trigger PiP in 6s</button>
所以我猜你解释为只在第一次滚动时工作实际上是由某些情况引起的,即你在小于用户信任事件的最大生命周期后滚动(在当前的 Chrome74 中似乎是 5 秒)。您可以尝试在再次滚动之前单击 codepen 页面中的任意位置。
推荐阅读
- c# - 方法返回错误“并非所有代码路径都返回值,请协助
- c++ - 在 Crypto++ 中使用 ECDSA 的正确方法是什么
- uwp - 除非大小更改,否则 UWP CommandBar 更多按钮不显示
- javascript - 条件 scss 或覆盖变量
- android - 使用androidx.fragment.app.Fragment,发现在initView()中无法初始化initAdapter(),为什么?
- flutter - 执行 gitlab 管道作业后执行 codemagic 构建
- django - 当我单击图像然后在其他 html 页面上显示 3 个图像但是这 3 个图像对于每个单击的图像都是不同的
- c# - Visual Studio 2019 IIS Express 无限等待
- node.js - 使用 heroku 在 nodejs 应用程序中匹配 os.type() 失败
- android - 由于数据绑定,Espresso 测试失败