全选反选

全选和反选功能,在开发中可以说是应用得非常多的,以下通过案例分解,学习如何使用JS实现全选反选功能。

该功能可分为如下三大步骤:

1、全选

1.1 获取父checkbox,注册点击事件

1.2 获取所有的子checkbox,让所有子checkbox的状态跟父checkbox保持一致

html和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> <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>小米Mix2s</td>
<td>3000</td>
</tr>
<tr>
<td>
<input type="checkbox"/>
</td>
<td>华为P30</td>
<td>3800</td>
</tr>
<tr>
<td>
<input type="checkbox"/>
</td>
<td>iPad Air</td>
<td>2000</td>
</tr>
<tr>
<td>
<input type="checkbox"/>
</td>
<td>小米手环</td>
<td>200</td>
</tr> </tbody>
</table>
<input type="button" value=" 反 选 " id="btn">
</div>
// 1、全选
// 父checkbox,子checkbox
// 1.1 获取父checkbox,注册点击事件
var j_cbAll = document.getElementById('j_cbAll');
j_cbAll.onclick = function () {
// 1.2 获取所有的子checkbox,让所有子checkbox的状态跟父checkbox保持一致
var j_tb = document.getElementById('j_tb');
var inputs = j_tb.getElementsByTagName('input');
//遍历,将所有子checkbox状态改为跟父checkbox状态一致
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type === 'checkbox') {
//将子checkbox状态跟父checkbox状态保持一致
input.checked = this.checked;
}
}
}

2、 当点击子checkbox,如果所有的子checkbox已经被选中,则选中父checkbox,如果有一个子checkbox没有被选中,则不选中父checkbox

(1)循环,判断是否是复选框,若是,则注册点击事件

(2)点击按钮时,判断所有的子checkbox是否都选中,如果都选中,则父checkbox状态设置为选中,如果有一个子checkbox没选中,则父checkbox设置为不选中

以下代码是在第一步骤基础上写的,包括了第一部分的代码

var j_tb = document.getElementById('j_tb');
var inputs = j_tb.getElementsByTagName('input');
var j_cbAll = document.getElementById('j_cbAll');
// 1、全选
// 父checkbox,子checkbox
// 1.1 获取父checkbox,注册点击事件
var j_cbAll = document.getElementById('j_cbAll');
j_cbAll.onclick = function () {
// 1.2 获取所有的子checkbox,让所有子checkbox的状态跟父checkbox保持一致 //遍历,将所有子checkbox状态改为跟父checkbox状态一致
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type === 'checkbox') {
//将子checkbox状态跟父checkbox状态保持一致
input.checked = this.checked;
}
}
} //1.3 当有一个子checkbox没有被选中时,父checkbox应当不选中,当所有的子checkbox都选中时,应当选中父checkbox
// 给每一个子checkbox注册事件
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
//如果不是复选框,则不绑定事件
if (input.type !== 'checkbox') {
continue;
}
input.onclick = function () {
//假设所有子checkbox都已经选中
var allChecked = true;
console.log(inputs);
//判断所有子checkbox是否选中
for (var j = 0; j < inputs.length; j++) {
var input = inputs[j];
//如果不是复选框,则跳到写一次循环
if (input.type !== 'checkbox') {
continue;
}
if (!input.checked) {
allChecked = false;//如果有没选中的
break;
}
} //同步父checkbox和子checkbox的状态
j_cbAll.checked = allChecked;
}
}

3、反选

当点击反选按钮时,将所有的子的checkbox状态取反,然后同步父的checkbox的状态。 以下代码是在第二步骤基础上写的,包括了第二部分的代码

var j_tb = document.getElementById('j_tb');
var inputs = j_tb.getElementsByTagName('input');
var j_cbAll = document.getElementById('j_cbAll');
// 1、全选
// 父checkbox,子checkbox
// 1.1 获取父checkbox,注册点击事件
var j_cbAll = document.getElementById('j_cbAll');
j_cbAll.onclick = function () {
// 1.2 获取所有的子checkbox,让所有子checkbox的状态跟父checkbox保持一致 //遍历,将所有子checkbox状态改为跟父checkbox状态一致
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type === 'checkbox') {
//将子checkbox状态跟父checkbox状态保持一致
input.checked = this.checked;
}
}
} //1.3 当有一个子checkbox没有被选中时,父checkbox应当不选中,当所有的子checkbox都选中时,应当选中父checkbox
// 给每一个子checkbox注册事件
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
//如果不是复选框,则不绑定事件
if (input.type !== 'checkbox') {
continue;
}
input.onclick = function () {
checkAllCheckBox();
}
} // 2、反选
// 1、给反选按钮注册事件
var btn = document.getElementById('btn');
btn.onclick = function () {
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
// 2、判断是否是checkbox
if (input.type !== 'checkbox') {
continue;
}
// 3、给所有的子checkbox反选
input.checked = !input.checked;
} // 问题:当选中或取消所有子checkbox时,父checkbox没改变状态
// 4、判断父的checkbox的状态,根据该状态同步父子checkbox状态
checkAllCheckBox(); } //封装子checkbox和父checkbox的状态同步功能
function checkAllCheckBox() {
//假设所有子checkbox都已经选中
var allChecked = true;
//判断所有子checkbox是否选中
for (var j = 0; j < inputs.length; j++) {
var input = inputs[j];
//如果不是复选框,则不绑定事件
if (input.type !== 'checkbox') {
continue;
}
if (!input.checked) {
allChecked = false;//如果有没选中的
}
}
//同步父checkbox和子checkbox的状态
j_cbAll.checked = allChecked;
}

