Web APIs---DOM-事件基础

130 阅读2分钟

事件

事件监听

  1. 什么是事件?

    指在编程时系统内发生的动作或者事情。比如用户在网页上单击一个按钮,在键盘按下一个按钮

  2. 什么是事件监听?

    就是让程序检测是否有事件产生,一旦事件触发,就立即做出响应,也称为 注册事件

  3. 语法及使用

    <style>
        p{
            display: block;
            width: 300px;
            height: 300px;
            background-color: pink;
            margin: 100 auto;
        }
    </style>
</head>
<body>
    <button class="b1">点击抽奖</button>
    <button class="b2">点击抽奖</button>
    <p></p>
    <script>
        // 语法:元素.addEventListener('事件', 要执行的函数)


        // 获取表单元素
        let b1 = document.querySelector('.b1')
        // 添加监听事件  鼠标点击效果 click
        b1.addEventListener('click',function () {
            // 鼠标点击后的会出发什么
            alert('恭喜中奖')
        })

        let b2 = document.querySelector('.b2')

        b2.addEventListener('click',function () {
            alert('谢谢参与')
        })


        // mouseover 表示鼠标移入
        let pDom = document.querySelector('p')

        pDom.addEventListener('mouseover',function () {
            alert('今天天气真好')
        })
    </script>
  1. 批量给标签绑定事件
 <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
      <li>9</li>
      <li>10</li>
    </ul>
    <script>
      // 点击每一个li标签 都可以输出 你好

      // 获取li标签数组
      let liList=document.querySelectorAll("li");

      // 循环
      for (let index = 0; index < liList.length; index++) {

        // 给每一个li标签绑定点击事件
        liList[index].addEventListener("click",function () {
          console.log("你好");
        })
        
      }
      
    </script>
  </body>
  1. 事件监听三要素

    事件源: 那个dom元素被事件触发了(获取dom元素)

    事件: 用什么方式触发(是鼠标单击 click、还是鼠标经过 mouseover 等)

    事件调用的函数(处理程序): 要做什么事(弹窗还是修改样式等)

拓展阅读-事件监听版本

​ DOM L0

​ 事件源.on事件 = function() { }

​ DOM L2

​ 事件源.addEventListener(事件, 事件处理函数)

​ 发展史:

​ DOM L0 :是 DOM 的发展的第一个版本; L:level ​ DOM L1:DOM级别1 于1998年10月1日成为W3C推荐标准 ​ DOM L2:使用addEventListener注册事件 ​ DOM L3: DOM3级事件模块在DOM2级事件的基础上重新定义了这些事件,也添加了一些新事件类型

事件类型

  1. 鼠标事件(鼠标触发)

    ​ click 鼠标点击

    ​ mouseenter/mouseover 鼠标经过

    ​ mouseleave/mouseout 鼠标离开

  2. 焦点事件(表单获得光标)

    ​ focus 获得焦点

    ​ blur 失去焦点

  3. 键盘事件(键盘触发)

    ​ Keydown 键盘按下触发

    ​ Keyup 键盘抬起触发

  4. 文本事件(表单输入触发)

    ​ input 用户输入事件

    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      div {
        width: 200px;
        height: 200px;
        background-color: aqua;
      }
    </style>
  </head>
  <body>
    <div></div>

    <!-- 只有表单 元素 有获得焦点 失去焦点事件 -->
    <input type="text" />
    <script>
      // 获取div元素
      let div = document.querySelector('div');
      let input = document.querySelector('input');

      // 绑定不同的事件
      // div.addEventListener("click",function () {
      //   console.log("click 鼠标点击事件");
      // })
		
      // 鼠标经过元素
      // div.addEventListener("mouseenter",function () {
      // console.log("mouseenter 鼠标经过");
      // })

      // 鼠标离开元素
      // div.addEventListener("mouseleave",function () {
      // console.log("mouseleave 鼠标离开");
      // })

      // 鼠标经过
      // div.addEventListener("mouseover",function () {
      //   console.log("mouseover 鼠标经过");
      // })

      // 鼠标离开
      // div.addEventListener("mouseout",function () {
      //   console.log("mouseout 离开");
      // })

      // 获得焦点
      // input.addEventListener("focus",function () {
      //   console.log("输入框 获得焦点 ");
      //   document.body.style.backgroundColor='#000'
      // })

      // // 失去焦点 
      // input.addEventListener("blur",function () {
      //   console.log("输入框 失去焦点");
      //   document.body.style.backgroundColor='#fff'
      // })

      // 键盘按下事件 div不行 表单可以 
      // 给body标签添加比较多
      // document.body.addEventListener("keydown",function () {
        // console.log("keydown 按下");
      // })

      // 键盘抬起
      // document.body.addEventListener("keyup",function () {
      //   console.log("keyup 抬起");
      // })
      
      // 输入事件 输入框
      // input.addEventListener("input",function () {
      //   console.log("只要你在我的输入框输入了内容,我就触发");
      // })
    </script>
  </body>

