通常当我编写切换功能时,例如在2种背景颜色之间切换,我使用全局变量作为标志。比如像这样 -
var flag = true;
function change()
{
if(flag)
{
document.getElementById("box").style.backgroundColor = "blue";
flag = false;
}
else
{
document.getElementById("box").style.backgroundColor = "red";
flag = true;
}
}

#box
{
width:100px;
height:100px;
background-color:red;
}

<h3>Click the box to toggle</h1>
<div id="box" onclick="change()"></div>
&#13;
但是当我编写多个函数来切换各种属性时,全局变量的数量会增加,并且正如这些文章所述 -
Article #1
Article #2
Article #3
必须避免全局变量。
所以我的问题是,编写一个简单的函数如切换的另一种方法是什么?
答案 0 :(得分:2)
您可以使用addEventListener与自动执行的匿名函数绑定到click事件来执行此操作。
(function(){
var flag = true;
document.getElementById('box').addEventListener('click', function() {
this.style.backgroundColor = flag ? "blue" : "red";
flag = !flag;
});
})();
#box
{
width:100px;
height:100px;
background-color:red;
}
<h3>Click the box to toggle</h1>
<div id="box"></div>
答案 1 :(得分:1)
您可以使用立即调用的函数表达式(IIFE)来避免使用变量名称污染全局范围。匿名IIFE的一个例子如下:
(function(){
var flag = true;
function change()
{
if(flag)
{
document.getElementById("box").style.backgroundColor = "blue";
flag = false;
}
else
{
document.getElementById("box").style.backgroundColor = "red";
flag = true;
}
}
}());
通过将代码包装在一个函数中,您创建了另一个范围,并保留了全局空间。 Here是一篇关于它的文章,但如果您只是输入搜索引擎就可以找到很多文章&#39; IIFE&#39;
答案 2 :(得分:0)
您可以检查背景颜色属性,然后执行相反的操作:
if(document.getElementById("box").style.backgroundColor == "red")
{
document.getElementById("box").style.backgroundColor = "blue";
}
else
{
document.getElementById("box").style.backgroundColor = "red";
}
如果您有两个以上的选项,只需添加elseif语句......
答案 3 :(得分:0)
您可以为页面/网站创建一个Module对象,如下所示:
<强> HTML 强>
<h3>Click the box to toggle</h3>
<div id="box" onclick="MyModule.change(this)">Change Color</div>
<强>的JavaScript 强>
var MyModule = (function(){
var boxFlag = true;
return{
change: function(ele){
if(boxFlag){
ele.style.backgroundColor = "blue";
}
else{
ele.style.backgroundColor = "red";
}
boxFlag = !boxFlag;
}
}
})();
JSFiddle:http://jsfiddle.net/sbznrhgy/1/
答案 4 :(得分:0)
jQuery&#39; toggleClass
方法正是出于这个目的:
$('.box').click(function() {
$(this).toggleClass('blue');
});
&#13;
.box {
width: 100px;
height: 100px;
background-color: red;
display: inline-block;
margin: 10px;
}
.box.blue {
background-color: blue;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h3>Click the box to toggle</h3>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
&#13;
hasClass
,然后使用 addClass
和 removeClass
强>:
$('.box').click(function() {
if($(this).hasClass('blue')) {
$(this).removeClass('blue');
$(this).addClass('green');
}
else if($(this).hasClass('green')) {
$(this).removeClass('green');
}
else {
$(this).addClass('blue');
}
});
&#13;
.box {
width: 100px;
height: 100px;
background-color: red;
display: inline-block;
margin: 10px;
}
.box.blue {
background-color: blue;
}
.box.green {
background-color: green;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h3>Click the box</h3>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
&#13;
data
:
$('button').click(function() {
var clicks= $(this).data('clicks') || 1;
if(clicks>=3) {
$(this).html('You clicked me thrice!');
}
else {
$(this).data('clicks', clicks+1);
}
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>Click me three times</button>
&#13;