事件委托

171 阅读2分钟

注册事件的方法

    1.点语法注册事件:     事件源.事件类型 = 事件处理函数
        * 特点:不能注册‘同名事件’, 否则会覆盖

    2.事件源.addEventListener('事件类型',事件处理函数)
        * 特点:可以注册多个‘同名事件’,依次触发

移除事件

    1.点语法:
        * 事件源.事件类型=null
    2.addEventListener方法
        * let fn = 事件源.addEventListener('事件类型',事件处理函数)
          移出:事件源.addEventListener('事件类型',fn)

阻止默认事件(form,a)

代码格式:给事件函数加个形参event或ev或e 函数体:e.preventDefault()

<!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>

    </style>
</head>

<body>
    <!-- 点击a标签:默认会跳转href网页 -->
    <a href="http://www.baidu.com">跳转到百度</a>
    <!-- 点击form里面的按钮,默认会跳转action网页 -->
    <form action="http://www.itheima.com">
        <input class="username" type="text" placeholder="请输入用户名">
        <br>
        <input class="password" type="text" placeholder="请输入密码">
        <br>
        <button class="btn">登录</button>
    </form>

    <script>
        let btn = document.querySelector('.btn')
        let a = document.querySelector('a')

        btn.onclick = function (e) {
            e.preventDefault()
            alert('111')
        }
        a.onclick = function (e) {
            e.preventDefault()
            alert('222')
        }
    </script>
</body>

</html>

事件对象

      1.事件对象 : 是存储与事件相关的对象。
        * 当用户触发事件的时候,浏览器会自动捕捉触发时(鼠标坐标和键盘按键)的信息,存入对象中。这个对象称之为事件对象。
      2.如何获取事件对象 :  给事件处理函数添加形参  event  ev  e
      3.事件对象常用属性 : 
          * e.pageX / e.pageY 获取鼠标触发点距页面左上角的距离
          * e.target 获取鼠标点击的元素

事件委托

    事件委托:给父元素注册事件委托子元素完成
    事件委托原理:事件冒泡
    事件目标获取:e.target
<!DOCTYPE html>

<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>Document</title>
</head>

<body>
  <button class="btn">点我新增一行li元素</button>
  <ul>
    <li>我是班长1</li>
    <li>我是班长2</li>
    <li>我是班长3</li>
    <li>我是班长4</li>
    <li>我是班长5</li>
    <li>我是班长6</li>
  </ul>

  <script>
    //需求: 点击页面每一个li元素,自己的颜色修改为红色
    let ul = document.querySelector('ul')
    let btn = document.querySelector('.btn')

    btn.onclick = function () {
      let newLi = document.createElement('li')
      newLi.innerText = '我是新来的'
      ul.appendChild(newLi)
    }
    ul.onclick = function (e) {
      console.log(e.target)
      e.target.style.backgroundColor = 'red'
    }
  </script>
</body>

</html>

事件冒泡

    事件冒泡:当子元素触发时,所有父元素同名的事件都会依次触发
    顺序:子元素->父元素->body->html->document->window(整个网页窗口)

事件捕获

  事件捕获 : 当触发子元素的事件时候,先从最顶级父元素,一级一级往里触发
        规则:  window->document->html->body->父元素->子元素

  默认情况下,所有的注册事件都是冒泡事件。 只有唯一一种方式可以注册捕获事件:
        元素.addEventListener('事件类型',事件处理函数,true)

事件流的三个阶段

阻止事件流:给函数体加 e.eventPhase

    事件捕获
    目标阶段
    事件冒泡