JS的事件

60 阅读2分钟

* JS的事件

 * 什么是事件?
 *   + 一个事件的组成
 *     => 触发谁的事件:事件源
 *     => 触发什么事件: 事件类型
 *     => 触发后做什么: 事件处理函数
 *    
 * btn.onclick = function () {}
 * 
 *    触发谁的事件 -> btn -> 事件源就是btn
 *    触发什么事件 -> onclick -> 事件类型就是click(为什么不加上on ,先欠着,后续在解释)
 *    触发后做什么事 -> function () {} -> 这个事件的处理函数
 * 
 *    常见的事件(了解)
 *        浏览器事件
 *            onload:页面全部资源加载完毕
 *            onscroll: 浏览器页面滚动的时候
 *        鼠标事件
 *        键盘事件
 *        表单事件

* 鼠标事件

<div><div class="sBox"></div></div>

    // 0.获取元素
    var oDiv = document.querySelector('div')
  • 1.左键单击
    oDiv.onclick = function () {
      console.log('单击元素触发')
    }
  • 2.左键双击事件 300ms内连续点击两次鼠标
    oDiv.ondblclick = function () {
      console.log('双击元素时触发')
    }
  • 3.右键事件
     oDiv.oncontextmenu = function () {
      console.log('鼠标右键单击时触发')
    }
  • 4.鼠标按下事件 鼠标按下的时候触发(哪怕鼠标没有抬起也会触发)
    oDiv.onmousedown = function () {
      console.log('鼠标按下的时候触发')
    }
  • 5.鼠标抬起事件 鼠标左键抬起的时候触发
    oDiv.onmouseup = function () {
      console.log('鼠标抬起时触发')
    }
  • 6.鼠标移入事件 鼠标移入元素的时候触发 注意:移入子级盒子时,也会触发
    oDiv.onmouseover = function () {
      console.log('onmouseover 移入事件触发')
    }
  • 7.鼠标移出事件 鼠标移出的时候触发 注意:移入子级盒子,也会触发
    oDiv.onmouseout = function () {
      console.log('onmouseout 移出事件触发')
    }
  • 8.鼠标移入事件2 鼠标移入元素的时候触发 注意:移入子级盒子时,不会触发
    oDiv.onmouseenter = function () {
      console.log('onmouseenter 移入事件触发')
    }
  • 9.鼠标移出事件2 鼠标移出元素的时候触发 注意:移入子级盒子时,不会触发
    oDiv.onmouseleave = function () {
      console.log('onmouseleave 移出事件触发')
    }
  • 10.鼠标移动事件 鼠标在oDiv元素中移动的时候会触发
    oDiv.onmousemove = function () {
      console.log('鼠标移动事件触发~~~')
    }

* 键盘事件

 * 1.document 当前文档
 
 * 2.input    输入框
  • 1.键盘抬起事件
    document.onkeyup = function () {
      console.log('任意按下一个按键然后抬起时会触发')
    }
  • 2.键盘按下事件
    document.onkeydown = function () {
      console.log('键盘任意一个按键被按下时会触发')
    }
  • 3.键盘按下抬起事件
    document.onkeypress = function () {
      console.log('键盘任意按键按下抬起时会触发')
    }

* 表单事件

<input type="text">

    // 0.获取元素
    var inp = document.querySelector('input')
  • 1.获得焦点事件
    inp.onfocus = function () {
      console.log('当前文本框获得焦点')
    }
  • 2.失去焦点事件
    inp.onblur = function () {
      console.log('当前文本框失去焦点')
    }
  • 3.文本框内容改变时触发
    inp.onchange = function () {
      console.log('当前文本框内容改变')
    }
  • 4.文本框输入内容时触发
    inp.oninput = function () {
      console.log('当前文本框正在输入内容')
    }

* 选项卡案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
         * {
            padding: 0;
            margin: 0;
        }
        ul,ol {
            list-style: none;
        }
        .header {
            width: 600px;
            height: 50px;
            line-height: 50px;
            background-color: aqua;
            display: flex;
        }
        .header li {
            width: 200px;
        }
        .content {
            width: 600px;
            height: 400px;
            line-height: 400px;
            text-align: center;
            font-size: 100px;
        }
        .content li {
            display: none;
        }
        .header .active {
            background-color: orange;
        }
        .content .active {
        display: block;
        background-color: yellow;
        }
    </style>
