自定义样式的复选框-我的JavaScript逻辑问题(一个else分支没有被击中)
Custom styled checkboxes - problem with my JavaScript logic (an else branch is not getting hit)
我正在创建一些自定义的"复选框",我的意思是,我只是对标签元素进行样式化,并将复选框定位在屏幕之外。这是进来的设计/功能,所以我想我应该尝试使用语义复选框。
我想要的是当你点击其中一个自定义的"复选框"(你真的触发了风格化的标签),"复选框"应该改变颜色,所有"复选框"后面的背景div也应该"亮起来"。这些都可以用了
当你取消选中"复选框","复选框"将不突出显示,但你仍然应该得到背景div颜色,而你有任何"复选框"选中。当你取消选中最后的"复选框"时,它应该取消和的高亮显示,并关闭背景div颜色。这就是我遇到问题的地方。
最好用一个例子来说明!
http://jsfiddle.net/xS2JU/我有console.log语句,如果你观察它们,你会发现当你关闭最后一个复选框时,我没有执行第三个分支。我只是跟踪复选状态,并使用一个简单的计数器来跟踪有多少"复选框"被选中。有人有什么想法吗?
现场演示
由于这只是这样做,onchange
计数将始终在LEAST 1,所以它永远不会在0,因此永远不会调用第三个分支。或者更好的解释是,如果一个未选中,则必须先检查,使计数在最后一次调用时从1开始。我只是把你的条件移到了第二个条件里面,因为这是你取消勾选的地方,这时你会看到它们是否都是未选中的。
$(function() {
var $help_choices = $('#help_choices'),
count = 0;
console.log(count);
$('input:checkbox', $help_choices).change(function() {
var checked = this.checked,
$label = $(this).parent();
if (checked) { //additive checkboxes, check one or multiples
$help_choices.addClass('help_choices_selected');
$label.addClass('help_label_selected');
count++;
console.log(checked + ' ' + count);
} else { //subtractive checkboxes, uncheck one or multiples
count--;
$label.removeClass('help_label_selected');
// Put the final check here
if(count === 0){
$help_choices.removeClass('help_choices_selected');
$label.removeClass('help_label_selected');
console.log(checked + ' ' + count + ' 3rd branch');
}
}
});
});
这里还有一个更短的代码,你不需要跟踪计数,可以进一步优化,但基本上我只是检查是否有任何输入在父元素中被检查,通过获得#help_choices
元素上input:checked
的长度。
演示2
$(function() {
var $help_choices = $('#help_choices');
$('input:checkbox', $help_choices).change(function() {
var checked = this.checked,
$label = $(this).parent();
if (checked) { //additive checkboxes, check one or multiples
$help_choices.addClass('help_choices_selected');
$label.addClass('help_label_selected');
} else{ //subtractive checkboxes, uncheck one or multiples
$label.removeClass('help_label_selected');
if($('#help_choices input:checked').length === 0){
$help_choices.removeClass('help_choices_selected');
}
}
});
});
问题是,当恰好有一个复选框被选中并且您取消选中它时,它将进入第二个分支,因为count > 0
(直到您在该分支内减少它),因此您永远不会进入最后一个分支。此外,您并不需要在第一个if中测试count >=0
,因为(一旦代码工作)count
将始终是>=0
。
从第三个分支中删除else
,并使其在第二个分支中成为if
。
if (checked) { //additive checkboxes, check one or multiples
$help_choices.addClass('help_choices_selected');
$label.addClass('help_label_selected');
count++;
} else if (!checked && count > 0) { //subtractive checkboxes, uncheck one or multiples
count--;
$label.removeClass('help_label_selected');
if (count == 0) { //now no checkboxes selected
$help_choices.removeClass('help_choices_selected');
}
}
代替在if/else条件中对count
变量进行递增和递减操作。将其作为change
事件处理程序中的第一件事。它使你的逻辑非常简单。
if(checked)
count++;
else
count--;
演示工作- 如何在ReactJS JSX中执行嵌套的if-else语句
- 正在尝试使用if和else添加类,但无法正常工作
- Javascript Return and if/else
- 在angularjs/google地图中显示分支最近的路线
- JavaScript if-else 速记错误
- 如何检查if/else语句中的随机条件
- 在javascript中创建数组,而不是if.else
- Javascript If else 只返回 TRUE 或只返回 FALSE
- jquery if else不返回警报消息
- Javascript else(如果不适用于所有语句)
- 如果javascript中的else导致缺少值
- 在Javascript中为if/else语句添加OR
- 如果在构造函数内部为else,则Javascript是可选的
- If Else Java Script HTML
- JavaScript,if 语句总是只执行 'else' 分支
- 如何在循环中测试就绪状态和状态以避免 else 分支
- 处理条if/else同时呈现两个分支
- jQuery在Rails中执行if-else语句的两个分支
- 自定义样式的复选框-我的JavaScript逻辑问题(一个else分支没有被击中)
- if语句永远不会到达else分支& ';if (x = y)& ';