环境对象

介绍

环境对象指的是函数内部特殊的变量 this ,它代表着当前函数运行时所处的环境

使用

函数的调用方式不同,this 指代的对象也不同,谁调用, this 就是谁

<body>
    <div>
        <img src="./imgs/01.png" alt="" class="close">
        <img src="./imgs/02.png" alt=""  class="erweima">
    </div>

    <script>
        // 获取dom元素
        let close = document.querySelector('.close')
        let erweima = document.querySelector('.erweima')
        // 绑定点击事件
        close.addEventListener('click',function () {
            this.parentNode.style.display='none'
        })
    </script>
</body>

编程思想

排他思想

​ 使用:

​ 干掉所有人(使用for循环)

​ 复活他自己(通过this或者下标找到自己或者对应的元素)

<body>
    <ul>
        <li>我是1</li>
        <li>我是2</li>
        <li>我是3</li>
        <li>我是4</li>
        <li>我是5</li>
        <li>我是6</li>
    </ul>

    <script>
        /* 
        排他思想的应用 
        1、获取dom元素数组
        2、遍历数组
        3、绑定数组的每个元素的事件
        4、再循环一遍把原有样式去除
        5、再设置自己需要的样式
        */

        let liList = document.querySelectorAll('li')

        for (let i = 0; i < liList.length; i++) {
            liList[i].addEventListener('click',function () {
                for (let j = 0; j < liList.length; j++) {
                    liList[j].style.color='black'
                    
                }
                this.style.color='#fff'
            })
            
        }
    </script>
</body>

字符串的长度

字符串数组的特点

  1. 拥有数组的长度 length

  2. 可以使用下标索引,获取到对应的值,例如:let str="你们好呀"; str[0]=你 str[1]=们

  3. 可以跟数组一样遍历

  4. 不能使用.push等方法来添加及修改数组

综合案例

商品单选-控制全选

<!DOCTYPE html>

<html>

<head lang="en">
    <meta charset="UTF-8" />
    <title>01-全选商品</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>

        // 获取dom元素
        let checkAll = document.querySelector("#checkAll")
        let ckList = document.querySelectorAll('.ck')


        // 遍历数组
        checkAll.addEventListener('click',function () {
            // 获取数组的值
            for (let index = 0; index < ckList.length; index++) {
                // kList[index]的选中状态 = checkAll 的选中状态
                ckList[index].checked = checkAll.checked
                
            }
        })


        // 遍历数组
        for (let index = 0; index < ckList.length; index++) {
            // 批量绑定 ckList 数组里的每一个值的点击事件
            ckList[index].addEventListener('click',function () {

                let checked = allChecked()
                // checkAll的选中状态 =checkAll 的选中状态
                checkAll.checked = checked
            })
            
        }

        
        // 函数封装
        function allChecked() {
            // 定义一个空数量的变量,用来装商品总数
            let num = 0
            // 遍历ckList数组
            for (let index = 0; index < ckList.length; index++) {
                // 判断每一个单选框的选中状态
                // 如果单选框被选中,那么num做++
                if (ckList[index].checked) {
                    num++                   
                }
            }
                // 判断数量与数组长度间的关系
                if (num === ckList.length) {
                    return true
                }else {
                    return false
                
            }
        }
    </script>
