Javascript 单击时分别更改多个按钮的颜色
我的javascript代码有问题,我有一个代码片段,根据循环范围创建了许多按钮,这些按钮共享同一个类,但ID不同Javascript 单击时分别更改多个按钮的颜色,javascript,jquery,Javascript,Jquery,我的javascript代码有问题,我有一个代码片段,根据循环范围创建了许多按钮,这些按钮共享同一个类,但ID不同 <div class="panel-footer" id="loop"> <ul class="post-action"> {% for i in range %} <button class="btn btn-success guess" id="{{ i }}" value="{{ i }}
<div class="panel-footer" id="loop">
<ul class="post-action">
{% for i in range %}
<button class="btn btn-success guess" id="{{ i }}" value="{{ i }}" onclick="transferField(this.value)">{{ i }} </button>
{% endfor %}
</ul>
</div>
{范围%中的i的%1}
{{i}
{%endfor%}
我尝试在单击每个按钮时更改其颜色,再次单击时会更改回默认颜色,但效果不好;单击按钮5时会更改颜色,但单击按钮6后,在再次单击按钮6或其他按钮之前不会更改颜色。以下是js代码:
<script>
clicked = true;
$(".guess").click(function(){
xyz = this.id
console.log(xyz)
if(clicked){
$('#' + this.id).css('background-color', '#FF8E2B');
clicked = false;
} else {
$('#' + this.id).css('background-color', '#27AE60');
clicked = true;
}
});
</script>
单击=真;
$(“.guess”)。单击(函数(){
xyz=this.id
console.log(xyz)
如果(单击){
$('#'+this.id).css('background-color','#FF8E2B');
单击=假;
}否则{
$('#'+this.id).css('background-color','#27AE60');
单击=真;
}
});
我做错了什么?您试图使用单个变量“跟踪”多个按钮的状态,当然这不起作用
请尝试以下方法
$(".guess").click(function(){
var $this = $(this);
var clicked = $this.data('clicked');
if(clicked) {
$this.css('background-color', '#FF8E2B');
} else {
$this.css('background-color', '#27AE60');
}
$this.data('clicked', !clicked);
});
您试图使用单个var“跟踪”多个按钮的状态,当然这是行不通的
请尝试以下方法
$(".guess").click(function(){
var $this = $(this);
var clicked = $this.data('clicked');
if(clicked) {
$this.css('background-color', '#FF8E2B');
} else {
$this.css('background-color', '#27AE60');
}
$this.data('clicked', !clicked);
});
您可以在元素的
data-*
处存储每个元素的颜色数组,使用.data()
,array.prototype.reverse()
切换到数组,将背景设置为数组索引0
处的元素
$(“按钮”)。在(“单击”,函数(){
$(this.css(“背景”,$(this.data().colors.reverse()[0])
})
单击可以在元素的数据-*
处为每个元素存储一个颜色数组,使用.data()
,array.prototype.reverse()
切换到数组,将背景设置为数组索引0
处的元素
$(“按钮”)。在(“单击”,函数(){
$(this.css(“背景”,$(this.data().colors.reverse()[0])
})
单击
您的问题是您正在使用单击的
作为全局变量
只需将单击的存储在中即可
$(“.guess”)。单击(函数(){
xyz=this.id
console.log(xyz)
如果(单击此项){
$(this.css('background-color','#FF8E2B');
this.clicked=false;
}否则{
$(this.css('background-color','#27AE60');
this.clicked=true;
}
});代码>
一
二
三
您的问题是,您正在使用单击的作为全局变量
只需将单击的存储在中即可
$(“.guess”)。单击(函数(){
xyz=this.id
console.log(xyz)
如果(单击此项){
$(this.css('background-color','#FF8E2B');
this.clicked=false;
}否则{
$(this.css('background-color','#27AE60');
this.clicked=true;
}
});代码>
一
二
三
我做错了什么
代码的主要问题是有一个变量跟踪多个按钮元素的单击状态
解决这个问题的方法是向元素本身添加状态,本质上为多个元素提供多个变量
为此,我将事件
对象添加到单击
处理程序的回调中,并获取事件.currentTarget
。event.currentTarget
的值是正在单击的元素对象。您可以向这个对象添加状态,就像向其他javascript对象添加状态一样
event.currentTarget.clicked = true;
现在您可以跟踪每个元素的状态了
//只需一些简单的代码就可以在纯JS中获取模板,不用担心这里的代码
常数范围=[0,1,2,3,4,5];
常量模板=`
${range.map(i=>`
${i}
`)}
`;
const div=document.createElement('div');
div.innerHTML=模板;
文件.正文.附件(div);
//这里是变化的起点
//var=true;而不是使用全局变量来跟踪所有按钮的状态
$(“.guess”)。单击(函数(事件){
//您需要将本地状态附加到按钮
//在这里,我们得到的按钮元素被点击
const currentTarget=event.currentTarget;
xyz=this.id
console.log(xyz);
//如果这是真的
如果(currentTarget.clicked){
$('#'+this.id).css('background-color','#FF8E2B');
currentTarget.clicked=false;
}否则{
$('#'+this.id).css('background-color','#27AE60');
//在元素上设置一些状态
currentTarget.clicked=true;
}
});代码>
。猜猜看{
/*从橙色州开始*/
背景色:#FF8E2B;
}
我做错了什么
代码的主要问题是有一个变量跟踪多个按钮元素的单击状态
解决这个问题的方法是向元素本身添加状态,本质上为多个元素提供多个变量
为此,我将事件
对象添加到单击
处理程序的回调中,并获取事件.currentTarget
。event.currentTarget
的值是正在单击的元素对象。您可以向该对象添加状态,就像向另一个javascript对象添加状态一样
event.currentTarget.clicked = true;
现在你可以跟踪状态了