在我的React应用程序中,我在Safari中遇到了一个问题(这在Chrome和Firefox中运行良好(,当我用鼠标悬停在视频上播放时,我会收到以下错误:
NotAllowedError:用户代理或平台,可能是因为用户拒绝准许
相关代码块如下:
{ this.state.url ?
<video className="video"
onMouseOver={event => {
this.onVideoPlay(this.state.url, event);
}}
onMouseOut={event => {
this.onVideoPause(this.state.url, event);
}}
src={`${this.state.url}`} >
</video>
: null
}
我的两个函数是这样的:
onVideoPlay = async (videoUrl, event) => {
if (!videoUrl || !event || videoUrl === 'url(${videoBg})') return;
if (!this.state.isPlaying) {
await event.target.play();
this.setState({ isPlaying: true });
}
};
onVideoPause = async (videoUrl, event) => {
if (!videoUrl || !event) return;
if (this.state.isPlaying) {
await event.target.pause();
this.setState({ isPlaying: false });
}
}
这里的问题是什么,我该如何解决?
如果非要我打赌,我会说问题是试图在没有直接用户交互的情况下播放未静音的视频。
根据Safari文档:
只有当元素不包含音轨或静音属性设置为true时,它才能使用play((方法自动播放而不需要用户手势。如果此视频元素获得音轨或在没有用户手势的情况下取消静音,则播放将暂停。如果视频元素在屏幕上不可见或在视口外,则播放停止。
将视频配置为静音播放应该可以解决这个问题,MDN自动播放指南也指出了这一点。
你可以争辩说,在你的情况下,你确实有一个用户手势,鼠标悬停。但这不算与网站的互动。它必须是点击或按键,正如webkit博客所指定的那样。
例如,它能和点击一起工作吗?