Html5 Checkbox多種狀態切換

最近在搞一個權限配置的頁面,裏面的選項框要實現級聯,同時checkbox需要有三種狀態:選擇,部分選擇,不選,搜索找到一篇文章jQuery 版的 CheckBox 複選框成組聯動(性能改進版)不過我在瀏覽器上測試有問題,進行修改代碼如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
</head>
<body>
	<div class="container">
		<input type="checkbox" forcheckboxgroup="group_sel"/>全選
        <input type="checkbox" group="group_sel"/>選項1
        <input type="checkbox" group="group_sel"/>選項2
        <input type="checkbox" group="group_sel"/>選項n
        <button type="button" forcheckboxgroup="group_sel">對選中的項目進行操作</button> 
	</div>
	<script type="text/javascript">
	$("#ww").prop("indeterminate", true);
		$(function () {  
  
    var _jgroupCons = $("[forcheckboxgroup]"), //所有具有 forcheckboxgroup 屬性的元素  
        _jcheckboxs = $(":checkbox[group]"), //所有具有 group 屬性的複選框  
        _checkgroups = new Array; //複選框組數組,該數組每一項保存一組由 _jcheckboxs 過濾的複選框組,組名稱即是數組項的鍵  
  	
    _jcheckboxs.each(function (i) {  
        var _groupname = $(this).attr("group"); //group 是非標準屬性,必須由 attr 方法獲得值,prop 方法不能獲得
    	if (!_checkgroups[_groupname]) {  
        	_checkgroups[_groupname] = _jcheckboxs.filter("[group='" + _groupname + "']");  
    	} 
    });  

    //將所有與組關聯的非複選框的元素設爲無效  
    _jgroupCons.filter(":not(:checkbox)").prop("disabled", true).addClass("disabled");  
  
    _jgroupCons.filter(":checkbox")    //選擇所有可以控制複選框組狀態的複選框  
        .change(function () {  // 綁定 change 事件  
            var _jthis = $(this),  
                forgroupname = _jthis.attr("forcheckboxgroup"); //forcheckboxgroup 是非標準屬性,必須由 attr 方法獲得值,prop 方法不能獲得  
            //點擊此複選框後只做以下三件事:  
  
            // 1. 設置所控制的複選框組內所有複選框的狀態  
            _jcheckboxs.filter("[group='" + forgroupname + "']").prop("checked", this.checked);  
  
            // 2. 設置與自己具有相同功能的複選框的狀態  
            _jgroupCons.filter(":checkbox[forcheckboxgroup='" + forgroupname + "']").prop("checked", this.checked).prop("indeterminate", false);  
  
            // 3. 設置所有與該複選框組相關聯的元素的狀態  
            _jgroupCons.filter("[forcheckboxgroup='" + forgroupname + "']:not(:checkbox)").prop("disabled", !this.checked).toggleClass("disabled", !this.checked);  
        });  
  
    _jcheckboxs   //選擇所有成組的複選框  
        .change(function () {  //綁定 change 事件  
            var _jthis = $(this),  
                _blnStat = this.checked, //此複選框的選中狀態  
                _groupname = _jthis.attr("group"), //此複選框所屬的組名稱,非標準屬性,必須由 attr 方法獲得值,prop 方法不能獲得
                _group = _checkgroups[_groupname],
                _checkedcount = _group.filter(function(index){
                	return _group[index].checked;
                }).length,//所在組處於選中狀態的複選框數量  
                _blnEqual =  _checkedcount == 0 || _checkedcount == _group.length;    //該組所有成員的選中狀態是否相同,即全都選中,或全都未選 
  			if (_blnEqual) {
  				//設置所有可控制該組狀態的複選框的狀態  
	            _jgroupCons.filter(":checkbox[forcheckboxgroup='" + _groupname + "']").prop("checked", _blnStat).prop("indeterminate", !_blnEqual);  
	        }else{
	        	_jgroupCons.filter(":checkbox[forcheckboxgroup='" + _groupname + "']").prop("checked", false).prop("indeterminate", true);  
	        }
            
            //設置所有與組關聯的非複選框的元素狀態  
            _jgroupCons.filter("[forcheckboxgroup='" + _groupname + "']:not(:checkbox)").prop("disabled", !(_blnStat || !_blnEqual)).toggleClass("disabled", !(_blnStat || !_blnEqual));  
        });  
});  
	</script>
</body>
</html>

修改部分如上圖的選中內容。

效果圖如下:


對於中間狀態我點擊設置爲全選,如果想修改可以修改

_jgroupCons.filter(":checkbox[forcheckboxgroup='" + _groupname + "']").prop("checked", false).prop("indeterminate", true);  
如果修改可以修改checked爲true,indeterminate的狀態並不會修改checkbox的值。

針對checkbox的多種狀態可以查看Indeterminate Checkboxes

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章