关于选框的一些封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39759115/article/details/80310524

1. 原生

此原生并非指原生js,而是原生的 checkbox 组件

 <label for="checkAll">
        <input type="checkbox" name="checkAll" id="checkAll" />全选
    </label>
    <label for="invertSelect">
        <input type="checkbox" name="invertSelect" id="invertSelect" />反选
    </label>

    <label for="checkItem1">
        <input type="checkbox" name="checkItem" id="checkItem1" />选项1
    </label>
    <label for="checkItem2">
        <input type="checkbox" name="checkItem" id="checkItem2" />选项2
    </label>
    <label for="checkItem3">
        <input type="checkbox" name="checkItem" id="checkItem3" />选项3
    </label>
1.1 注册


/**
 * 注册全选(原生)
 * @param selectAllName  全选name
 * @param itemName        选项name
 */
function initCheckAll(selectAllName,itemName){
    var _selectAllName =  $("input[name="+selectAllName+"]"),
        _itemName = $("input[name="+itemName+"]");
    // 点击全选
    _selectAllName.click(function(){
        if(_selectAllName.is(":checked")){
            _itemName.attr("checked",true);
        }else{
            _itemName.attr("checked",false);
        }
    });

    // 点击item
    _itemName.click(function(){
        isSelectAllStatus(selectAllName,itemName)
    });
}

/**
 * 更新全选状态
 * @param selectAllName    全选name
 * @param itemName           选项name
 */
function isSelectAllStatus(selectAllName, itemName){
    var _selectAllName =  $("input[name="+selectAllName+"]"),
        _itemName = $("input[name="+itemName+"]");
    _itemName.each(function(){
        if(!$(this).is(':checked')){
            _selectAllName.attr('checked',false);
            return false;
        }else{
            _selectAllName.attr('checked',true);
        }
    });
}

/**
 * 注册反选(原生)
 * @param invertSelectName    反选name
 * @param itemName            选项name
 * @param selectAllName      全选name (不传参数则不更新全选状态)
 */
function invertSelection(invertSelectName,itemName,selectAllName){
    $("input[name="+invertSelectName+"]").click(function () {
        $("input[name="+itemName+"]").each(function () {
            $(this).prop("checked", !$(this).prop("checked"));
        });
        if(!!selectAllName){
            isSelectAllStatus(selectAllName, itemName);
        }
    });
}
1.2 使用
initCheckAll("checkAll","checkItem");
invertSelection("invertSelect","checkItem","checkAll");

2 自定义选择框

2.1 自定义选框图片

.draw-selected{
    background: url("../img/draw-selected.png") 4px 7px no-repeat;
    background-size: 14px;
    color: #333333;
}
.draw-no-select{
    background: url("../img/draw-no-select.png") 4px 7px no-repeat;
    background-size: 14px;
    color: #999999;
}
.draw-selected-circle{
    background: url("../img/draw-selected-circle.png") 4px 7px no-repeat;
    background-size: 14px;
    color: #333333;
}
.draw-no-select-circle{
    background: url("../img/draw-no-select-circle.png") 4px 7px no-repeat;
    background-size: 14px;
    color: #999999;
}
2.2 html
            <div>
                <span class="tableHeaderChooseAll draw-no-select">全选</span>
            </div>

             <ul>
                <li data-type="1" class="tableHeaderChoose draw-no-select">选项1</li>
                <li data-type="2" class="tableHeaderChoose draw-no-select">选项2</li>
                <li data-type="3" class="tableHeaderChoose draw-no-select">选项3</li>
                <li data-type="4" class="tableHeaderChoose draw-no-select">选项4</li>
                <li data-type="5" class="tableHeaderChoose draw-no-select">选项5</li>
                <li data-type="6" class="tableHeaderChoose draw-no-select">选项6</li>
                <li data-type="7" class="tableHeaderChoose draw-no-select">选项7</li>
                <li data-type="8" class="tableHeaderChoose draw-no-select">选项8</li>
                <li data-type="9" class="tableHeaderChoose draw-no-select">选项9</li>
                <li data-type="10" class="tableHeaderChoose draw-no-select">选项10</li>
            </ul>
2.3 注册

// ---------------- 自定义选择框 -------------------
var _SELECTED_CIRCLE = "draw-selected-circle", // 已选择(圆形)
        _NO_SELECT_CIRCLE =  "draw-no-select-circle",// 已选择(圆形)
        _SELECTED = "draw-selected",// 已选择(方形)
        _N0_SELECT = "draw-no-select";// 未选择(方形)

/**
 * 自定义图片全选框
 * @param  btn     全选按钮class
 * @param  tds     选项的class
 * @param  fn      不可选callback  (参数1:当前选项、参数2:选项的class)
 */
function selectAll(btn,tds,fn){
    var _self = $(btn),_tds = $(tds);
    _self.click(function(){
        if(_self.hasClass(_SELECTED_CIRCLE)){
            changeClass(_SELECTED_CIRCLE,_NO_SELECT_CIRCLE,_SELECTED,_N0_SELECT);
        }else{
            changeClass(_NO_SELECT_CIRCLE,_SELECTED_CIRCLE,_N0_SELECT,_SELECTED);
        }
    });

    function changeClass(removeClass,addClass,tdReClass,tdAddClass){
        _self.removeClass(removeClass).addClass(addClass);
        for(var j=0;j<_tds.length;j++){
            if(typeof fn  ==="function" && !fn($(_tds[j]),tds)){
                continue
            }
            $(_tds[j]).removeClass(tdReClass||removeClass).addClass(tdAddClass||addClass);
        }
    }
}

/**
 * 自定义图片选框(多选)
 * @param itemClass     选项的class
 * @param selected      选择状态的class
 * @param noSelect      未选择状态的class
 * @param fn            不可选callback (参数1:当前选项、参数2:选项的class)
 */
function selectItemMultiple(itemClass,selected,noSelect,fn){
    $(itemClass).click(function(){
        var _self = $(this);
        if(typeof fn  ==="function" && !fn(_self,itemClass)){
            return
        }
        if(_self.hasClass(selected)){
            _self.removeClass(selected).addClass(noSelect);
        }else{
            _self.removeClass(noSelect).addClass(selected);
        }
    });
}

/**
 * 自定义图片选框(单选)
 * @param itemClass     选项的class
 * @param selected      选择状态的class
 * @param noSelect      未选择状态的class
 */
function selectItemRadio(itemClass,selected,noSelect){
    $(itemClass).click(function(){
        $(itemClass).removeClass(selected).addClass(noSelect);
        $(this).removeClass(noSelect).addClass(selected);
    });
}
2.4 使用
        // 全选
        selectAll('.tableHeaderChooseAll','.tableHeaderChoose',function(ele){
            return !(ele.attr('data-type') == 1); // 第一项不可选择
        }); 
        // 多选
        selectItemMultiple('.tableHeaderChoose', _SELECTED, _N0_SELECT, function(ele,eleClass){
            var headLength = $(eleClass).length;
            return !(ele.attr('data-type') == 1 || ele.attr('data-type') == headLength); // 第一项和最后一项不可选择
        });

猜你喜欢

转载自blog.csdn.net/qq_39759115/article/details/80310524