当你想要使用javascript时你如何使用它们来控制重复的keydown消息,你按住键但是只想玩一次?

时间:2013-01-13 08:06:36

标签: javascript dom keypress

我有一段看起来像下面的代码,它工作正常。它的作用是当鼠标点击名为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(); 

    };

然后我添加了下面的代码,以便当用户按下键盘时,它会触发振荡器。问题是,当按下按键时,它会重复播放,然后在释放键盘字符时不会停止。我想知道是否有任何可用于规避此问题的库或代码。目标是让最终结果像mousedown / up效果一样,但键盘动作会触发声音。谢谢。

$('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();

});

2 个答案:

答案 0 :(得分:1)

如果你需要比下面选项更精彩的东西,你可以使用underscore.js去抖。

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;
});

答案 1 :(得分:0)

这可能是一种解决方法

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;
}