实现checkbox的全选/全不选/点选/行内点选(原生JS版和jQ版)

  日常项目中, 对于列表类文章或数据, 大概都会用到checkbox的全选或全不选的功能,以前的项目中也写过checkbox的选择js,但都没有整理过。 正好前几天一个兄弟遇到了这个问题, 索性, 我花了点时间,用原生JS与jQuery分别写了一个版本,考虑到使用时灵活性问题,未封装,需要的童鞋使用时自行改下相关参数。
实现checkbox的全选/全不选/点选/行内点选  功能介绍点此查看DEMO
  1、 全选/全不选 选框一体实现,即列表中选框的状态与全选/全不选框前的选框状态一致。
  2、 自动更改 全选/全不选 选框的状态,即列表中选框都选中时,全选/全不选 选框也选中, 反之亦然。
  3、 列表行内点击也可选中行内的checkbox,并与1,2中的功能联动。
  另,本文重在写全选,鼠标划入划出背景变色为简易实现, 更加完善的请参考: http://mrthink.net/javascript-tagnames-highlight/.
  原生JS版本核心代码

   
   
   
   
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();
}
}

  jQ版本核心代码

   
   
   
   
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());
}
});

  原文发布Mr.Think的博客:http://mrthink.net/js-jq-checkboxevent/ 转载请注明出处。

你可能感兴趣的:(JavaScript,Jquery)