zoukankan      html  css  js  c++  java
  • 关于 Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause() 错误

    最近在做项目的时候发现一个如题的控制台报错。

    报错截图

    一看右侧的报错文件是undefined

    这下苦恼了,定位不到问题所在。

    今天解决了这个问题,就来分享一下。

    问题的关键所在是在执行了play()方法以后立即执行pause()方法。反之亦然

    以下贴出代码

    HTML:

    <button id="btn1">test</button>

    JS:

    var music=new Audio();
    music.src="/1.mp3";//这里替换成一个有效的音频文件地址以方便测试
    music.loop=true;
    var playStatus=false;

    function playOrPause(){
    if(playStatus){
    music.pause();
    }else{
    music.play();
    }
    playStatus=!playStatus;
    }
    for(var i=0;i<10;i++){
    document.querySelector("#btn1").click();
    }
    

    标红处的代码是连续点击10下#btn1  亦即连续快速执行10次playOrPause() 会出现图1的报错情况(当然 连续2下就会出错)

    当然,我们可以设置一个保护性延时

    如下

    var music=new Audio();
    music.src="/1.mp3";
    music.loop=true;
    var playStatus=false;
    var lastRunTime=Date.now();
    function playOrPause(){
    var currentTime=Date.now();
    var protectTime=100;//设置保护性延时 单位毫秒,不要小于50 建议100以上
    if((currentTime-lastRunTime)&lt;protectTime){
    return;//两次执行太过频繁,直接退出
    }

    if(playStatus){
    music.pause();
    }else{
    music.play();
    }
    playStatus=!playStatus;
    lastRunTime=Date.now();
    }

    for(var i=0;i<10;i++){

    document.querySelector("#btn1").click();

    }

    但是,这样就违背了我们想模拟连按10下的初衷

    所以可以用这种方法

    var music=new Audio();
    music.src="/1.mp3";
    music.loop=true;
    var playStatus=false;
    var lastRunTime=Date.now();
    function playOrPause(){
        var currentTime=Date.now();
        var protectTime=100;//设置保护性延时 单位毫秒,不要小于50 建议100以上
        if((currentTime-lastRunTime)<protectTime){
            return;//两次执行太过频繁,直接退出
        }
        
        if(playStatus){
            music.pause();
        }else{
            music.play();
        }
        playStatus=!playStatus;
        lastRunTime=Date.now();
    }
    var counter=10;//要连点的次数
    var timer=setInterval(function(){
        if(counter>0){
            document.querySelector("#btn1").click();
        }else{
            clearInterval(timer);
        }
        counter--;
    },500)
  • 相关阅读:
    ini 文件
    基元类型、引用 类型与值类型
    C#的 is 和 as 类型转换
    MVC 项目中为什么会有两个web.config
    Linux下安装SVN服务端小白教程
    测试博文中添加可执行JS代码
    坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)
    fsfds
    高斯混合模型Gaussian Mixture Model (GMM)
    ggplot2绘制概率密度图
  • 原文地址:https://www.cnblogs.com/zzsdream/p/6125223.html
Copyright © 2011-2022 走看看