javascript - 如何在按住键盘按钮的情况下只播放一次声音?

标签 javascript jquery html audio

最近我使用 JavaScript 创建了一个简单的代码。基本上,它是一个按一下即可播放声音的程序。声音持续 3-4 秒。一切都工作正常,直到我发现如果我按住某个键,声音就会重复播放。他们没有完成长度,而是继续从头开始玩。我想要的只是它播放到最后并停止,如果抬起键并再次按下,则会再次播放。

这是我的代码:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Untitled Document</title>
</head>

<body>
    <audio id="fart" source src="" type="audio/mpeg"></audio>
    <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
    <script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    <script type="text/javascript">
        var player = document.getElementById("fart");
        //var keyIsDown = true;

        var getCommand = function (pressedChar) {
            var command = null;
            if (keyIsDown) {
                switch (pressedChar) {
                    case 'a':
                        //alert("I'm A.");
                        player.setAttribute("src", "1fart-07 C7.mp3");
                        player.play();
                        //keyIsDown = false;
                        break;
                    case 'b':
                        player.setAttribute("src", "2fart-05 D7.mp3");
                        player.play();
                        break;
                    case 'c':
                        player.setAttribute("src", "3fart-01 E7.mp3");
                        player.play();
                        break;
                    case 'd':
                        player.setAttribute("src", "4fart-03 F7.mp3");
                        player.play();
                        break;
                    case 'e':
                        player.setAttribute("src", "5fart Na G7.mp3");
                        player.play();
                        break;
                    case 'f':
                        player.setAttribute("src", "6fart Na A7.mp3");
                        player.play();
                        break;
                    case 'g':
                        player.setAttribute("src", "7fart Na B7.mp3");
                        player.play();
                        break;
                    case 'h':
                        player.setAttribute("src", "fart-07 C8.mp3");
                        player.play();
                        break;
                    default:
                        alert("OUT");
                        break;
                }
                return command;
            } else {
                command = null;
            }
        };
        /////
        /*$(document).keyup(function(e){
         keyIsDown = true;
         });*/

        //////
        $(document).keypress(function (e) {
            var code = e.keyCode || e.which;
            var pressedChar = String.fromCharCode(code).toLowerCase();
            var command = getCommand(pressedChar);
            keyIsDown = true;
        });

        $(document).ready(function () {
            console.log("ready!");
        });
        ///////
    </script>
    </body>
</html>

我用谷歌搜索发现this forum所以我尝试让它适应我的,但仍然没有成功。有人有什么建议吗?我也在Jquery找到了方法,但没有用。我觉得现在我已经接近答案了,但可能是我编码错误。请帮我。谢谢。

最佳答案

答案在这里... 1)为您使用的每个 key 创建一个变量并将其设置为 true,例如 var q = true;一开始。 2) 创建一个函数来检测键盘按钮是否弹起,使用与 keyDown 函数相同的变量。然后,将您在 (1) 中设置的变量设置为 true。

$(document).keyup(function (e) {
    console.log("One of the keys is up");
    var code = e.keyCode || e.which;
    var pressedChar = String.fromCharCode(code).toLowerCase();
    switch (pressedChar) {
        case'q':
            q = true;
            break;
        default:
            console.log("Nothing");
    }
});

3) 在播放音乐的主函数中,在开关盒内提供 if-else 函数来检测按键是否仍在按下。播放后();将变量设置为 false;

case 'q':
    if (q) {
        //alert("I'm A.");
        player.setAttribute("src", "1fart-07 C7.mp3");
        player.play();
        q = false;
    } else {
        command = null;
        console.log("q is holded"); // if the keyboard is pressed before it will be here. 
    }
    break;

关于javascript - 如何在按住键盘按钮的情况下只播放一次声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29986611/

相关文章:

javascript - clientWidth 和 clientHeight 报告零,而 getBoundingClientRect 是正确的

javascript - 不在 <form> 中的隐藏 &lt;input&gt; 包含在 "tab"序列中

JavaScript 从文件中加载innerHTML

javascript - 如何在 Django 模型表单中包含日期选择器?

javascript - 当 javascript 连续添加属性时,CSS 转换不起作用

Javascript计算器显示没有小数点的结果

javascript - 退出全屏不起作用?

html - 在 CSS 中渐变渐变

jquery - 在 div 中查找图像并将其设为 div 背景

javascript - Angular - 输入值和选择占位符不起作用