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


    转自http://mrthink.net/

    日常项目中, 对于列表类文章或数据, 大概都会用到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/
  • 相关阅读:
    欧几里得算法及扩展欧几里得(含)
    RP
    P1734_最大约数和
    The 2017 ACM-ICPC Asia East Continent League Final记录
    【数据结构】bzoj1651专用牛棚
    【数据结构】bzoj1455罗马游戏
    【数据结构】bzoj1636/bzoj1699排队
    【数据结构】bzoj3747Kinoman
    【计算几何】奇特的门
    Topcoder SRM 608 div1 题解
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/1950726.html
Copyright © 2020-2023  润新知