webAPI事件流

98 阅读3分钟

webAPI第六天

事件流

事件流指的是事件完整执行过程中的流动路径

简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父

事件冒泡:

当一个元素触发事件后,会依次向上调用所有父级元素的同名事件

事件冒泡是默认存在的(默认值 false,可以省略)

addEventListener("click","事件处理函数",true)

true 表示 捕获

false 或者不写 冒泡

(工作用得都是冒泡)

 举例:
事件流动 
      1 给多个父子结构的标签绑定事件, 先点击了子元素, 产生事件流动
      2 事件流动 分成了两个阶段
        1 捕获阶段   父节点 流动到 子节点
        2 冒泡节点   子节点 流动到 父节点   默认
        3 例子:
          人 跳水 
          1 水上 水里面 不断下沉 
        4 事件流动方向 默认是 使用了冒泡 - 点击儿子标签 触发 儿子->父亲->爷爷

      3 我们可以修改触发事件 让它选择使用 捕获阶段还是冒泡阶段(默认)
        addEventListener 可以选择使用冒泡还是捕获
        addEventListener(事件类型,事件处理函数,捕获还是冒泡(默认值 false,可以省略))
        addEventListener("click",function(){}, true )

      4 总结
        1 捕获和 冒泡 特点 了解 
        2 默认情况  冒泡 如果想要修改 可以 addEventListener 第三个参数 传入 true即可
        3 以后的代码开发过程中,还是继续使用默认的 冒泡阶段 

事件捕获:

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

代码:
DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)
说明:
addEventListener第三个参数传入true代表是捕获阶段触发(很少使用)
若传入false代表冒泡阶段触发,默认就是false
若是用 L0 事件监听,则只有冒泡阶段,没有捕获

image.png

阻止事件流动

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

若是想把事件就限制在当前元素内,就需要阻止事件流动

阻止事件流动需要拿到事件对象

语法:
event.stopPropagation()

此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效

阻止标签的默认行为

1 a标签点击调整

2 form-button点击刷新

3 鼠标右键弹出菜单

4 解决方法

event.preventDefault()

事件委托

通过给父元素绑定事件,事件触发,判断一下当前触发事件的元素 target

优点:给父级元素加事件(可以提高性能)

原理:事件委托其实是利用事件冒泡的特点, 给父元素添加事件,子元素可以触发

实现:事件对象(.target ) 可以获得真正触发事件的元素

      // 事件委托
      //  本来想要给li标签绑定事件实现业务
      //  把事件绑定写在 父元素上  把li标签应该要做的事情 委托给父元素来做! 
      const ul=document.querySelector("ul");
      ul.addEventListener("click",function (event) {
        //  event.target 有可能是ul标签,有可能是li标签,还有可能是 a标签 
        // 一会再来解决这个问题。
        event.target.style.backgroundColor="red";// 不够完美的
        // event.target 你当前点击的是哪个标签(点击最深最底层的那个标签即可)
        // console.log(event.target);// 获取到被点击的li标签 

滚动事件

整个页面滚动 给window来绑定scroll事件

获取页面滚动的距离

document.docElement.scrollTop

某个元素滚动 给元素绑定 scroll事件

        window.addEventListener('scroll',function(){ 
        })
        给 windowdocument 添加 scroll 事件

综合案例:

image.png

image.png

image.png