js中事件绑定和复选框全选的几种实现思路

1,269 阅读4分钟

1. 事件绑定

事件是指系统内发生的动作或者发生的事情,例如用户在网页上单击了一个按钮,一旦事件触发,就立即调动一个函数做出响应,也叫注册事件

事件监听的三大要素是:

  • 事件源:要获取的dom元素
  • 事件:click,mouseover等,事件要加引号
  • 事件调用的函数:function()
事件监听的版本:

老版本是事件源.on事件=function(),新版本是事件源.addEvenListence('事件',function(){})。老版本有一些比较大的限制性,例如不允许给事件绑定同名事件,如果做了那么后面绑定的事件会将前面绑定的事件覆盖;同时它不能设置什么阶段触发事件。新版本的方法有兼容性问题,不过只是不支持IE9以下的,所以影响不大。

事件类型:
  • 鼠标类型:click,mosueenter鼠标经过,mouseleave鼠标离开
  • 焦点事件:focus获得焦点,blur失去焦点
  • 键盘事件:keydown键盘按下,keyup键盘抬起
  • 文本事件:input用户输入事件

2. 实现全选反选操作的几种思路

1.全选思路:

选中全选框,然后把全选框这个元素的checked状态赋予给下面的复选框,由于checked属性的返回值为选中为true,没选中为false,所以方便了赋值和判断操作。

Snipaste_2022-01-19_15-37-40.png

实现代码:

//获取id为checkAll的input全选框标签元素
let checkAll = document.querySelector('#checkAll')
//获取类名为all的span文字标签元素
let all = document.querySelector('.all')
//获取3个类名为ck的input复选框标签元素
let checks = document.querySelectorAll('.ck')
​
// 全选状态赋予下面所有复选框
checkAll.addEventListener('click', function () {
  let state = checkAll.checked
  // 全选框checked状态为true就设置文字‘全选’,否则显示‘取消’
  all.innerText = state ? '全选' : '取消'
  for (let i = 0; i < checks.length; i++) {
  //把全选框的checked值给这个复选框的checked
  checks[i].checked = state 
 }
})
2.反选思路一:

取消选中复选框让全选框取消选中或选中所有复选框让全选框选中,实现这个功能的主要思路是通过for循环给每个复选框绑定一个点击事件,然后判断每个复选框是否为选中或未选中。而实现具体的判断复选框状态有几种思路。

第一种思路是声明一个flag变量true,然后通过嵌套的for循环遍历获取到的伪数组里每个复选框的checked值是否为false,有一个为false就覆盖改变flag的值为false,并赋予给全选框的checked的值。

//外面的for循环遍历给每个复选框添加点击事件绑定,程序一开始就运行,addEventListener全部添加完就已经结束了
// 此时如果点击动作发生,程序从addEventListener事件开始运行,而不是每一次点击都从for循环开始。
for (let i = 0; i < checks.length; i++) {
    checks[i].addEventListener('click', function () {
    console.log(checks[i]);
    //这里flag的位置要放在这里,让它点击一次才声明一次为true
    let flag = true
// 遍历每个复选框看是否有一个为非选中,是就全选框为false,否则使用默认值flag=true
    for (let j = 0; j < checks.length; j++) {
      if (checks[j].checked == false) {
      flag = false
      }
     }
      checkAll.checked = flag
// 复选框flag的状态为true就设置上面文字‘全选’,否则显示‘取消’
      all.innerText = flag ? '全选' : '取消'
     })
    }
3.反选思路二:

第二种思路是把声明一个count变量为0,然后通过for循环遍历获取到的伪数组里每个复选框的值判断是否为true,是就count++得出checked为true的个数。然后判断count的数量是否等于伪数组.length,是就给全选框checked状态赋值为true,否则为false。

for (let i = 0; i < checks.length; i++) {
  checks[i].addEventListener('click', function () {
    let count = 0
    
    for (let j = 0; j < checks.length; j++) {
      //如果当前复选框checked为true,则给count加1
      if (checks[j].checked == true) {
        count++
      }
    }
    //判断count的true总数是否等于复选框数组的长度,等于就是都为选中的
    if (count == checks.length) {
      checkAll.checked = true
      all.innerText = '全选'
    } else {
      checkAll.checked = false
      all.innerText = '取消'
    }
  })
}
3.反选思路三:

第三种思路是通过document.querySelectorAll('.复选框类名:checked').length的方式直接获取复选框checked值为选中状态的伪数组长度,然后比较这个长度是否等于复选框整个伪数组的长度,直接省略了上面两个思路的for循环遍历。

for (let i = 0; i < checks.length; i++) {
  checks[i].addEventListener('click', function () {
    //获取复选框checked值为选中状态的伪数组长度
    //:checked是css里的伪元素
    let count = document.querySelectorAll('.ck:checked').length
    if (count == checks.length) {
      checkAll.checked = true
      all.innerText = '取消'
    } else {
      checkAll.checked = false
      all.innerText = '全选'
    }
  })
}

另外,如果把上面三种反选思路的for循环替换成foreach遍历也是一样的操作,遍历的代码也能更加简洁一点。