我对 Javascript 和一般编码都很陌生,所以对我来说放轻松!
我已经使用 setInterval 在 HTML、JS 等中制作了一个(非常)简单的节拍器 - 我知道这有一些限制,而且它不是这样做的最准确的方法等等。话虽如此,在各种桌面浏览器似乎工作得比较好。然而:
在桌面 Safari (15.1) 上,音频似乎无法正常播放 - 听得见但声音低沉。
在我尝试过的每个移动浏览器(Safari、Firefox、Chrome - 不确定哪些版本)上,它似乎根本不起作用。
对此的任何帮助将不胜感激 - 我在下面包含了实际节拍器部分的代码。我必须假设这些问题与 setInterval 以某种方式有关,我只是希望有人能阐明为什么它不起作用。
干杯!
const sound = document.querySelector('audio');
const powerButton = document.querySelector('.on-button');
let poweredOn = false;
let metronome;
let milliseconds;
function playSound() {
if (milliseconds != Infinity) {
sound.currentTime = 0;
sound.play();
}
}
function setMilliseconds() {
let tempo = document.querySelector('.tempo').value;
milliseconds = 60000 / tempo;
if (poweredOn == true) {
clearInterval(metronome);
if (milliseconds >= 100) {
playSound();
metronome = setInterval(playSound, milliseconds);
}
}
if ((!tempo || milliseconds < 100) && poweredOn == true) {
poweredOn = false;
clearInterval(metronome);
powerButton.classList.remove('switched-on');
}
}
function activate() {
if (milliseconds) {
let tempo = document.querySelector('.tempo').value;
poweredOn = poweredOn ? false : true ;
if (poweredOn && milliseconds) {
if (milliseconds < 100 || !milliseconds || !tempo) {
this.classList.add('invalid');
setTimeout(() => {
this.classList.remove('invalid');
}, 100)
poweredOn = false;
} else {
this.classList.add('switched-on');
playSound();
metronome = setInterval(playSound, milliseconds);
}
} else {
this.classList.remove('switched-on');
clearInterval(metronome);
}
} else {
this.classList.add('invalid');
setTimeout(() => {
this.classList.remove('invalid');
}, 100)
}
}
编辑 - 我已经添加了节拍器中的所有 JS,而不仅仅是一个功能。从那以后,我将其更改为使用重复的 setTimeout 而不是 setInterval,以便我可以调整间隔以补偿漂移 - 调试表明问题可能出在移动设备上播放的音频,而不是间隔他们自己。有什么想法吗?