</head>
<body>
<ul class="header">
    <li class="active">header_1</li>
    <li>header_2</li>
    <li>header_3</li>
</ul>
<ol class="content">
    <li class="active">content_1</li>
    <li>content_2</li>
    <li>content_3</li>
</ol>
<script>
/**
 * 需求:
 *    header:
 *      点击其中任意一个li的时候,给点击的li添加一个类名(active)
 *           然后给其他的li取消类名
 *    content:
 *      根据选中了header下的那个li,然后对应的展示自身的哪一个li
 * 
 *      给点击的li添加一个类名(active),然后给其他的li取消类名
 *          解决:1.给所有的li全都取消类名  2.给当前点击的li 添加一个类名
 *      根据选中了header下的那个li,然后对应的展示自身的哪一个li
 *        解决:1,给所有的li 全都取消类名;
 *              2、根据点击了header内的那个li,给对应顺序的li添加一个类名
 * */ 
/**
 * 补充:将伪数组转换为真实数组的方法
 *      伪数组:document.querySelectorAll('.header li')
 *      转换为真数组:[...伪数组]
 * 
 *      原理:欠着,ES6的时候会详细讲
 * */  
// 0.获取元素
var headerLi = [...document.querySelectorAll('.header li')] //获取header下的所有li以数组的方式展示
var contentLi = [...document.querySelectorAll('.content li')] //获取content下的所有li以数组的方式展示

// headerLi[0].onclick = function () {
//   // 给当前元素添加类名,给其他元素取消类名
// }
// headerLi[1].onclick = function () {
//   // 给当前元素添加类名,给其他元素取消类名
// }
// headerLi[2].onclick = function () {
//   // 给当前元素添加类名,给其他元素取消类名
// }


// 用遍历的方式完成上边的功能
// 1.实现header的功能
// headerLi.forEach(function(item) { //遍历header下的所有li
//   item.onclick = function () { //给header内部的每一个li添加一个点击事件
//     // console.log('点击了header内的li')
//     // 1.给所有的li取消类名
//     // headerLi[0].classList.remove('active')
//     // headerLi[1].classList.remove('active')
//     // headerLi[2].classList.remove('active')
//     headerLi.forEach(function (li) { //遍历header下的所有li
//       li.classList.remove('active')  //给所有的li取消类名
//     })
//     // 2.给当前点击的Li添加一个类名
//     item.classList.add('active')
//   }
// })

headerLi.forEach(function(item, index) { //遍历header下的所有li index是li对应的下标
  item.onclick = function () { //给header内部的每一个li添加一个点击事件
    // console.log('点击了header内的li')
    // 1.给所有的li取消类名
    headerLi.forEach(function (li, liIndex) { //遍历header下的所有li
      li.classList.remove('active')  //给所有的li取消类名
      /**
       * 因为header和content的li 数量一定是相同的
       * 所以我们可以省略一个forEach,利用一个循环,完成两个li 的取消类名
       *  contentLi[0].classList.remove('active')
          contentLi[1].classList.remove('active')
          contentLi[2].classList.remove('active')

       *  contentLi.forEach(function(li) {
            li.classList.remove('active')
          })
       * */ 
      contentLi[liIndex].classList.remove('active') //利用下标将content内部的li去掉类名
    })
    // 2.给当前点击的Li添加一个类名
    item.classList.add('active')
    // 根据点击的header里面的li给content里面的li添加类名
    contentLi[index].classList.add('active')
  }
})

headerLi.forEach(function(item, index) { //遍历header下的所有li index是li对应的下标
  item.onclick = function () { //给header内部的每一个li添加一个点击事件
    // 1.给所有的li取消类名
    headerLi.forEach(function (li, liIndex) { //遍历header下的所有li
      li.classList.remove('active')  //给所有的li取消类名
      contentLi[liIndex].classList.remove('active') //利用下标将content内部的li去掉类名
    })
    // 2.给当前点击的Li添加一个类名
    item.classList.add('active')
    // 根据点击的header里面的li给content里面的li添加类名
    contentLi[index].classList.add('active')
  }
})