• JS7day(事件对象,事件流,事件捕获和冒泡,阻止事件流动,事件委托)


    事件对象

    获取事件对象

    • 事件对象是什么?
      也是个对象,这个对象里有事件触发时的相关信息
      例如:鼠标点击事件中,事件对象就存了鼠标点在哪个位置等信息

    • 如何获取?
      在事件绑定的回调函数的第一个参数就是事件对象
      一般命名为eventeve
      在这里插入图片描述

    部分常用属性

    • type
       获取当前的事件类型
    • clientX/clientY
       获取光标相对于浏览器可见窗口左上角的位置
    • offsetX/offsetY
       获取光标相对于当前DOM元素左上角的位置
    • key
       用户按下的键盘键的值
       现在不提倡使用keyCode(已废弃)
      在这里插入图片描述
            img {
                position: absolute;
                top: 0;
                left: 0;
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    img要用到绝对定位

        <img src="./images/tianshi.gif" alt="">
        <script>
            let img = document.querySelector('img')
            document.addEventListener('mousemove', function (e) {
                // 不断得到当前的鼠标坐标
                // 把坐标给图片(别忘了单位)
                // img.style.left = '100px'
                img.style.left = e.pageX - 50 + 'px'
                img.style.top = e.pageY - 40 + 'px'
            })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    加上代码:

        area.addEventListener('keyup', function (e) {    //不要用keydown,键盘弹起的时候,再执行否则area里会接受enter字符,导致area.value=1
          if (e.key == 'Enter') {   //是enter键才行
            send.click()
          }
        })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    事件流

    • 事件流指的是事件完整执行过程中的流动路径:先捕获后冒泡
      在这里插入图片描述

    事件捕获概念:

    从DOM的根元素开始去执行对应的事件 (从外到里)

    • 事件捕获需要写对应代码才能看到效果
    • 代码:
    DOM.addEventListener(时间类型,事件处理函数,是否使用捕获机制)
    
    • 1
    • 说明:
      addEventListener第三个参数传入true代表是捕获阶段触发(很少使用
      若传入false代表冒泡阶段触发,默认就是false
      若是用 L0 事件监听,则只有冒泡阶段,没有捕获

    事件冒泡概念:

    当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素依次被触发。这一过程被称为事件冒泡
    简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的同名事件
    事件冒泡是默认存在的
    案例:

        <script>
            let fa = document.querySelector('.father')
            let son = document.querySelector('.son')
            son.addEventListener('click', function () {
                alert('我是儿子')
            })
            fa.addEventListener('click', function () {
                alert('我是爸爸')
            })
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    点击儿子区域,依次弹出:我是儿子,我是爸爸(传入true,则相反)
    在这里插入图片描述

    阻止事件流动:

    因为默认就有冒泡模式的存在,所以容易导致事件影响到父级元素

    • 若想把事件就限制在当前元素内,就需要阻止事件流动
    • 阻止事件流动需要拿到事件对象
    • 语法:
    事件对象.stopPropagation()
    
    • 1
    • 此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效
      示例:
        <script>
            let fa = document.querySelector('.father')
            let son = document.querySelector('.son')
            fa.addEventListener('click', function () {
                alert('我是爸爸')
            })
            son.addEventListener('click', function (e) {
                alert('我是儿子')
                e.stopPropagation()
            })
       </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    点击儿子区域,只弹出:我是儿子。

    相同的鼠标经过事件:

    mouseovermouseout 会有冒泡效果
    mouseentermouseleave 没有冒泡效果(推荐)

        <script>
            let fa = document.querySelector('.father')
            let son = document.querySelector('.son')
            fa.addEventListener('mouseover', function () {
                console.log(111)
            })
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    鼠标在父元素内,在父元素和子元素之间移动,会不断输出:111(改成mousenter就好了)
    在这里插入图片描述

    两种(监听事件)注册事件的区别:

    传统on注册(L0)

    • 同一个对象,后面注册的事件会覆盖前面注册的事件(同一个事件)
    • 直接=null(比如btn.onclick=null),就可以实现事件的解绑
    • 都是冒泡阶段执行的

    事件监听注册(L2)

    • 语法: addEventListener(事件类型, 事件处理函数, 是否使用捕获)
    • 后面注册的事件不会覆盖前面注册的事件(同一个事件)
    • 可以通过第三个参数去确定是在冒泡或者捕获阶段执行
    • 如果要事件解绑,必须使用removeEventListener(事件类型, 事件处理函数, 获取捕获或者冒泡阶段)
    • 匿名函数无法被解绑
        btn.addEventListener('click', add)
        function add() {   //给函数起名字,匿名函数无法解绑
            alert('第一次')
        }
        btn.removeEventListener('click', add)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    事件委托

    事件委托是利用事件流的特征解决一些开发需求的知识技巧

    总结:

    • 优点:给父级元素加事件(可以提高性能)
    • 原理:事件委托其实是利用事件冒泡的特点
    • 实现:事件对象.target 可以获得真正触发事件的元素
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
        </ul>
        <script>
            let ul = document.querySelector('ul')
            ul.addEventListener('click', function (e) {
                (e.target.style.color = 'red')  //核心
            })
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

  • 相关阅读:
    Linux系统编程基本命令
    @Transactional 注解 同一个类下的两个方法
    【数据库系统概论】触发器
    python使用matplotlib.pyplot画图时总会提示“内核似乎挂掉了,很快就会自动重启”
    工具清单 - CI & CD
    【Linux】冯诺依曼体系结构
    springboot 配置文件编写 自定义参数 配置提示功能 配置处理器
    cv::Mat 的常见操作方法
    DAY52 300.最长递增子序列 + 674. 最长连续递增序列 + 718. 最长重复子数组
    Spring学习之ImportBeanDefinitionRegistrar接口
  • 原文地址:https://blog.csdn.net/qq_44976531/article/details/125500589