原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)


Posted in Javascript onOctober 29, 2016

日常项目中, 对于列表类文章或数据, 大概都会用到checkbox的全选或全不选的功能, 以前的项目中也写过checkbox的选择js, 但都没有整理过. 正好前几天一个兄弟遇到了这个问题, 索性, 我花了点时间, 用原生JS与jQuery分别写了一个版本, 考虑到使用时灵活性问题, 未封装, 需要的童鞋使用时自行改下相关参数.

原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)

功能介绍点此查看DEMO演示

1. 全选/全不选 选框一体实现, 即列表中选框的状态与全选/全不选框前的选框状态一致;
2. 自动更改 全选/全不选 选框的状态, 即列表中选框都选中时, 全选/全不选 选框也选中, 反之亦然;
3. 列表行内点击也可选中行内的checkbox, 并与1,2中的功能联动.
另,本文重在写全选, 鼠标划入划出背景变色为简易实现, 更加完善的请参考:

原生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版本核心代码

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问题,那到底是用JQ来实现还是用JS来实现,常常困扰着我们,但其实JS是通用的,而JQ是建在自己加载的JQ库的,所在真正实现是没有任何区别的。

Javascript 相关文章推荐
JS实现弹性漂浮效果的广告代码
Sep 02 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
May 31 Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
基于打包工具Webpack进行项目开发实例
May 29 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
Aug 08 Javascript
js设计模式之代理模式及订阅发布模式实例详解
Aug 15 Javascript
Vue 解决多级动态面包屑导航的问题
Nov 04 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
Oct 29 #Javascript
JS给Array添加是否包含字符串的简单方法
Oct 29 #Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 #Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
Oct 28 #Javascript
RequireJS简易绘图程序开发
Oct 28 #Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
Oct 28 #Javascript
微信小程序 页面跳转传参详解
Oct 28 #Javascript
You might like
详解PHP实现异步调用的4种方法
2016/03/14 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
简单分析python的类变量、实例变量
2019/08/23 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
《十六年前的回忆》教学反思
2014/02/14 职场文书
中学校庆方案
2014/03/17 职场文书
出国留学计划书
2014/04/27 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
档案管理员岗位职责
2015/02/12 职场文书
导游词之无锡唐城
2019/12/12 职场文书