事件/相关

67 阅读2分钟

事件

事件:用户执行的操作

语法
元素.addEVentListener('事件',要执行的函数)

事件监听

监听用户是否进行了某个操作

事件源(谁被触发了)

事件类型(用什么方式触发,点击还是鼠标经过等)

事件处理程序(要做什么事情)

事件处理函数

如果监听到用户真的进行某个操作,我们就进行相应处理

补充

我们只是传递一个当事件触发之后的处理函数,但是函数并不是开发者直接调用的,而是事件处理机制监听到事件触发之后再调用的

事件类型

click:鼠标单击

dblclick:鼠标双击

mouseenter:鼠标进入,当鼠标进入到该元素的范围就会自动触发

mouseleave:鼠标离开,鼠标离开该元素的范围就会自动触发

keydown:按键按下自动触发

keyup:按键松开自动触发

focus:文本框聚焦事件,文本框获取焦点,焦点就是光标点

blur:文本框失焦事件,只要失焦就会触发,不关注内容是否变化

input:文本输入框内容变化时,只要内容变化就会触发

change:普通的输入框:内容改变同时失焦;对于file:文件选择完毕之后

事件的其他绑定方式

语法
元素.on类型 = 处理函数
案例
<button>点我啊</button>
<script>
      let btn = document.querySelector('button')
​
      btn.onclick = function() {
         console.log(123)
      }
      // 如果为元素重复绑定同一个事件,那么后面绑定的事件将前面绑定的事件覆盖--不允许为元素绑定同名事件
       btn.onclick = function() {
         console.log(456)
       }
</script>
综合案例
随机点名
<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>05-随机点名-进阶版</title>
  <style>
    p {
      width: 200px;
      height: 100px;
      border: 1px solid red;
    }
  </style>
</head><body>
  <p>这里显示名字</p>
  <button class="start">开始随机点名</button>
  <button class="end">结束随机点名</button>
​
  <script>
    // <!-- 模拟数据 -->
    let arr = ['刘备', '关羽', '张飞', '赵云', '马超', '黄忠']
​
    // 获取三个元素
    let start = document.querySelector('.start')
    let end = document.querySelector('.end')
    let p = document.querySelector('p')
    let timeId
    let index
​
    // 绑定单击事件,对随机获取名字进行渲染
    start.addEventListener('click', function () {
      // 添加定时器
      timeId = setInterval(function () {
        // 生成一个随机索引
        index = parseInt(Math.random() * arr.length)
        // 根据索引获取名字
        let name = arr[index]
        // 渲染到p元素
        p.innerText = name
      }, 100)
    })
​
    // 绑定单击事件,对结束标签进行渲染
    end.addEventListener('click', function () {
      // 关闭定时器
      clearInterval(timeId)
      // 删除元素
      arr.splice(index, 1)
    })
  </script>
</body></html>
购物车加减案例
<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>11-购物车加减操作</title>
  <style>
    div {
      width: 80px;
    }
​
    input[type='text'] {
      width: 50px;
      height: 44px;
      outline: none;
      border: 1px solid #ccc;
      text-align: center;
      border-right: 0;
    }
​
    input[type='button'] {
      height: 24px;
      width: 22px;
      cursor: pointer;
    }
​
    input {
      float: left;
      border: 1px solid #ccc;
    }
  </style>
</head><body>
  <div>
    <input type="text" id="total" value="1" readonly />
    <input type="button" value="+" id="add" />
    <input type="button" value="-" id="reduce" />
  </div>
  <script>
    // 获取元素
    let total = document.querySelector('#total')
    let add = document.querySelector('#add')
    let reduce = document.querySelector('#reduce')
​
    // 为+号做绑定单击事件
    add.addEventListener('click', function () {
      // 获取输入框的数量
      let count = total.value
      // 每次单击都可以数量+1
      count++
      // 重新赋值给输入框
      total.value = count
      // 单击时,将-号的禁用按钮解除
      reduce.disabled = false
    })
​
    // 为-号做绑定单击事件
    reduce.addEventListener('click', function () {
      // 获取输入框的数量
      let count = total.value
      // 每次单击都可以数量+1
      count--
      // 重新赋值给输入框
      total.value = count
      // 判断数量是否等于1,如果是1则禁用按钮
      if (count === 1) {
        reduce.disabled = true
      }
    })
  </script>
</body></html>
全选反选案例
<!DOCTYPE html>

<html>

<head lang="en">
  <meta charset="UTF-8" />
  <title>10-全选反选案例</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    table {
      border-collapse: collapse;
      border-spacing: 0;
      border: 1px solid #c0c0c0;
      width: 500px;
      margin: 100px auto;
      text-align: center;
    }

    th {
      background-color: #09c;
      font: bold 16px '微软雅黑';
      color: #fff;
      height: 24px;
    }

    td {
      border: 1px solid #d0d0d0;
      color: #404060;
      padding: 10px;
    }

    .allCheck {
      width: 80px;
    }
  </style>
</head>

<body>
  <table>
    <tr>
      <th class="allCheck">
        <input type="checkbox" name="" id="checkAll" />
        <span class="all">全选</span>
      </th>
      <th>商品</th>
      <th>商家</th>
      <th>价格</th>
    </tr>
    <tr>
      <td>
        <input type="checkbox" name="check" class="ck" />
      </td>
      <td>小米手机</td>
      <td>小米</td>
      <td>¥1999</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox" name="check" class="ck" />
      </td>
      <td>小米净水器</td>
      <td>小米</td>
      <td>¥4999</td>
    </tr>
    <tr>
      <td>
        <input type="checkbox" name="check" class="ck" />
      </td>
      <td>小米电视</td>
      <td>小米</td>
      <td>¥5999</td>
    </tr>
  </table>
  <script>
    // 获取元素
    let all = document.querySelector('.all')
    let checkAll = document.querySelector('#checkAll')
    let ck = document.querySelectorAll('.ck')

    // console.log(all, checkAll, ck);
    // 让全选复选框与其它复选框状态相等
    // 给全选复选框绑定单击事件
    checkAll.addEventListener('click', function () {
      // 获取当前全选复选框经过绑定状态后的状态
      let state = checkAll.checked
      // 伪数组需要遍历,将全选复选框的状态赋值给其它复选框,达成状态相等
      ck.forEach(function (ele, index) {
        ele.checked = state
      })
      // 设置文本内容
      // 如果是全选状态,就是取消,否则是全选
      all.innerText = state ? '取消' : '全选'
    })
    // 遍历每一个复选框
    for (let i = 0; i < ck.length; i++) {
      // 为每一个复选框绑定单击事件
      ck[i].addEventListener('click', function () {
        // 声明一个变量值 假设全选复选框的状态为选中
        let flag = true
        // 循环遍历其它复选框
        ck.forEach(function (v, i) {
          // 判断,当每个复选框的状态没有全部选中,全选复选框的状态也不会选中
          if (v.checked === false) {
            flag = false
          }
        })
        // 将是否全选中的状态赋值给全选复选框
        checkAll.checked = flag

      })
    }
  </script>
</body>

</html>