所以我试着在javascript中写一个简单的闹钟。目标是一个网站,它可以在指定的时间重复发出声音,并且可以在线加载,即使互联网连接在加载页面后断开也会继续工作。容易,对吧?
问题是产生声音。
我的第一次尝试是:
function beep() {
var sound = new Audio( "<base64 encoded waw>" );
sound.play();
}
var beeping;
function startBeeping() {
beeping = setInterval(beep, 500);
}
function stopBeeping() {
clearInterval(beeping);
}
&#13;
这在Firefox(Linux,44.0)中运行良好,但在Chrome(Linux,48.0.2564.109)中加载页面后,它会发出一声嘟嘟声。我试图搜索StackOverflow和其他来源并尝试使用代码很长一段时间(例如在函数外声明sound
变量,再次发出蜂鸣声后重新调用它,调用sound.load()
,设置{ {1}},在每次发出哔哔声后声明sound.currentTime=0
HTML5元素克隆它...),但无论我做什么,Chrome每次加载都不会多次播放声音。显然,过去存在一些问题,但我们的Chrome版本标记为已解决。
我的第二次尝试是:
<audio>
&#13;
与相同的var audioCtx = new (window.AudioContext || window.webkitAudioContext || window.audioContext);
var oscillator = audioCtx.createOscillator();
var gainNode = audioCtx.createGain();
gainNode.connect(audioCtx.destination);
oscillator.connect(gainNode);
gainNode.gain.value = 50;
oscillator.frequency.value = 880;
oscillator.type = "sawtooth";
oscillator.start();
oscillator.disconnect(gainNode);
function startTone() {
oscillator.connect(gainNode);
};
function stopTone() {
oscillator.disconnect(gainNode);
}
function beep() {
startTone();
setTimeout(stopTone, 200);
}
和startBeeping()
功能一起使用,这在Chrome中效果很好,但随便在Firefox中无效(我会解释,我保证)。
我还尝试使用stopBeeping()
和oscillator.start()
,同时在每次发出蜂鸣声后再次声明oscillator.stop()
和oscillator
个变量,使用gainNode
和{{1}相反,设置oscillator.detune()
并返回到880Hz以打开和关闭...问题是,虽然所有这些功能在Chrome中完美运行,但oscillator.start()
功能只能每隔一秒工作一次在Firefox上将其输入控制台。这意味着我加载页面,在控制台中键入oscillator.frequency.value=0
并且没有任何反应。然后我再次将beep()
输入控制台并发出哔哔声。然后再没有任何事情发生,等等。每隔一秒就会发出哔哔声。更有趣的是,即使我将beep()
输入控制台也是如此。第一次没有任何事情发生,但它第二次起作用(只发出一次哔哔声)。
此代码的不同版本也产生了一些关于振荡器对象的抱怨&#34;不是&#34;或者&#34;处于错误状态&#34; (这就是消息所说的内容),甚至是语法错误&#34;缺失]&#34;,这完全是奇怪的,因为确实没有语法错误,没有任何方括号和功能仍然每隔一段时间工作......
我的上一个版本(下面,我用它保存在一个beep()
文件中并在本地打开)始终可以在Chrome中使用,但在Firefox中可以使用,或者不能完全随机工作。没有更改代码,没有打开新选项卡,只是重新加载和/或尝试多次使用页面)。这意味着,我加载页面一次,它可能在开始时工作,也可能不工作(您可以根据天气知道天气,当您启动警报时可以听到哔声),然后它会工作一次或多次然后再没有。它工作与否的次数一直在变化,我没有弄清楚任何影响它的情况......除了移动我的一些DOM操作代码使其工作或多或少可靠(例如,将beep(); beep()
电话移动到alarm.html
几乎每次都会打破它。)
setCurrentTime()
&#13;
这是什么样的木头?
请不要向我推荐一些jQuery thingie或者一个肯定会在浏览器中运行的JS库/ web-app--我只对这个特定代码的内容感兴趣。我真的不需要在JS中有一个工作警报。