我做了一个网站,如果用户点击,它会播放声音。为了防止声音重叠,我不得不添加代码:
n.pause();
n.currentTime = 0;
n.play();
但这会导致错误:
The play() request was interrupted by a call to pause()
每次在另一个触发之后触发声音事件时都会出现。声音仍然可以正常播放,但我想防止此错误消息不断弹出。有任何想法吗?
我做了一个网站,如果用户点击,它会播放声音。为了防止声音重叠,我不得不添加代码:
n.pause();
n.currentTime = 0;
n.play();
但这会导致错误:
The play() request was interrupted by a call to pause()
每次在另一个触发之后触发声音事件时都会出现。声音仍然可以正常播放,但我想防止此错误消息不断弹出。有任何想法吗?
我最近也遇到了这个问题 - 这可能是play()
和之间的竞争条件pause()
。看起来有一个关于这个问题的参考,或者这里有一些相关的东西。
正如@Patrick指出的那样,pause
不返回Promise(或任何东西),因此上述解决方案不起作用。虽然 MDN 没有关于 的文档pause()
,但在WC3 的 Media Elements 草案中,它说:
媒体暂停()
将 paused 属性设置为 true,必要时加载媒体资源。
因此,您还可以检查paused
其超时回调中的属性。
基于这个很好的 SO answer,这里有一种方法可以检查视频是否正在(或不是)真正播放,因此您可以安全地触发 play() 而不会出现错误。
var isPlaying = video.currentTime > 0 && !video.paused && !video.ended
&& video.readyState > video.HAVE_CURRENT_DATA;
if (!isPlaying) {
video.play();
}
经过数小时的搜索和工作,我找到了完美的解决方案。
// Initializing values
var isPlaying = true;
// On video playing toggle values
video.onplaying = function() {
isPlaying = true;
};
// On video pause toggle values
video.onpause = function() {
isPlaying = false;
};
// Play video function
function playVid() {
if (video.paused && !isPlaying) {
video.play();
}
}
// Pause video function
function pauseVid() {
if (!video.paused && isPlaying) {
video.pause();
}
}
之后,您可以尽快切换播放/暂停,它会正常工作。
我遇到了这个问题,并且有一个案例,我需要点击 pause() 然后 play() 但是当使用 pause().then() 时,我得到了未定义。
我发现如果我在暂停后 150 毫秒开始播放它解决了这个问题。(希望谷歌尽快修复)
playerMP3.volume = 0;
playerMP3.pause();
//Avoid the Promise Error
setTimeout(function () {
playerMP3.play();
}, 150);
试试看
n.pause();
n.currentTime = 0;
var nopromise = {
catch : new Function()
};
(n.play() || nopromise).catch(function(){}); ;
我刚刚在https://developers.google.com/web/updates/2017/06/play-request-was-interrupted上发表了一篇关于这个确切问题的文章,它告诉你到底发生了什么以及如何解决它。