原生JS与jQuery实现Checkbox全选、全不选及行内点击联动
本文详细讲解了如何使用原生JavaScript和jQuery两种技术栈实现列表项中checkbox的全选、全不选及行内点击选中功能。重点在于保持全选框状态与列表项状态的双向联动,并支持点击行内任意位置触发选中。文章提供了完整的HTML结构与核心JS代码示例,帮助开发者解决列表交互中的常见需求。
引言与功能概述
在常规的项目开发中,处理列表类文章或数据时,通常会涉及到checkbox的全选或全不选功能。虽然过往项目中也曾编写过相关的选择逻辑,但并未进行系统整理。鉴于近期有同行遇到此类问题,特此花费时间分别使用原生JavaScript和jQuery编写了两个版本。考虑到实际使用的灵活性,代码未进行封装,使用者可根据需求自行调整相关参数。

功能介绍:点此查看DEMO演示
主要功能包括: 1. 全选/全不选与列表项状态同步:列表中选框的状态需与全选/全不选复选框的状态保持一致。 2. 自动更新全选状态:当列表中选框全部选中时,全选/全不选复选框自动变为选中状态;反之,若列表中存在未选中项,则全选框自动取消选中。 3. 行内点击联动:支持在列表行内点击选中对应的checkbox,并与上述1、2功能保持联动。 此外,本文重点在于实现全选逻辑,鼠标悬停背景变色仅为简易示例,如需更完善的交互效果,可参考:
https://www.jb51.net/article/24125.htm
原生JS实现方案
原生JS版本核心代码
html代码
<form id="js" name="js" action="#">
<h5>原生JS样例</h5>
<dl>
<dt><label for="js_chk_0"><input type="checkbox" id="js_chk_0" name="chk_can" value="" />全选/全不选</label></dt>
<dd><span>2010-12-12</span><input type="checkbox" name="jsitems" value="" />原生JS实现的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jsitems" value="" />原生JS实现的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jsitems" value="" />原生JS实现的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jsitems" value="" />原生JS实现的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jsitems" value="" />原生JS实现的全选/全不选,点行也可选中或取消</dd>
<dt><label for="js_chk_1"><input type="checkbox" id="js_chk_1" name="chk_can" value="" />全选/全不选</label></dt>
</dl>
</form>
原生js代码
//原生JS实现全选全不选类
window.onload = function iCheckAll(){
var js_chk = document.forms['js'].chk_can;
var jsitems = document.forms['js'].jsitems;
var jsrows = document.getElementById('js').getElementsByTagName('dd');
//判断选中个数与实际选框个数实现全选/全不选框的状态
var chk_canle = function(){
var checkedLen = 0;
//计算列表中选中状态的选框个数
for (var m = 0; m < jsitems.length; m++) {
if (jsitems[m].checked) {
checkedLen += 1;
}
}
//判断选中个数与实际个数是否相同,以确定全选/全不选状态
for (var m = 0; m < js_chk.length; m++) {
js_chk[m].checked = (jsitems.length == checkedLen);
}
}
//全选与全不选一体实现
for (var i = 0; i < js_chk.length; i++) {
js_chk[i].onclick = function(){
//列表中选框与全选选框统一状态
for (var m = 0; m < jsitems.length; m++) {
jsitems[m].checked = this.checked;
}
//全选选框统一状态
for (var m = 0; m < js_chk.length; m++) {
js_chk[m].checked = this.checked;
}
}
}
//列表中选框点击
for (var i = 0; i < jsitems.length; i++) {
jsitems[i].onclick = function(e){
//阻止冒泡,避免行点击事件中,直接选择选框无效
e && e.stopPropagation ? e.stopPropagation() : window.event.cancelBubble=true;
chk_canle();
}
}
//行内点击
for (var i = 0; i < jsrows.length; i++) {
jsrows[i].onclick = function(){
//行内点击时,行内的选框状态为原状态取反
this.getElementsByTagName('input')[0].checked = !this.getElementsByTagName('input')[0].checked;
chk_canle();
}
//划入划出请参考http://mrthink.net/javascript-tagnames-highlight/
jsrows[i].onmouseover = function(){
this.className = 'hover';
}
jsrows[i].onmouseout = function(){
this.className = '';
}
}
}
jQuery实现方案
jquery版本核心代码
html代码
<form id="jq" name="jq" action="#">
<h5>jQuery样例</h5>
<dl>
<dt><label for="jq_chk_0"><input type="checkbox" id="jq_chk_0" name="chk_can" value="" />全选/全不选</label></dt>
<dd><span>2010-12-12</span><input type="checkbox" name="jqitems" value="" />基于jQuery的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jqitems" value="" />基于jQuery的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jqitems" value="" />基于jQuery的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jqitems" value="" />基于jQuery的全选/全不选,点行也可选中或取消</dd>
<dd><span>2010-12-12</span><input type="checkbox" name="jqitems" value="" />基于jQuery的全选/全不选,点行也可选中或取消</dd>
<dt><label for="jq_chk_1"><input type="checkbox" id="jq_chk_1" name="chk_can" value="" />全选/全不选</label></dt>
</dl>
</form>
jquery核心实现代码
//jQ实现全选全不选
$(function(){
var _jq_chk = $('#jq>dl>dt>label>:checkbox');
var _jqitems = $(':checkbox[name=jqitems]');
var _rows = $('#jq>dl>dd');
//全选与全不选一体实现
_jq_chk.click(function(){
//列表中选框和全选选框统一状态
_jqitems.add(_jq_chk).attr('checked', this.checked);
});
//选框的点击事件
_jqitems.click(function(e){
//阻止冒泡,避免行点击事件中,直接选择选框无效
e.stopPropagation();
//判断选中个数与实际个数是否相同,以确定全选/全不选状态
_jq_chk.attr('checked', _jqitems.size() == _jqitems.filter(':checked').size());
});
//点选行时选中行内的checkbox
_rows.bind({
mouseenter: function(){
$(this).addClass('hover');
},
mouseleave: function(){
$(this).removeClass('hover');
},
//点选
click: function(){
//行内点击时,行内的选框状态为原状态取反
$(this).find(':checkbox').attr('checked', !$(this).find(':checkbox').get(0).checked)
//判断选中个数与实际个数是否相同,以确定全选/全不选状态
_jq_chk.attr('checked', _jqitems.size() == _jqitems.filter(':checked').size());
}
});
});
代码说明与总结
该代码相比普通实现略长,主要增加了点击行即可实现选择的功能。功能越多,代码量相应增加。开发者可根据实际需求自行删减冗余部分。
许多Web开发者常面临使用原生JS还是jQuery的抉择。实际上,JS具有通用性,而jQuery是基于其自身库构建的,最终在浏览器中的执行本质并无区别。
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
