你如何规避重复的keydown消息,当你想,你按住键使用javascript使用他们,但希望它只能玩

2019-10-17 14:09发布

我有一段代码,看起来像下面,它工作正常。 它所做的是它启动的振荡器的声音时,在一个div名为synth.It点击鼠标即可停止播放振荡器鼠标按钮被释放时。

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

    };

然后我添加下面的代码,这样,当用户按下键盘charachter它触发振荡器。 问题是,键盘字符被释放时,当键被按下它repeadedly剧本,然后就不会停止。 我想知道是否有可以用来规避这个任何库或代码。 我们的目标是让最终的结果是像一个鼠标按下/时生效,但与键盘的动作触发sound.Thank你。

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

});

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


Answer 2:

这可能是一种解决方法

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


文章来源: 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?