研究了如何使局部变量(colorSelect1,colorSelect2)全局,这样我就可以执行逻辑语句
Stumped on how to make local variables (colorSelect1, colorSelect2) global so that I can execute the logic statement
我很难确定为什么无法执行。当我consoloe.log colorSelect变量时,它们会返回正确的值。然而,我认为这种脱节是因为变量是在函数中创建的,因此不被识别为全局变量,这否定了我的逻辑语句。关于如何规避这个问题,有什么建议吗?
var colorSelect1 = null;
var colorSelect2 = null;
//selecting the first color
$(function() {
$(".color1").click(function() {
$(".color1").removeClass('active');
$(this).addClass('active');
var colorSelect1 = $(this).css("background-color");
console.log(colorSelect1);
return colorSelect1;
});
})
//selecting the second color
$(function() {
$(".color2").click(function() {
$(".color2").removeClass('active');
$(this).addClass('active');
var colorSelect2 = $(this).css("background-color");
console.log(colorSelect2);
return colorSelect2;
});
})
// making a new color based upon the two color selections
if (colorSelect1 === "red" && colorSelect2 === "yellow") {
console.log("We have orange!");
$(".colorCombo").css('background-color', 'orange');
}
.all-divs {
display: block;
float: left;
}
.active {
border: 2px solid;
}
.colorCombo {
float: left;
border: 2px solid;
width: 150px;
height: 150px;
margin-left: 393px;
}
.group1 {
display: block;
float: left;
margin: 10px;
}
.group2 {
display: block;
float: left;
margin: 10px;
}
#red1 {
width: 150px;
height: 150px;
background-color: red;
display: block;
float: left;
}
#blue1 {
width: 150px;
height: 150px;
background-color: blue;
display: block;
float: left;
}
#yellow1 {
width: 150px;
height: 150px;
background-color: yellow;
display: block;
float: left;
}
#red2 {
width: 150px;
height: 150px;
background-color: red;
display: block;
float: left;
}
#blue2 {
width: 150px;
height: 150px;
background-color: blue;
display: block;
float: left;
}
#yellow2 {
width: 150px;
height: 150px;
background-color: yellow;
display: block;
float: left;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
Please select a color.
</div>
<div class="all-divs">
<div class="group1">
<div class="color1" id="red1">
</div>
<div class="color1" id="blue1">
</div>
<div class="color1" id="yellow1">
</div>
</div>
<div class="group2">
<div class="color2" id="red2">
</div>
<div class="color2" id="blue2">
</div>
<div class="color2" id="yellow2">
</div>
</div>
</div>
<div class="colorCombo">
</div>
这里有两个三个问题,只有这三个问题都解决了,代码才能工作。
问题1:正如您正确推测的那样,您只影响函数中的变量。
要解决此问题,请在以下函数中删除这些变量之前的var
:
colorSelect1 = $(this).css("background-color");
colorSelect2 = $(this).css("background-color");
这将导致这些变量名引用外部作用域中的变量,而不仅仅是函数中的变量。
问题2:您的if
语句在这些事件发生之前很久就执行了。它不会随着变量值的变化而不断评估。
要解决此问题,您可以将if
语句放入其自己的函数中:
function checkColors() {
if(colorSelect1 === "red" && colorSelect2 === "yellow"){
console.log("We have orange!");
$(".colorCombo").css('background-color', 'orange');
}
}
并在您的每一次活动中称之为:
$(".color1").click(function() {
$(".color1").removeClass('active');
$(this).addClass('active');
colorSelect1 = $(this).css("background-color");
checkColors();
});
问题3:使用.css('background-color')
不一定会得到与CSS中指定的值完全相同的值。例如,在Chrome中,在具有red
背景的元素上调用它将得到值rgb(255, 0, 0)
。
解决此问题的一种方法是在元素上使用data-
来指定所需的值,然后使用.data()
:检索它们
<div class="color1" id="red1" data-color="red">
colorSelect1 = $(this).data('color');
最后,虽然与您遇到的问题无关,但您使用header
和footer
的方式不正确。您命名为header
的标记应该命名为head
,并且您应该删除footer
,因为页脚应该只出现在body
元素的内部,如果它是空的,则没有意义。
完整的解决方案,以及一些其他改进:
var colorSelect1 = null;
var colorSelect2 = null;
$(function() {
//selecting the first color
$(".color1").click(function() {
$(".color1").removeClass('active');
$(this).addClass('active');
colorSelect1 = $(this).data("color");
console.log(colorSelect1);
checkColors();
});
//selecting the second color
$(".color2").click(function() {
$(".color2").removeClass('active');
$(this).addClass('active');
colorSelect2 = $(this).data("color");
console.log(colorSelect2);
checkColors();
});
});
// making a new color based upon the two color selections
function checkColors() {
if(colorSelect1 === "red" && colorSelect2 === "yellow"){
console.log("We have orange!");
$(".colorCombo").css('background-color', 'orange');
}
}
.all-divs {
display: block;
float: left;
}
.active {
border: 2px solid;
}
.colorCombo {
float: left;
border: 2px solid;
width: 150px;
height: 150px;
margin-left: 393px;
}
.group1 {
display: block;
float: left;
margin: 10px;
}
.group2 {
display: block;
float: left;
margin: 10px;
}
.color1, .color2 {
width: 150px;
height: 150px;
display: block;
float: left;
}
[data-color=red] {
background-color: red;
}
[data-color=blue] {
background-color: blue;
}
[data-color=yellow] {
background-color: yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
Please select a color.
</div>
<div class="all-divs">
<div class="group1">
<div class="color1" id="red1" data-color="red">
</div>
<div class="color1" id="blue1" data-color="blue">
</div>
<div class="color1" id="yellow1" data-color="yellow">
</div>
</div>
<div class="group2">
<div class="color2" id="red2" data-color="red">
</div>
<div class="color2" id="blue2" data-color="blue">
</div>
<div class="color2" id="yellow2" data-color="yellow">
</div>
</div>
</div>
<div class="colorCombo">
</div>
从分配值的函数中去掉var。例如:
$(".color1").click(function() {
$(".color1").removeClass('active');
$(this).addClass('active');
colorSelect1 = $(this).css("background-color");
console.log(colorSelect1);
return colorSelect1;
});
})
您首先将colorSelect1
和colorSelect2
声明为全局,然后在函数中将它们重新声明为本地
如果删除函数中的var,它应该可以工作。
//selecting the first color
$(function() {
$(".color1").click(function() {
$(".color1").removeClass('active');
$(this).addClass('active');
colorSelect1 = $(this).css("background-color");
console.log(colorSelect1);
return colorSelect1;
});
})
//selecting the second color
$(function() {
$(".color2").click(function() {
$(".color2").removeClass('active');
$(this).addClass('active');
colorSelect2 = $(this).css("background-color");
console.log(colorSelect2);
return colorSelect2;
});
})
var colorSelect1 = null;
var colorSelect2 = null;
//selecting the first color
// this is your doc ready, just use one
$(function() {
$(".color1").click(function() {
$(".color1").removeClass('active');
$(this).addClass('active');
colorSelect1 = $(this).css("background-color"); // remove var
console.log(colorSelect1);
return colorSelect1;
});
$(".color2").click(function() {
$(".color2").removeClass('active');
$(this).addClass('active');
colorSelect2 = $(this).css("background-color"); // remove var
console.log(colorSelect2);
return colorSelect2;
});
// making a new color based upon the two color selections
if(colorSelect1 === "red" && colorSelect2 === "yellow"){
console.log("We have orange!");
$(".colorCombo").css('background-color', 'orange');
}
}); //End Doc Ready
删除var。Var将使其成为封闭函数内部的局部变量,当您删除它时,它指的是您在文档外部初始化的两个变量。
- 有没有一个抽象层,这样我就可以集成一次,然后使用pusher、pubnub或faye
- 只要用户将鼠标悬停在jQuery中的某个元素上,就可以执行多次单击
- AngularJS在不使用变量的情况下将服务注入模块中,这样就可以缩小它
- 如何绑定到这个,这样我就可以在这个coffeescript中正确地调用React中的setState
- 如何通过知道节点的值来访问dom&&只要知道价值就可以得到手风琴的索引
- 如何用程序读取和解析gruntfile,这样我就可以修改它并再次保存
- setTimeout()是如何实现的,这样它就可以在不阻塞主线程的情况下跟踪经过的时间
- JQuery动画打断了脚本,但如果没有它,脚本就可以工作
- 如果我在其中使用alert,Javascript代码就可以工作,否则它'It’不起作用
- 在输入字段上使用它-can'我不能从函数中取出变量,这样我就可以使用它了
- 是否可以执行两次匿名函数
- lunr:返回搜索词的词干,这样我就可以在结果中突出显示它
- 是否可以执行使用 pjax 检索到的 Javascript 代码
- 如何只需一次调用就可以将对象数组保存到mongoose DB中
- Hapi.js文件上传我如何获取文件,这样我就可以在上面使用imageMagick命令行工具
- 我怎么能"保存“;变量客户端,这样我就可以在其他java脚本事件中使用它
- 在setState完成更新后,我可以执行一个函数吗
- 通过小部件设置第三方cookie,这样我以后就可以识别用户了
- 在Node.JS中,通过执行require('net'),就可以不执行require吗('eve
- 研究了如何使局部变量(colorSelect1,colorSelect2)全局,这样我就可以执行逻辑语句