0

我想创建一个振荡器,当用户按下一个键(现在只是空格键)时启动和停止。但是如果按键时间过长,比如一秒钟 - 振荡器会卡住并且不会停止();

let signal = {}

class Beep {
    constructor() { 
        this.audioCtx = new window.AudioContext();
        this.osc =      this.audioCtx.createOscillator();
        this.gainNode = this.audioCtx.createGain();

        this.gainNode.connect(this.audioCtx.destination);
        this.osc.connect(this.gainNode);
        signal.beep = this;
    }
}

function startTransmission(e) {     
    if(e.keyCode == 32) {
        let b = new Beep();
        signal.beep.osc.start();
    }
}

function stopTransmission(e) {      
     if(e.keyCode == 32) {
          signal.beep.osc.stop();
     }
}

document.body.onkeydown = (e) => startTransmission(e);
document.body.onkeyup = (e) => stopTransmission(e);
4

1 回答 1

0

如果有人感兴趣,找到解决方案......问题是 onKeyDown 只要按下它就会触发一个新实例。因此,该函数在现有对象的顶部创建了一个新的“Beep”对象。这样,当“stopTransission”函数被触发时,它只会停止最后一个振荡器,而让其下方的其他振荡器继续运行。

克服这个问题的方法是创建一个标志,在创建第一个振荡器后立即从“假”切换到“真”,然后不允许该函数创建更多的振荡器。当该功能在按键时触发时,该标志应重置为“假”。

于 2020-08-05T08:43:51.253 回答