全选反选框bug
Posted 贪吃ღ大魔王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全选反选框bug相关的知识,希望对你有一定的参考价值。
项目场景:
全选框反选 |
问题描述:
在测试过程中发现,依次将每个li选中后,全选框自动选中,但是在对全选框进行取消选中时,需要多点一下取消。
可能是因为个人代码问题,具体代码例如下:
js:
var price = document.getElementById('j_cbAll');
var ipts = document.querySelectorAll('#j_tb input');
var but = document.querySelector('#btn');
// 给全选按钮设置 全选
var flag = true;
price.onclick = function () {
if (flag) {
ipts.forEach(function (v, k) {
v.checked = false;
flag = false;
price.checked = flag;
})
} else {
ipts.forEach(function (v, k) {
v.checked = true;
flag = true;
price.checked = flag;
})
}
}
// price.onclick = function () {
// for (var i = 0; i < ipts.length; i++) {
// ipts[i].checked = this.checked;
// }
// }
for (var i = 0; i < ipts.length; i++) {
ipts[i].onclick = function () {
var num = true;
for (var i = 0; i < ipts.length; i++) {
if (!ipts[i].checked) {
num = false;
}
}
price.checked = num;
}
}
html:
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll" />
</th>
<th>商品</th>
<th>价钱</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPhone8</td>
<td>8000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPad Pro</td>
<td>5000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPad Air</td>
<td>2000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Apple Watch</td>
<td>2000</td>
</tr>
</tbody>
</table>
<input type="button" value=" 反 选 " id="btn">
</div>
css:
<style>
* {
padding: 0;
margin: 0;
}
.wrap {
width: 300px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
width: 300px;
}
th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
th {
background-color: #09c;
font: bold 16px "微软雅黑";
color: #fff;
}
td {
font: 14px "微软雅黑";
}
tbody tr {
background-color: #f0f0f0;
}
tbody tr:hover {
cursor: pointer;
background-color: #fafafa;
}
</style>
原因分析:
实现页面:
正常勾选全选框和取消反选框都正常:
bug:当对每个li进行选择完后 再点击全部取消 需要多点一次
解决方案:
第一种方法:常规方法
price.onclick = function () {
for (var i = 0; i < ipts.length; i++) {
ipts[i].checked = this.checked;
}
}
第二种方法:
price.onclick = function () {
var flag = this.checked;
ipts.forEach(function (v, k) {
v.checked = flag;
})
}
第三种: 封装函数,传参。
price.onclick = function () {
var stautic = this.checked;
check(stautic)
}
function check(sta) {
ipts.forEach(function (v, k) {
v.checked = sta;
})
}
最上面的bug问题 属个人代码问题,望大佬指出问题所在:
var flag = true;
price.onclick = function () {
if (flag) {
ipts.forEach(function (v, k) {
v.checked = false;
flag = false;
price.checked = flag;
})
} else {
ipts.forEach(function (v, k) {
v.checked = true;
flag = true;
price.checked = flag;
})
}
}
以上是关于全选反选框bug的主要内容,如果未能解决你的问题,请参考以下文章