全选和反选小结:

1、给反选按钮注册事件

2、判断是否是checkbox

3、给所有的子checkbox反选

4、判断父的checkbox的状态,根据该状态同步父子checkbox状态

JavaScript Web API 全选反选案例的更多相关文章

  1. javascript总结41:表格全选反选,经典案例详解

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. JavaScript 实现全选 / 反选功能

    JavaScript 实现全选 / 反选功能 版权声明:未经授权,内容严禁转载! 构建主体界面 编写 HTML 代码 和 CSS 代码,设计主题界面 <style> #user { wid ...

  3. JavaScript、全选反选-课堂笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 用javascript实现全选/反选组件

    以下是本人制作的全选/反选 组件,供广大同行参考.指正: 效果如图: 在实现的过程中,全选和全部取消选中这两个功能较为简单,只需用for循环遍历所有复选框为true或false即可.反选也较为简单,也 ...

  5. 表单javascript checkbox全选 反选 全不选

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  6. 用JavaScript实现全选-反选

    实现全选-反选 在日常生活我们会遇到需要全选-反选的地方,其实用JavaScript也能实现. 样式如下所示: 样式代码如下所示: <!DOCTYPE html PUBLIC "-// ...

  7. jQuery全选/反选checkbox

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Dom操作--全选反选

    我们经常会在网站上遇到一些多选的情况,下面我就来说说使用Dom写全选反选的思路. 全选思路:首先,我们来分析一下知道,当我们点击"全选"复选框的时候,所有的复选框应该都被选中,那我 ...

  9. jQuery之标签操作和返回顶部、登录验证、全选反选、克隆示例

    一.样式操作 1.JQ中的样式类 somenode.addClass();// 添加指定的CSS类名. somenode.removeClass();// 移除指定的CSS类名. somenode.h ...

随机推荐

  1. tldr/cheat

    tldr 比man好用的查询命令查询工具, man很强大,但是 TLDR,too long dont read 安装 npm install -g tldr 使用说明 其他版本下载 https://g ...

  2. MySQL explain使用

    1.介绍 EXPLAIN 命令用于SQL语句的查询执行计划.这条命令的输出结果能够让我们了解MySQL 优化器(optimlzer)是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提 ...

  3. 使用深度学习的超分辨率介绍 An Introduction to Super Resolution using Deep Learning

    使用深度学习的超分辨率介绍 关于使用深度学习进行超分辨率的各种组件,损失函数和度量的详细讨论. 介绍 超分辨率是从给定的低分辨率(LR)图像恢复高分辨率(HR)图像的过程.由于较小的空间分辨率(即尺寸 ...

  4. ICEM-圆角正方体

    原视频下载地址:https://pan.baidu.com/s/1c2cNgJm 密码: rci8

  5. hdoj - 1181 变形课

    Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...

  6. CTF CMS(转)

    CTF--CMS漏洞总结 海洋CMS 6.28 海洋CMS6.28命令执行漏洞 6.45-6.54 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警 8.8(未验证) 海洋cms前台到后台的g ...

  7. python去除BOM头\ufeff等特殊字符

    1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sigwith open(file_path, mode='r', encoding='UTF-8 ...

  8. MongoDB笔记: 常见问题

    系统配置 设置ulimit MongoDB的文件机制 每个Collection会单独创建一个数据文件(collection-xxxxxx.wt) 每个索引会单独创建一个文件(index-xxxxxx. ...

  9. python读取yaml文件,在unittest中使用

    python读取yaml文件使用,有两种方式: 1.使用ddt读取 2,使用方法读取ddt的内容,在使用方法中进行调用 1.使用ddt读取 @ddt.ddt class loginTestPage(u ...

  10. LODOP一个任务多列,只打一列如何维护

    打印维护是针对整个任务进行维护的,打印多少个打印项就要维护多少个打印项,维护了多少打印项,就要打印多少内容.但是打印的时候不需要打印其他列,可以把其他列的数值传入空置,add_print_text纯文 ...