我正在尝试仅使用HTML,CSS和JavaScript创建DTMF键盘模拟器
我的声音问题很小。单击图像时,会运行offHook()函数,该函数开始播放拨号音。但是,我想要在拨打第一个号码后立即停止拨号音(或者在我有键盘监听器后按下)。对于每个数字函数,即dial1(),dial2()等,它们被绑定到单击的各个按钮,我运行numberDial()函数,它应该停止拨号音音频。但是,它拒绝停止。
-dialTone.pause();
-dialTone.stop();
-dialTone.src =“”;
无论如何,拨号音仍在继续。如何在运行numberDial()时让它停止?每次按下一个数字时都会运行此功能(我稍后会添加其他内容),因此它只会将音频停在第一个数字上,但在其他时间也不会造成任何伤害。
我的理解是函数numberDial()应该识别变量dialTone - 那么为什么dialTone拒绝暂停?
function offHook() {
document.getElementById("WE2500").style.display = "none";
document.getElementById("dialPad").style.display = "block";
var dialTone = new Audio('dialTone.m4a');
dialTone.play();
}
var number = "";
function numberDial() {
dialTone.src = "";
}
function dial1() {
numberDial();
number = number + "1";
var tone1 = new Audio('DTMF-1.wav');
tone1.play();
}
答案 0 :(得分:0)
这里的问题是“我的理解是函数numberDial()应该识别变量dialTone”。您的理解确实非常错误:在函数中使用allocator关键字(var,
let或`const)声明的变量不会在这些函数之外持久存储。这几乎就是每种传统编程语言的工作原理,所以你认为它会持续存在的事实是......好奇吗?可能值得一读Javascript的工作原理。
唯一不合适的时候是不根本不使用分配器来声明你的变量,但这是一个极端的坏习惯:总是使用allocator关键字并确保你'正确地确定它们的范围。
所以,我们这样做:您在var dialTone
函数中定义的offHook()
只能在offHook
函数内部访问。如果您需要在全局级别访问它,则必须在全局级别声明它,即使您没有初始化它直到您调用你的offHook
功能:
var dialTone;
function offHook() {
...
dialTone = new Audio('dialTone.m4a'); // note: NO 'var'. It already exists.
dialTone.play();
}
function numberDial() {
// we now need to make sure we only stop dialTone if
// the dialTone variable actually points to something.
if (dialTone) {
// see http://stackoverflow.com/questions/14834520 on why this "stops" audio.
dialTone.pause();
dialTone.currentTime = 0;
}
}