IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 关于js中事件的event.stopPropagation()方法的理解与举例说明 -> 正文阅读

[JavaScript知识库]关于js中事件的event.stopPropagation()方法的理解与举例说明

event.stopPropagation() 阻止捕获和冒泡阶段中当前事件的进一步传播。

在这之前先说一下事件触发的原理

?事件触发原理

?事件触发整体有三个阶段构成:捕获阶段 -> 目标阶段(不显示) -> 冒泡阶段(默认)

? ? ? ? 捕获阶段是由外向内

? ? ? ? 冒泡阶段是由内向外

捕获阶段 ? ?目标阶段 ? ?冒泡阶段

? ? ? ? ? ? 外 ? ? ? ? ? ? ? ? ? ?内

? ? ? ? ? ? ?|? ? ? ? ? ? ? ? ? ? ? ? |

? ? ? ? ? ? 内 ? ? ? ? ? ? ? ? ? ?外

接下来用4个嵌套的div举例说明

    <div class="div1">div1
        <div class="div2">div2
            <div class="div3">div3
                <div class="div4">div4</div>
            </div>
        </div>
    </div>

?具体css代码不做展示,效果图如下:

?

JavaScript代码如下:



        var div1=document.querySelector(".div1");
        var div2=document.querySelector(".div2");
        var div3=document.querySelector(".div3");
        var div4=document.querySelector(".div4");

        div1.addEventListener("click",clickhandler1);
        div2.addEventListener("click",clickhandler2);
        div3.addEventListener("click",clickhandler3);
        div4.addEventListener("click",clickhandler4);
        
        function clickhandler1(e){
            console.log("div1")
        }
        function clickhandler2(e){
            console.log("div2")
          
        }
        function clickhandler3(e){
            console.log("div3)
    
        }
        function clickhandler4(e){
            console.log("div4)
           
        }

?event.stopPropagation() 阻止捕获和冒泡阶段中当前事件的进一步传播

????????说白了就是当侦听的事件是捕获时,阻断的就是捕获过程,当侦听的事件是冒泡时,阻断的就是冒泡过程

1. 接下来看第一个例子,当设置div3是冒泡时,也就是默认值false

        div1.addEventListener("click",clickhandler1);
        div2.addEventListener("click",clickhandler2);
        div3.addEventListener("click",clickhandler3,false);
        div4.addEventListener("click",clickhandler4);

那当阻断div3时,点击div4时

        function clickhandler1(e){
            console.log("div1")
        }
        function clickhandler2(e){
            console.log("div2")
          
        }
        function clickhandler3(e){
            console.log("div3")
            e.stopPropagation(); //阻止冒泡事件进一步传播
        }
        function clickhandler4(e){
            console.log("div4")
            
        }

那输出的结果就是

因为,所有的div都设置侦听的是冒泡阶段,所以捕获阶段不触发,冒泡输出结果从内往外输出,应该是div4->div3->div2->div1

但是在div3用了e.stopPropagation()阻止了冒泡进一步传播,所以只输出了div4->div3

2、当设置四个div都是侦听捕获阶段时,当阻断div3时,点击div4时

        div1.addEventListener("click",clickhandler1,true);
        div2.addEventListener("click",clickhandler2,true);
        div3.addEventListener("click",clickhandler3,true);
        div4.addEventListener("click",clickhandler4,true);
        
        function clickhandler1(e){
            console.log("div1")
        }
        function clickhandler2(e){
            console.log("div2")
          
        }
        function clickhandler3(e){
            console.log("div3")
            e.stopPropagation(); 
        }
        function clickhandler4(e){
            console.log("div4")
            // e.stopPropagation(); 
        }

?输出结果应是

?因为侦听的四个div都是捕获阶段,所以应该由外向内,输出的是div1 -> div2 -> div3 ->div4

但是div3用e.stopPropagation()阻止了捕获的进一步传播,所以只输出div1 -> div2 -> div3

3、第三个例子,设置div1,div3侦听的是冒泡阶段,div2,div4侦听的是捕获阶段,那么当设置阻断div3时

        div1.addEventListener("click",clickhandler1);
        div2.addEventListener("click",clickhandler2,true);
        div3.addEventListener("click",clickhandler3);
        div4.addEventListener("click",clickhandler4,true);
        
        function clickhandler1(e){
            console.log("div1")
        }
        function clickhandler2(e){
            console.log("div2")
          
        }
        function clickhandler3(e){
            console.log("div3")
            e.stopPropagation(); 
        }
        function clickhandler4(e){
            console.log("div4")
            
        }

这个时候四个div有捕获阶段,也有冒泡阶段,优先捕获阶段,也就是先输出捕获阶段div2、div4,后输出冒泡阶段div3、div1

注意,捕获阶段由外向内,所以输出的是div2 -> div4

冒泡阶段由内向外,所以输出的是div3 -> div1

?

所以最后输出应该是div2 -> div4 ->?div3 -> div1

但是div3用e.stopPropagation()阻止了冒泡的进一步传播,所以输出结果应该是div2 -> div4 ->?div3

?

那么同理 如果设置div1,div3侦听的是捕获阶段,div2,div4侦听的是冒泡阶段,那么当设置阻断div3时

        div1.addEventListener("click",clickhandler1,true);
        div2.addEventListener("click",clickhandler2);
        div3.addEventListener("click",clickhandler3,true);
        div4.addEventListener("click",clickhandler4);
        
        function clickhandler1(e){
            console.log("div1")
        }
        function clickhandler2(e){
            console.log("div2")
          
        }
        function clickhandler3(e){
            console.log("div3")
            e.stopPropagation(); 
        }
        function clickhandler4(e){
            console.log("div4")
            
        }

这个时候同样四个div有捕获阶段,也有冒泡阶段,优先捕获阶段,也就是先输出捕获阶段div1、div3,后输出冒泡阶段div4、div2

再次注意,捕获阶段由外向内,所以输出的是div1 -> div3

冒泡阶段由内向外,所以输出的是div4 -> div2

所以最后输出应该是div1 -> div3 ->?div4 -> div2

但是div3用e.stopPropagation()阻止了捕获的进一步传播,所以输出结果应该是div1 -> div3


?简单总结一些注意点:

因为上边的例子都是点击最里层的元素div4,所以根据事件的触发原理:捕获阶段 -> 目标阶段(不显示) -> 冒泡阶段(默认)

点击的是div4,所以目标阶段就是div4,捕获阶段就是有外向内,div1 -> div2 -> div3 -> div4

冒泡阶段是由内向外div4 -> div3 -> div2 -> div1,

所以整个点击div4事件的原理就是:

捕获阶段由外向内(div1 -> div2 -> div3 -> div4) -> 目标div4? ->? 冒泡阶段由内向外(div4 -> div3 -> div2 -> div1)

设置在哪个阶段 侦听,就获取哪个阶段的元素或方法,侦听捕获阶段1,3,就获取div1,div3

侦听冒泡阶段2,4,就获取div4,div2

千万注意捕获阶段和冒泡阶段的顺序!

e.stopPropagation() 就是阻止之后的冒泡或者捕获继续传播,说白了就是截断,不再侦听


后续有什么不懂可以私聊我,或者评论

最后大家可以试着想一下,当点div1,div2,div3时输出div1,点div4时,输出div4。这样该怎么实现?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:40:27  更:2021-12-23 15:41:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:03:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码