【JavaScript】事件捕获、事件冒泡与事件委托

2018年12月18日

最近在学习js时,遇到了三个名词:事件捕获、事件冒泡、事件委托。

一、事件捕获和事件冒泡

事件捕获和事件冒泡是为了解决网页中的事件流(事件发生的顺序)而提出的概念。

事件捕获是指事件会从开始发生,直到最具体的元素。

而事件冒泡正好相反,就如同将石子投入水中,波纹是从中心向两边散开。事件冒泡是指事件会从最内层的元素开始发生,一直向外传播。

例:

1 <div id="outer">
2     <p id="inner">Click me!</p>
3 </div>

对同一个click事件,采取事件捕获的方式,则click事件发生的顺序是document -> html -> body -> div -> p;而采用事件冒泡的方式,click事件发生的顺序则是p -> div -> body -> html -> document

如果div元素和p元素各有一个函数处理click事件,那么采用事件捕获的方式,会先执行div元素的函数,再执行p元素的函数;事件冒泡则正好相反。

事件冒泡案例:

 1 <!DOCTYPE html>
 2 <html lang="en" dir="ltr">
 3 
 4 <head>
 5     <meta charset="utf-8">
 6     <title></title>
 7 </head>
 8 
 9 <body>
10     <div id="s1">s1
11         <div id="s2">s2</div>
12     </div>
13     <script>
14         <!-- 冒泡的方法,点击s2,s2先响应click事件,其次是s1 -->
15         s1.addEventListener("click", function(e) {
16             console.log("s1 冒泡事件");
17         }, false);
18         s2.addEventListener("click", function(e) {
19             console.log("s2 冒泡事件");
20         }, false);
21     </script>
22 </body>
23 
24 </html>

事件捕获案例:

 1 <!DOCTYPE html>
 2 <html lang="en" dir="ltr">
 3 
 4 <head>
 5     <meta charset="utf-8">
 6     <title></title>
 7 </head>
 8 
 9 <body>
10     <div id="s1">s1
11         <div id="s2">s2</div>
12     </div>
13     <script>
14         <!-- 捕捉的方法,点击s2,s1先响应click事件,其次是s2 -->
15         s1.addEventListener("click", function(e) {
16             console.log("s1 捕获事件");
17         }, true);
18         s2.addEventListener("click", function(e) {
19             console.log("s2 捕获事件");
20         }, true);
21     </script>
22 
23 </html>

 

二、事件委托

事件委托是指将事件绑定在父元素上,然后采用事件冒泡的方法,当事件流达到父元素时,可以通过target获取真正触发的当前元素,并执行绑定在父元素上的方法。

这样做可以省去一个个给子元素绑定事件。

一般的步骤是:

①确定需要监听时间的父元素,我现在一般需要画出DOM树

②给父元素添加addEventListener('event', function)

③通过父元素.target获取实际被操作的元素,在函数中进行处理

 

通俗点说,就是先找到一个比较高的公共元素节点,给它绑定事件,然后通过event.target知道是哪个子节点触发了事件,找到了触发节点,就可以对它进行操作(删除它,删除它的父节点等)

posted @ 2018-12-18 09:47  史达林之剑  阅读(795)  评论(0编辑  收藏  举报