如何停止在其他功能中启动的音频?

时间:2017-05-17 02:43:24

标签: javascript audio

我正在尝试仅使用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();
}

1 个答案:

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