我的回答

浏览器事件流分为3个大的阶段

  1. 事件捕获
  2. 事件目标
  3. 事件冒泡

参考回答

事件流向

事件流向包含三个过程,分别是捕获阶段、目标阶段和冒泡阶段。

捕获阶段

当我们对DOM元素进行操作时,比如鼠标点击,就会有一个事件传输到这个DOM元素,这个事件从Window开始,依次经过document、html、body,再不断经过子节点直到到达目标元素,从Window到达目标元素父节点的过程成为 捕获阶段,需要注意的是 此时还未到达目标节点

目标阶段

捕获阶段结束后,事件到达了目标节点的父节点,最终到达目标节点,并在目标节点上触发了这个事件,这就是目标阶段

冒泡阶段

当事件到达目标节点之后,就会沿着原路返回,这个过程有点类似水泡从水底浮出水面的过程,所以称这个过程为冒泡阶段。

代码实现的过程

通过addEvevtListener添加参数,第三个参数,表示在捕获阶段还是冒泡阶段触发
true为捕获, false为冒泡
事件从外到内捕获,然后从内到外冒泡

  1. <body>
  2. <div id="wrap">
  3. <button id="btn">click me</button>
  4. </div>
  5. <script>
  6. var wrap = document.getElementById("wrap");
  7. var btn = document.getElementById("btn");
  8. // 捕获阶段绑定事件
  9. window.addEventListener("click", function(e){
  10. console.log("window 捕获", e.target.nodeName, e.currentTarget.nodeName);
  11. }, true);
  12. document.addEventListener("click", function(e){
  13. console.log("document 捕获", e.target.nodeName, e.currentTarget.nodeName);
  14. }, true);
  15. document.documentElement.addEventListener("click", function(e){
  16. console.log("documentElement 捕获", e.target.nodeName, e.currentTarget.nodeName);
  17. }, true);
  18. document.body.addEventListener("click", function(e){
  19. console.log("body 捕获", e.target.nodeName, e.currentTarget.nodeName);
  20. }, true);
  21. wrap.addEventListener("click", function(e){
  22. console.log("wrap 捕获", e.target.nodeName, e.currentTarget.nodeName);
  23. }, true);
  24. btn.addEventListener("click", function(e){
  25. console.log("btn 捕获", e.target.nodeName, e.currentTarget.nodeName);
  26. }, true);
  27. // 冒泡阶段绑定的事件
  28. window.addEventListener("click", function(e){
  29. console.log("window 冒泡", e.target.nodeName, e.currentTarget.nodeName);
  30. }, false);
  31. document.addEventListener("click", function(e){
  32. console.log("document 冒泡", e.target.nodeName, e.currentTarget.nodeName);
  33. }, false);
  34. document.documentElement.addEventListener("click", function(e){
  35. console.log("documentElement 冒泡", e.target.nodeName, e.currentTarget.nodeName);
  36. }, false);
  37. document.body.addEventListener("click", function(e){
  38. console.log("body 冒泡", e.target.nodeName, e.currentTarget.nodeName);
  39. }, false);
  40. wrap.addEventListener("click", function(e){
  41. console.log("wrap 冒泡", e.target.nodeName, e.currentTarget.nodeName);
  42. }, false);
  43. btn.addEventListener("click", function(e){
  44. console.log("btn 冒泡", e.target.nodeName, e.currentTarget.nodeName);
  45. }, false);
  46. </script>
  47. </body>
  1. window 捕获 BUTTON undefined
  2. document 捕获 BUTTON #document
  3. documentElement 捕获 BUTTON HTML
  4. body 捕获 BUTTON BODY
  5. wrap 捕获 BUTTON DIV
  6. btn 捕获 BUTTON BUTTON
  7. btn 冒泡 BUTTON BUTTON
  8. wrap 冒泡 BUTTON DIV
  9. body 冒泡 BUTTON BODY
  10. documentElement 冒泡 BUTTON HTML
  11. document 冒泡 BUTTON #document
  12. window 冒泡 BUTTON undefined