【发布时间】:2018-01-09 21:06:16
【问题描述】:
我的音乐播放器中有一个自定义音量条和静音按钮。静音很简单,但是我想在第二次点击按钮时返回之前的音量。
示例:假设当前音量为50%。单击静音按钮会将其更改为0。再次单击它应该会返回到50%。
我是这样尝试的:
var music = document.getElementById('music');
var volumehead = document.getElementById('volume-head');
var volumebar = document.getElementById('volume-bar');
var mute = document.getElementById('mute');
mute.addEventListener("click", muteSound);
function muteSound(){
if(mute.classList.contains('not-muted')){
// Save current values before changing them
var lastHead = volumehead.style.marginLeft;
var lastVolume = music.volume;
// Change classname for appearance and next click
mute.className = "muted";
// Change values to 0
volumehead.style.marginLeft = "0px";
music.volume = 0;
} else {
// Change classname for appearance and next click
mute.className = "not-muted";
// Use saved values
volumehead.style.marginLeft = lastHead;
music.volume = lastVolume;
}
}
2 个variables 持有处理程序的位置和音量在if-statement 中被赋予一个值,这意味着它们在else-statement 中没有一个值。
在语句之外声明它们意味着这些值将被0“覆盖”。
有没有办法保存这些值并在下次单击按钮时使用它们?
编辑(解决方案):
if-statement 分配给variables 的值只能由else-statement 使用,前提是variables 声明在function 之外。
【问题讨论】:
-
在 if 语句中声明了处理程序位置和音量的 2 个变量,这意味着它们在 else 语句中不可访问 - 这是使用
var时不正确,它们被提升到函数的顶部。当使用let或const时,变量仅作用于语句块。无论如何,解决您的问题的方法是在函数之外声明变量 -
您需要将音量保存在函数
muteSound之外的变量中,即所有其他volumebar变量等所在的位置。从概念上讲:您应该将事件处理程序附加到音量条,每次移动时都会更新volume变量;所以volume总是包含当前选择的卷。当点击mute时,您将音量静音并呈现您的 UI 以指示静音音量; 您不会更改volume的值。取消静音时,您会恢复音量并再次更新 UI。 -
@MikaelLennholm 当我控制台记录 if 和 else 语句中的变量时,else 语句中的变量返回
undefined。 -
@PeterPrakker 是的,它们永远不会被分配一个值,这发生在 if 块中。但是由于提升,它们被声明了,否则它不会记录
undefined,它会抛出一个ReferenceError说lastHead is not defined。您可以通过将var更改为let来亲自查看差异。 -
@MikaelLennholm 啊,你是对的。我在问题中编辑了我的陈述。谢谢你的解释!
标签: javascript variables if-statement scope global-variables