【问题标题】:cancel an if statement if another statement comes true如果另一个语句为真,则取消一个 if 语句
【发布时间】:2018-12-17 04:18:24
【问题描述】:

我有这个功能,可以为不同的键播放不同的声音。但是如果我按下一个键,然后立即按下另一个键,之前的声音仍然会播放。

我的问题是,播放新的声音时如何取消之前的声音?

代码如下:

    
 window.addEventListener("keydown", checkKeyPressed, false);

    function checkKeyPressed(evt) {
        if (evt.keyCode == "81") { //q
            document.getElementById('enklyd').play();
        }
        if (evt.keyCode == "87") { //w
            document.getElementById('lyd1').play();
        }
        if (evt.keyCode == "69") { //e
            document.getElementById('lyd2').play();
        }
        if (evt.keyCode == "82") { //r
            document.getElementById('lyd3').play();
        }
        if (evt.keyCode == "84") { //t
            document.getElementById('lyd4').play();
        }
        if (evt.keyCode == "89") { //y
            document.getElementById('lyd5').play();
        }
    }

【问题讨论】:

标签: javascript function if-statement html5-audio


【解决方案1】:

这实际上并不是“停止” if 语句的问题,因为它们各自正确地完成了自己的工作。您要停止的是正在播放的声音片段。

为此,您可以使用.pause() 方法,将.currentTime 设置为0,或者我相信您也可以将音量设置为0,然后让它播放。

正如评论中提到的,有一些 SO 问题可能已经回答了这个问题。是否存在未在其中得到解答的独特情况?

【讨论】:

    【解决方案2】:

    我认为这对你有用:

    var e = document.getElementById('enklyd');
    function checkKeyPressed(evt) {
        if (evt.keyCode == "81") { //q
            e.pause();
            e.currentTime = 0;
            e = document.getElementById('enklyd');
            e.play();
        }
        if (evt.keyCode == "87") { //w
            e.pause();
            e.currentTime = 0;
            e = document.getElementById('lyd1');
            e.play();
        }
        if (evt.keyCode == "69") { //e
            e.pause();
            e.currentTime = 0;
            e = document.getElementById('lyd2');
            e.play();
        }
        if (evt.keyCode == "82") { //r
            e.pause();
            e.currentTime = 0;
            e = document.getElementById('lyd3');
            e.play();
        }
        if (evt.keyCode == "84") { //t
            e.pause();
            e.currentTime = 0;
            e = document.getElementById('lyd4');
            e.play();
        }
        if (evt.keyCode == "89") { //y
            e.pause();
            e.currentTime = 0;
            e = document.getElementById('lyd5');
            e.play();
        }
    }
    

    【讨论】:

    • 谢谢,但此错误消息显示:Uncaught TypeError: Cannot read property 'pause' of undefined at checkKeyPressed
    • @ff29 我刚刚更新了我的答案。查看代码块的顶部。
    • 如果即使第一行也失败了,那一定是因为你的代码的上下文。
    【解决方案3】:

    实际上,问题不在于if 条件。但是你可以试试下面的代码,我认为这对你很有效。

    window.addEventListener("keydown", checkKeyPressed, false);
    
    var keyMap = {
        "81": "enklyd", //q
        "87": "lyd1", //w
        "69": "lyd2", //e
        "82": "lyd3", //r
        "84": "lyd4", //t
        "89": "lyd5", //y
    };
    
    var prevPlayed = null, target = null, prevTarget = null;
    
    function checkKeyPressed(evt) {
    
        prevTarget = document.getElementById(keyMap[prevPlayed])
        target = document.getElementById(keyMap[evt.keyCode]);
    
        if (prevPlayed !== null && prevTarget !== null)
            prevTarget.pause();
    
        if (keyMap[evt.keyCode] && target !== null) {
            target.currentTime = 0;
            target.play();
        }
    
        prevPlayed = evt.keyCode;
    }
    

    【讨论】:

      【解决方案4】:

      你应该使用'switch'而不是'if'。只需为所有元素添加一个通用类

      const yourDiv = document.querySelector('yourDiv');
      window.addEventListener("keydown", checkKeyPressed, false);
      
      function checkKeyPressed(evt) {
          yourDiv.currentTime = 0;
          switch(evt) {
              case '81':                
                  document.getElementById('enklyd').play();
                  break;
              case '87' :
                  document.getElementById('lyd1').play();
                  break;
              case '69' :
                  document.getElementById('lyd2').play();
                  break;
              case '82' :
                  document.getElementById('lyd3').play();
                  break;
              case '84' :
                  document.getElementById('lyd4').play();
                  break;
              case '89' :
                  document.getElementById('lyd5').play();
                  break;
              default :
                  return null;
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-07
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        相关资源
        最近更新 更多