所以我有一个非常简单的测验,由7个选择框和一个提交按钮组成。我想要实现的是,如果没有更改任何选择框,则会弹出警告错误,并且如果它们已被更改以便提高分数。
我已经设置了一个名为“已更改”的变量'这是假的。当其中一个选择框被更改'更改'变得真实......
这有效,我有一个控制台日志,它显示了它的工作情况,但是当按下提交按钮时,它会调用该功能来显示分数或警告,它似乎并没有意识到这一点,'改变'已更改为TRUE。
继承人Jquery ......
var changed = false;
$('select').on('change', function () {
var changed = true;
console.log('TRUE');
});
$("#button").click( function(){
var correct = 0;
var selectValue;
var questions = document.getElementsByClassName("question");
var numOfQuestions = questions.length;
for(var i = 0; i < questions.length; i++ ){//begin for loop
//get the value of the select element
selectValue = questions[i].options[questions[i].selectedIndex].value;
//if the value equals right
if(selectValue === "right"){//begin if then
//increment the correct variable
correct++;
}//end if then
}//end for loop
if(changed === false){
$('#scoreDisplay span').append('WARNING');
}
else{
$('#scoreDisplay span').append(correct);
}
});
你可以在这里看到它,但你会看到它只显示&#39;警告&#39;当您点击提交时,无论您是否更改了任何选择框... http://gogeye.com/connectquiz/index.html
答案 0 :(得分:2)
在此事件处理程序中重新定义var changed
:
$('select').on('change', function () {
// creates a new local variable that is only available inside this function
var changed = true;
console.log('TRUE');
});
创建一个新的局部变量,用于“遮蔽”和“隐藏”在更高范围内声明的changed
变量。
从函数内部删除var
,因此它不会创建该名称的新变量,而只是设置更高范围的变量:
var changed = false;
$('select').on('change', function () {
// no var in front of this variable so you are just setting
// the earlier one, not creating a new one
changed = true;
console.log('TRUE');
});
请记住,只要在函数内部声明带有var
的变量,它就会定义一个仅在该函数中可用的新局部变量。如果碰巧与更高范围内的变量具有相同的名称,则它会覆盖该变量名称,并且解释器在您引用它时使用本地变量而不是更高范围的变量名称。
Javascript解释执行范围搜索以解析变量引用。首先,它在本地范围内查找。如果在那里找到它,那么它使用它在那里找到的那个。如果在那里找不到它,那么它会查看下一个更高的范围。如果没有找到它,它会达到更高的范围,直到它达到全局范围。因此,它找到变量名称的最近范围是使用的范围 - 因此将首先使用var
或let
定义的局部变量。
答案 1 :(得分:0)
从'var changed = true'
中删除'var'var changed = false;
$('select').on('change', function () {
changed = true;
console.log('TRUE');
});