</body>

</html>

购物车加减操作

<body>
    <h1>1</h1>
    <button class="up">+</button>
    <button class="down" disabled>-</button>

    <script>
        let hDom = document.querySelector('h1')
        let up = document.querySelector('.up')
        let down = document.querySelector('.down')

        // 绑定 +号按钮 点击事件
        up.addEventListener('click',function () {
            // 每点一次 +号按钮 h1文本内容数字加1
            hDom.innerText++
            // 点击恢复 -号按钮 的使用
            down.disabled = false
        })
        
        // 绑定 -号按钮 点击事件
        down.addEventListener('click',function () {
            hDom.innerText--
            // hDom.innerText是字符串类型   所以在做判断的时候不能使用 === 
            if (hDom.innerText == 1) {
                down.disabled = true
            }
        })
    </script>
</body>

Tab栏切换

<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title></title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }

      ul {
        list-style: none;
      }

      .wrapper {
        width: 1000px;
        height: 475px;
        margin: 0 auto;
        margin-top: 100px;
      }

      .tab {
        border: 1px solid #ddd;
        border-bottom: 0;
        height: 36px;
        width: 320px;
      }

      .tab li {
        position: relative;
        float: left;
        width: 80px;
        height: 34px;
        line-height: 34px;
        text-align: center;
        cursor: pointer;
        border-top: 4px solid #fff;
      }

      .tab span {
        position: absolute;
        right: 0;
        top: 10px;
        background: #ddd;
        width: 1px;
        height: 14px;
        overflow: hidden;
      }

      .products {
        width: 1002px;
        border: 1px solid #ddd;
        height: 476px;
      }

      .products .main {
        float: left;
        display: none;
      }

      .products .main.active {
        display: block;
      }

      .tab li.active {
        border-color: red;
        border-bottom: 0;
      }
    </style>
  </head>

  <body>
    <div class="wrapper">
      <ul class="tab">
        <li class="tab-item active">国际大牌<span></span></li>
        <li class="tab-item">国妆名牌<span></span></li>
        <li class="tab-item">清洁用品<span></span></li>
        <li class="tab-item">男士精品</li>
      </ul>
      <div class="products">
        <div class="main active">
          <a href="###"><img src="imgs/guojidapai.jpg" alt=""/></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/guozhuangmingpin.jpg" alt=""/></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/qingjieyongpin.jpg" alt=""/></a>
        </div>
        <div class="main">
          <a href="###"><img src="imgs/nanshijingpin.jpg" alt=""/></a>
        </div>
      </div>
    </div>

    <script>

      let tabItem = document.querySelectorAll('.tab-item')

      let main = document.querySelectorAll('.main')

        // 遍历第一遍,获取tabItem数组的每一个li
      for (let i = 0; i < tabItem.length; i++) {
        // 给tabItem数组的每一个li绑定点击事件
        tabItem[i].addEventListener('click',function () {
          // 遍历第二遍,去除li身上原有的样式
          for (let j = 0; j < tabItem.length; j++) {
            tabItem[j].style.borderColor='#fff'
            
          }
          // 单独添加自身样式
          this.style.borderColor='red'
          // 遍历第三遍,获取main数组的所有div,并去除原有样式
          for (let index = 0; index < main.length; index++) {
          main[index].classList.remove('active')
          
        }
        //main[i] i 就是被点击li标签的下标
        main[i].classList.add('active')
        })
      }
    </script>
  </body>
</html>