最近在运用audio时碰到一个题目,那就是在Chrome DevTools 老是报错:
Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().
or
Uncaught (in promise) DOMException: The play() request was interrupted by a new load request.
报错:
除了google阅读器,其他阅读都没有报错。 而且虽然报错,实在照样能一般播放声响,本来想就如许了,然则看到有报错。总有一点膈应。
厥后google了一下 发明是由于挪用play()的时刻,音频文件还没有加载完成的题目。
之前代码:
知道了是这个题目,那末怎样修复呢?
例子:Autoplay
<video id="video" preload="none" src="https://example.com/file.mp4"></video>
<script>
// Show loading animation.
var playPromise = video.play();
if (playPromise !== undefined) {
playPromise.then(_ => {
// Automatic playback started!
// Show playing UI.
})
.catch(error => {
// Auto-play was prevented
// Show paused UI.
});
}
</script>
经由过程这个例子已能够处理题目,
然则新的题目来了,promise在低版本的阅读器不支持。
Chrome 50才有 video和audio才在play()上面返回了一个promise;
然后我又看到了这个例子。
例子2:Fetch & Play
<video id="video"></video>
<button id="button"></button>
<script>
button.addEventListener('click', onButtonClick);
function onButtonClick() {
// This will allow us to play video later...
video.load();
fetchVideoAndPlay();
}
function fetchVideoAndPlay() {
fetch('https://example.com/file.mp4')
.then(response => response.blob())
.then(blob => {
video.srcObject = blob;
return video.play();
})
.then(_ => {
// Video playback started ;)
})
.catch(e => {
// Video playback failed ;(
})
}
</script>
经由过程这两个例子,我在想 用Fetch低版本照样不兼容。因而乎我就想用$.ajax, 由于他的本意不就是一个异步么。先用阿贾克斯要求音频文件,然后在回调内里挪用play要领不就能够了么。
但是却被实际啪啪的打脸。照样不可 报一样的错。申明此路不通啊。
没办法我就只能再讨教google, 然后我在GitHub上面看到有人如许说;
发明这也能够。因而我就把我的代码改了一下:
// 播放声响
function playVoice(src, domId) {
var $dom = $('#' + domId)
if ($.browser.msie) {
// IE用bgsound标签处置惩罚声响
if ($dom.length) {
$dom[0].src = src;
} else {
$('<bgsound>', {src: src, id: domId}).appendTo('body');
}
} else {
// IE之外的别的阅读器用HTML5处置惩罚声响
if ($dom.length) {
$dom[0].load();
setTimeout(function() {
$dom[0].play();
}, 200);
} else {
$('<audio src='+src+' id='+domId +' controls autoplay preload="auto">').appendTo('body')[0].load();
playVoice(src, domId);
}
}
}
人人一看也就邃晓了,就是先load,然后异步去挪用play,然则我用0,在我革新快,频仍的时刻照样会报错、因而我就改成200ms,至于延时器内里的200ms,我也是本身也许写了一个数字.
以上题目临时处理。