当你想在javascript中使用它们时,你如何规避重复的按键消息,你按住键,但只希望它播放一次

How do you circumvent repeated keydown messages when you want to use them with javascript where you hold the key down but want it only to play once?

本文关键字:消息 一次 播放 希望 javascript 当你 何规避      更新时间:2023-09-26

我有一段代码,看起来像下面这样,它工作得很好。它的作用是,当鼠标点击一个名为synth的div时,它会启动一个振荡器声音。然后,当鼠标按钮被释放时,它停止播放振荡器。

 synth.onmousedown= function () {
    oscillator = context.createOscillator(),  // Creates the oscillator 
    oscillator.type = synthWaveform.value;  
    oscillator.frequency.value = pitchInput.value;                   
    oscillator.connect(context.destination);  // Connects it to output
    oscillator.noteOn(0); 

    };

    synth.onmouseup = function ()    {  
    oscillator.disconnect(); 
    };

然后我添加了下面的代码,这样当用户按下键盘字符时就会触发振荡器。问题是,当键被按住时,它会反复播放,然后当键盘字符被释放时不会停止。我想知道是否有任何库或代码可以用来规避这一点。我们的目标是让最终的结果像鼠标向下/向上的效果,但键盘运动触发的声音。谢谢你。

$('body').keydown(function() {
oscillator = context.createOscillator(),  // Creates the oscillator 
oscillator.type = synthWaveform.value;  
oscillator.frequency.value = pitchInput.value;                   
oscillator.connect(context.destination);  // Connects it to output
oscillator.noteOn(0); 
});
$('body').keyup(function() {
oscillator.disconnect();
});

如果你需要比下面的选项更花哨的东西,你可以使用underscore.js debounce

var keydown = false;
$('body').keydown(function() {
    if(!keydown){
        oscillator = context.createOscillator(),  // Creates the oscillator 
        oscillator.type = synthWaveform.value;  
        oscillator.frequency.value = pitchInput.value;                   
        oscillator.connect(context.destination);  // Connects it to output
        oscillator.noteOn(0);
        keydown = true;
    }
});
$('body').keyup(function() {
    oscillator.disconnect();
    keydown = false;
});

这可能是一个变通方法

var keyIsDown = false;
$('body').keydown(function() {
    if(keyIsDown) {
       // key is already down
       return true;
    }
    keyIsDown = true;
    // do your keydown handler
}
$('body').keyup(function() {
    keyIsDown = false;
}