JS全選功能代碼最佳化

來源:互聯網
上載者:User

標籤:style   class   blog   code   http   java   

原文:JS全選功能代碼最佳化

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全選功能示範

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.