1+ <!DOCTYPE html>
2+ < html id ="h ">
3+
4+ < head >
5+ < title > 事件捕获与事件冒泡</ title >
6+ </ head >
7+ < div id ="a ">
8+ < div id ="b ">
9+ < button id ="c "> 点我</ button >
10+ </ div >
11+ </ div >
12+
13+ < body >
14+ < script >
15+ //在js中事件传播分为事件捕获和事件冒泡
16+ //其中事件捕获就是捕获事件,还未触发事件冒泡的执行,事件捕获是从从根元素开始,逐级向下,一直到目标元素传递的
17+ //而事件冒泡其实就是事件执行,具体的执行事件,事件冒泡是从目标元素向上传递,传递到它的父元素,一直传到根元素
18+ //举个例子,假设我们点击上面的id为c元素 buttton,事件捕获先发生,实际上会先从根html捕获事件,然后到a再到b和c
19+ //如果事件捕获阶段没有取消事件传播,则事件最终传播到目标元素,此时目标元素执行事件处理
20+ //目标元素执行完事件处理后再逐级向上传播事件,由父元素执行事件处理
21+
22+ //可以总结为事件传播分为三个阶段:
23+ //1. 事件捕获阶段:事件从document对象传播到目标元素的父元素,一直向下直到目标元素本身,这个过程中,可以在父元素上通过事件捕获机制先捕获到事件
24+ //2. 目标阶段:事件到达目标元素,会执行目标元素上的事件捕获和事件冒泡
25+ //3. 事件冒泡阶段:事件从目标元素开始向上冒泡,通过DOM树传播回document对象
26+
27+ //相当于事件可以分为事件捕获和事件冒泡两大类,每个元素都可以为这两类注册监听函数
28+ //事件开始传播时,会先从根元素到目标元素执行事件捕获注册的函数
29+ //执行完成后再从目标元素到根元素执行事件冒泡注册的函数
30+ //当然我们也可以在任意一个元素上的事件捕获/事件冒泡函数 上停止事件的传播
31+
32+
33+ //其中addEventListener既可以设置事件捕获,也可以设置事件冒泡,取决于第三个参数
34+ //如果第三个参数是true,则为注册了一个事件捕获,如果第三个参数不填或者false 则注册的是一个事件冒泡
35+ document . getElementById ( "a" ) . addEventListener ( "click" , function ( ) {
36+ alert ( "这是元素a上的事件捕获,会第一个触发" )
37+ } , true ) ;
38+ document . getElementById ( "b" ) . addEventListener ( "click" , function ( ) {
39+ alert ( "这是元素b上的事件冒泡,会最后一个触发" )
40+ } )
41+ document . getElementById ( "c" ) . addEventListener ( "click" , function ( ) {
42+ alert ( "这是元素c上的事件冒泡,会第二个触发" )
43+ } )
44+
45+ //如果在父元素停止事件传播,则后续流程都会停止
46+ document . getElementById ( "h" ) . addEventListener ( "click" , function ( event ) {
47+ event . stopPropagation ( )
48+ } , true )
49+ </ script >
50+ </ body >
51+
52+ </ html >
0 commit comments