zoukankan      html  css  js  c++  java
  • S全选功能代码

    JS全选功能代码优化

    2014-06-26 00:00 by 龙恩0707, 470 阅读, 3 评论, 收藏编辑

    JS全选功能代码优化

        最近在看javascript MVC那本书,也感觉到自己写的代码也并不优雅,所以一直在想 用另一种模式来编写JS代码,所以针对之前的简单的JS全选功能来做个简单的demo,使用目前现在的编码方式来重新编码,当然以后会一直用这种方式来编写自己的代码。下面是如下代码:

     JS所有代码:

    复制代码
    /**
     * JS全选
     * @class Checkall
     * @param {Object} cfg
     * @param {Element|selector} [cfg.container] 限定全选的容器
     * @param {selector} cfg.checkAll 全选框
     * @param {selector} cfg.checkItem 子选框
     */
     function CheckAll(cfg,callback) {
        var self = this;
    
        this.config = cfg;
    
        this.container = $(cfg.container) || document.body;
    
        // 全选自定义事件
        this.container.delegate(cfg.checkAll,'change',function(e){
            $(e.target).trigger('checkAllChange');
        });
    
        // 单选自定义事件
        this.container.delegate(cfg.checkItem,'change',function(e){
            $(e.target).trigger('checkItemChange');
        });
    
        // 全选操作
        this.container.delegate(cfg.checkAll,'checkAllChange',function(e){
        
            var checked = self.isItemChecked(e.target);
    
            self._checkAll(checked);
    
            // 选中所有子节点
            self._AllChildrenChecked(checked);
    
            callback && $.isFunction(callback) && callback(self);
        });
    
        // 单选操作
        this.container.delegate(cfg.checkItem,'checkItemChange',function(e){
            
            // 检查是否所有子节点都选中了
            if( self._isChildrenChecked()){
                self._checkAll(true);
            }
            else {
                self._checkAll(false);
            }
            callback && $.isFunction(callback) && callback(self);
        });
     };
     
     $.extend(CheckAll.prototype,{
        
        /*
         * 选中单个checkbox
         * @param item
         * @param _isCheck
         */
        _checkItem: function(item, _isCheck ){
            item = $(item);
            item.prop('checked', _isCheck);
        },
        /*
         * 选中/反选所有的 全选按钮
         * @method _checkAll {private}
         * @param {Boolean} _isCheck
         */
        _checkAll: function(_isCheck){
            var self = this;
            this.container.find(self.config.checkAll).each(function(index,item){
                var isAllChecked = self.isItemChecked(item);
                if(isAllChecked !== _isCheck) {
                     self._checkItem(item,_isCheck);
                }
            });
        },
        /*
         * 选中/反选 所有的子节点
         * @method _AllChildrenChecked {private}
         */
         _AllChildrenChecked: function(_isCheck){
            var self = this;
            this.container.find(this.config.checkItem).each(function(index,item){
                var itemChecked = self.isItemChecked(item);
                if( itemChecked !== _isCheck){
                    self._checkItem(item, _isCheck);
                }
            });
         },
        /*
         * 是否所有的子节点都选中了
         */
        _isChildrenChecked: function(){
            var isCheckAll = true;
            var self = this;
            this.container.find(this.config.checkItem).each(function(index,item){
                if(!self.isItemChecked(item)) {
                    isCheckAll = false;
                }
            });
            return isCheckAll;
        },
        /*
         * 检查一个元素是否被选中
         */
         isItemChecked: function(item) {
            return $(item).is(":checked");
         },
         /*
          * 获取被选中的所有值 或者 属性 存入数组
          * @todo 比如想获取选中所有项的id或者其他所有项的属性等操作
          * @method getValues {public} 
          * @param {elems,attr} 元素所有的dom节点 获取元素对应的属性值
          * @return 返回数组 {rets}
          */
         getValues: function(elems,attr) {
            var self = this,
                rets = [];
            $(elems).each(function(index,item){
                var isboolean = self.isItemChecked(item);
                if(isboolean && $(item).prop(attr)) {
                    var curAttr = $(item).prop(attr);
                    rets.push(curAttr);
                }
            });
            return rets;
         }
     });
    复制代码

    HTML代码如下:

    复制代码
    <div class="check-list">
        <hr>
        <div class="J_CheckListContainerBasic">
            <h4>基本使用</h4>
    
            <div class="check-all">
                <label>全选 <input type="checkbox" class="J_CheckAll"></label>
                <ul class="sub-checkbox">
                    <li><label>选中 <input type="checkbox" class="J_CheckItem" value="1"></label></li>
                    <li><label>选中 <input type="checkbox" class="J_CheckItem" value="2"></label></li>
                    <li><label>选中 <input type="checkbox" class="J_CheckItem" value="3"></label></li>
                </ul>
            </div>
        </div>
    </div>
    复制代码

    JS初始化如下:

    复制代码
    var checkAll=  new CheckAll({
                container: '.J_CheckListContainerBasic',
                checkAll: '.J_CheckAll',
                checkItem: '.J_CheckItem'
            },function(){
                console.log(checkAll.getValues('.J_CheckItem',"value"));
            });
    复制代码

    当然为了查看效果,我也提供了JSFIddler地址 供预览:

    JS全选功能演示

     
     
    分类: javascript
  • 相关阅读:
    转 oracle catalog 库常用脚本
    转 【ORACLE】ORA-12537 问题整理
    转 Trace a specific ORA- error
    15%
    MySQL 存储过程
    MySQL 命令行客户机的分隔符
    MySQL 连接join
    MySQL 正则表达式
    MySQL 日期时间函数
    Arthas 快速入门
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3809845.html
Copyright © 2011-2022 走看看