HTML : CheckBox 复选框成组联动(JavaScript)

在页面中,经常需要控制一组 CheckBox 的选中状态,常用的操作有:

1.通过一个或者多个复选框来控制一组 CheckBox 的选中状态。

2.根据一组 CheckBox 的选中状态来决定某些控件的状态。如:
    一组 CheckBox 中,至少有一项被选中,某个按钮才可以被点击,否则按钮处于灰色状态,不可点击。
    一组 CheckBox 中,至少有一项被选中,某个文本框才可以输入内容,否则文本框处于失效状态,不可输入。

当页面有多处用到上述功能时,如何简单快速的实现这样的功能就成了关键。

先来看效果:

复选框联动





两个复选框联动





其它对象联动








 

要使多个复选框成组,在写复选框的 HTML 代码时添加自定义属性 group ,如:
<input type="checkbox" group="groupname"/>
<input type="checkbox" group="groupname"/>
...

这样在页面显示时,group 名称相同的会成为一组。同样,在需要联动的对象的代码里添加自定义属性 forcheckboxgroup,名称为联动复选框组的 group 属性的值。当联动对象为复选框时,将控制全组的复选状态,当联动对象为其它元素时,复选框组将控制其 disabled 属性,规则是组内的复选框至少有一个选中时被联动的元素对象的 disabled 属性为 false,否则为 true。如:
<input type="checkbox" forcheckboxgroup="groupname"/>
<input type="button" value="按钮" forcheckboxgroup="groupname"/>
...

要实现上述的功能,需要在页面中引入一个脚本。这个脚本是实现上述功能的核心。它定义了一个函数,会查找所有元素的 forcheckboxgroup 属性和所有复选框的 group 属性,并将它们关联起来,动态定义相应的事件,达到实现联动的功能。

由于 Firefox 和 Opera 的 getAttribute 只能读取由 setAttribute 写入的自定义属性,不能读取 HTML 代码中的自定义属性,所以此功能只能在 IE 中实现,所以代码也就不再判断浏览器类型了。如为防止出错可以自行加上这些代码。

JS 文件内容如下:

function  CheckboxGroup(){
    
var  arrelement  =  document.all;
     var  i = 0 ;
    
while (i < arrelement.length){
        
var  forgroupattrib  =  arrelement[i].getAttribute( ' forcheckboxgroup ' );
        
if (forgroupattrib  !=   null   &&  forgroupattrib  !=   '' ){
            arrelement[i].setAttribute(
' groupmember ' ,_getGroupMember(arrelement[i]));
            
if (arrelement[i].tagName.toLowerCase()  ==   ' input '   &&  arrelement[i].type  ==   ' checkbox ' ){
                arrelement[i].onclick
= function (){
                
// ----------------------Checked All------------------
                     var  groupmember  =   this .getAttribute( ' groupmember ' );
                    
var  i  =   0 ;
                    
while (i < groupmember.length){
                        groupmember[i].checked 
=   this .checked;
                        i
++ ;
                    }
                
// ---------------------------------------------------
                }
            }
            _setState(arrelement[i]);
        }
        i
++ ;
    }
}

