JS全選機能コード最適化
14992 ワード
原文:
JS全選機能コード最適化
JS全選機能コード最適化
最近はjavascript MVCの本を読んでいますが、自分の書いたコードも優雅ではないと感じています.だからずっと他のモードでJSコードを作りたいです.前の簡単なJS全選択機能に対して簡単なデモを作って、今のコード方式で再コードを作ります.もちろん今後はずっとこのような方式で自分のコードを作ります.下記のコードです.
JSのすべてのコード:
JS全選機能のデモンストレーション
JS全選機能コード最適化
JS全選機能コード最適化
最近はjavascript MVCの本を読んでいますが、自分の書いたコードも優雅ではないと感じています.だからずっと他のモードでJSコードを作りたいです.前の簡単なJS全選択機能に対して簡単なデモを作って、今のコード方式で再コードを作ります.もちろん今後はずっとこのような方式で自分のコードを作ります.下記のコードです.
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全選機能のデモンストレーション