js之全选,反选,全不选案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>全选,反选,全不选案例</title>
</head>
<body>
<input type="checkbox" name="interest"> 篮球 <br>
<input type="checkbox" name="interest"> 读书 <br>
<input type="checkbox" name="interest"> 电影 <br>
<input type="checkbox" name="interest"> 阅读 <br>
<hr>
<input type="checkbox" id="selectAllOrNot" name="selectAllOrNot"> 全选/全不选
<button id="reverseSelection">反选</button>
</body>

<script>
    var interest = document.getElementsByName('interest');
    var selectAllOrNot = document.getElementById('selectAllOrNot');
    var reverseSelection = document.getElementById('reverseSelection');

    // onchange 是改变状态, 应用场景有三个地方: checkbox, 单选的select,  radio
    selectAllOrNot.onchange = function () {
        // 获取到当前所操作的 checkbox的状态, 值为true或者false
        var status = this.checked;
        // 让所有的interests的 checked 状态和 "全选/全不选" 状态保持一致。
        for (var i = 0; i < interest.length; i++) {
            interest[i].checked = status;
        }
    }

    var interestLenght = interest.length;

    //存在全部选择就把全选框自动勾上
    function isMax() {
        var num = 0;
        var interestLenght = interest.length;
        for (var j = 0; j < interestLenght; j++) {
            // 如果有一个被选中,num就 +1
            if (interest[j].checked) {
                num++;
            }
        }
        console.log('max');
        // 根据选中数量与总长度是否相同来确定"全选/全不选"最终的选中状态
        selectAllOrNot.checked = (num == interestLenght);
    }

    //循环的目的是给每个 interest 绑定改变事件。
    for (var i = 0; i < interestLenght; i++) {
        /**
         * 每次对每个 interest改变之后, 判断所有的 interest 的状态. 判断的思路
         * 是获取所有的选中的 interest 的数量, 然后与 interest的总数量做比较,如果
         * 数量相同表示都被选中, 那么"全选/全不选"就要被选中,如果数量不相同,那么"全选/全不选"就不选中
         */
        interest[i].onchange = isMax;//对事件赋值函数,只需要函数名
    }
    
    //反选事件
    reverseSelection.onclick = function () {
        console.log('dgf');
        for (var i = 0; i < interestLenght; i++) {
            interest[i].checked = !interest[i].checked;
        }
        isMax();//执行函数
    }
</script>
</html>

改进版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="checkbox" name="interest"> 篮球 <br>
<input type="checkbox" name="interest"> 读书 <br>
<input type="checkbox" name="interest"> 电影 <br>
<input type="checkbox" name="interest"> 阅读 <br>
<hr>
<input type="checkbox" id="selectAllOrNot" name="selectAllOrNot"> 全选/全不选
<button id="reverseSelection">反选</button>
</body>

<script>
    var interest = document.getElementsByName('interest');
    var selectAllOrNot = document.getElementById('selectAllOrNot');
    var reverseSelection = document.getElementById('reverseSelection')
    // onchange 是改变状态, 应用场景有三个地方: checkbox, 单选的select,  radio
    selectAllOrNot.onchange = function () {
        // 获取到当前所操作的 checkbox的状态, 值为true或者false
        var status = this.checked;
        // 让所有的interests的 checked 状态和 "全选/全不选" 状态保持一致。
        for (var i = 0; i < interest.length; i++) {
            interest[i].checked = status;
        }
    }

    var interestLenght = interest.length;

    //循环的目的是给每个 interest 绑定改变事件。
    for (var i = 0; i < interestLenght; i++) {

        /**
         * 每次对每个 interest改变之后, 判断所有的 interest 的状态. 判断的思路
         * 是获取所有的选中的 interest 的数量, 然后与 interest的总数量做比较,如果
         * 数量相同表示都被选中, 那么"全选/全不选"就要被选中,如果数量不相同,那么"全选/全不选"就不选中
         */
        interest[i].onchange = function () {
            var num = 0;
            for (var j = 0; j < interestLenght; j++) {
                // 如果有一个被选中,num就 +1
                if (interest[j].checked) {
                    num++;
                }
            }
            // 根据选中数量与总长度是否相同来确定"全选/全不选"最终的选中状态
            selectAllOrNot.checked = (num == interestLenght);
        }
    }
//反选操作
    reverseSelection.onclick = function () {
        var flag = true;
        for (var j = 0; j < interestLenght; j++) {
//各个选择的反选逻辑操作,true取false,false取true
            if (interest[j].checked) {
                flag=false;//在反选时,当有一个选项打钩,那么反选后,必定不会全部都被勾上,所以也不需要自动勾上全选框
                interest[j].checked=false;
            }else{
                interest[j].checked=true;
            }
        }
        selectAllOrNot.checked=flag;//interest[j]全为true就为true,有一个为false那么就为false。
    }

</script>
</html>

效果图

Don't just say it. Show me your code.
原文地址:https://www.cnblogs.com/bigbeardhk/p/12765388.html