function  _getGroupMember(o){
    
var  groupname  =  o.getAttribute( ' forcheckboxgroup ' );
    
var  items  =   new  Array;
    
var  inputs  =  document.getElementsByTagName( ' input ' );
    
var  i = 0 ;
    
while (i < inputs.length){
        
if (inputs[i].type  ==   ' checkbox ' ){
            
var  groupattrib  =  inputs[i].getAttribute( ' group ' );
            
if (groupattrib  ==  groupname){
                items[items.length] 
=  inputs[i];
                
var  master  =  inputs[i].getAttribute( ' groupmaster ' );
                
if  (master  ==   null ) {
                    master 
=   new  Array;
                    master[
0 =  o.uniqueID;
                    inputs[i].setAttribute(
' groupmaster ' , master);
                }
                
else {
                    master[master.length] 
=  o.uniqueID;
                }
                inputs[i].onpropertychange 
=   function (){
                    
if  (event.propertyName  ==   ' checked ' ) {
                        
var  arro  =   this .getAttribute( ' groupmaster ' );
                        
var  i  =   0 ;
                        
while  (i  <  arro.length) {
                            _setState(document.getElementById(arro[i]));
                            i
++ ;
                        }
                    }
                }
            }
        }
        i
++ ;
    }
    
return  items;
}

function  _setState(o){
    
var  master  =  o;
    
if (master != null ){
        
var  chkselall  =   true ;
        
var  chknosel  =   true ;
        
var  groupmember  =  master.getAttribute( ' groupmember ' );
        
var  i  =   0 ;
        
while (i < groupmember.length){
            
if (chkselall)chkselall  =  groupmember[i].checked;
            
if (chknosel)chknosel  =   ! groupmember[i].checked;
            i
++ ;
        }
        
if (master.tagName.toLowerCase()  ==   ' input ' && master.type == ' checkbox ' ){
            
if  (chkselall) {
                master.indeterminate 
=   false ;
                master.checked 
=   true ;
            }
            
if  (chknosel) {
                master.indeterminate 
=   false ;
                master.checked 
=   false ;
            }
            
if ( ! chkselall &&! chknosel)master.indeterminate  =   true ;
        }
        
else {
            master.disabled 
=  chknosel;
        }
    }
}

window.attachEvent(
' onload ' ,CheckboxGroup);
<script type="text/javascript"> function CheckboxGroup(){ var arrelement = document.all; var i=0; while(i
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
A:以下是一个简单的实现: HTML: ``` <div class="tabs"> <div class="tab-headers"> <div class="tab-header active" data-tab="tab1">Tab 1</div> <div class="tab-header" data-tab="tab2">Tab 2</div> <div class="tab-header" data-tab="tab3">Tab 3</div> <div class="select-all"> <input type="checkbox" id="select-all" /> <label for="select-all">全选</label> </div> </div> <div class="tab-content active" data-tab="tab1"> <div class="checkboxes"> <div> <input type="checkbox" name="tab1-checkbox" id="tab1-checkbox-1" /> <label for="tab1-checkbox-1">Checkbox 1</label> </div> <div> <input type="checkbox" name="tab1-checkbox" id="tab1-checkbox-2" /> <label for="tab1-checkbox-2">Checkbox 2</label> </div> </div> </div> <div class="tab-content" data-tab="tab2"> <div class="checkboxes"> <div> <input type="checkbox" name="tab2-checkbox" id="tab2-checkbox-1" /> <label for="tab2-checkbox-1">Checkbox 1</label> </div> <div> <input type="checkbox" name="tab2-checkbox" id="tab2-checkbox-2" /> <label for="tab2-checkbox-2">Checkbox 2</label> </div> </div> </div> <div class="tab-content" data-tab="tab3"> <div class="checkboxes"> <div> <input type="checkbox" name="tab3-checkbox" id="tab3-checkbox-1" /> <label for="tab3-checkbox-1">Checkbox 1</label> </div> <div> <input type="checkbox" name="tab3-checkbox" id="tab3-checkbox-2" /> <label for="tab3-checkbox-2">Checkbox 2</label> </div> </div> </div> </div> ``` CSS: ``` .tabs { border: 1px solid #ccc; margin: 20px; } .tab-headers { display: flex; } .tab-header { cursor: pointer; padding: 10px; background-color: #f2f2f2; border-right: 1px solid #ccc; flex-grow: 1; text-align: center; } .tab-header.active { background-color: #ccc; } .select-all { margin-left: auto; display: flex; align-items: center; padding: 10px; } .select-all label { margin-left: 5px; } .tab-content { display: none; padding: 10px; } .tab-content.active { display: block; } .checkboxes { display: flex; flex-direction: column; } .checkboxes div { margin: 5px 0; } ``` JavaScript: ``` const tabHeaders = document.querySelectorAll('.tab-header'); const tabContents = document.querySelectorAll('.tab-content'); const checkboxes = document.querySelectorAll('input[type="checkbox"]'); // Show the first tab by default tabHeaders[0].classList.add('active'); tabContents[0].classList.add('active'); // Add event listeners to tab headers for (let i = 0; i < tabHeaders.length; i++) { tabHeaders[i].addEventListener('click', function() { // Remove active class from all tab headers and tab contents for (let j = 0; j < tabHeaders.length; j++) { tabHeaders[j].classList.remove('active'); tabContents[j].classList.remove('active'); } // Add active class to the clicked tab header and corresponding tab content this.classList.add('active'); document.querySelector(`.tab-content[data-tab="${this.dataset.tab}"]`).classList.add('active'); }); } // Add event listener to "全选" checkbox document.querySelector('#select-all').addEventListener('change', function() { for (let i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = this.checked; } }); // Add event listeners to tab checkboxes for (let i = 0; i < checkboxes.length; i++) { checkboxes[i].addEventListener('change', function() { // Get the tab content element that the checkbox is in const tabContent = this.closest('.tab-content'); // Get all checkboxes in the same tab and check if they're all checked const tabCheckboxes = tabContent.querySelectorAll('input[type="checkbox"]'); let allChecked = true; for (let j = 0; j < tabCheckboxes.length; j++) { if (!tabCheckboxes[j].checked) { allChecked = false; break; } } // Update "所有的tab页面相同复选" checkbox const allTabCheckboxesChecked = document.querySelectorAll(`.tab-content[data-tab="${tabContent.dataset.tab}"] input[type="checkbox"]:checked`); document.querySelector(`.tab-header[data-tab="${tabContent.dataset.tab}"] input[type="checkbox"]`).checked = allTabCheckboxesChecked.length === tabCheckboxes.length; // Update "全选" checkbox const allCheckedBoxes = document.querySelectorAll('input[type="checkbox"]:checked'); document.querySelector('#select-all').checked = allCheckedBoxes.length === checkboxes.length; }); } ``` 这段代码实现了一个基本的 tabs 组件,它包含多个选项卡,每个选项卡内部有多个复选框。全选复选框可以选择所有复选框,每个选项卡内的复选框状态更改会联动到该选项卡的“所有的tab页面相同复选”复选框,而所有选项卡的复选框状态更改又会联动到“全选”复选框
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值