事件三要素

  • 事件源
  • 事件类型
  • 事件处理程序

DOM 事件流

事件流描述的是从页面中接收事件的顺序
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程就是 DOM 事件流

DOM 事件流分为 3 个阶段

  1. 捕获阶段
  2. 当前目标阶段
  3. 冒泡阶段

image.png

image.png

事件流验证

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>事件流验证</title>
  8. <style>
  9. div {
  10. font-size: 30px;
  11. font-weight: 700;
  12. text-align: center;
  13. }
  14. .father {
  15. width: 500px;
  16. height: 500px;
  17. background-color: yellowgreen;
  18. margin: 0 auto;
  19. }
  20. .son {
  21. width: 200px;
  22. height: 200px;
  23. background-color: skyblue;
  24. margin: 0 auto;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div class="father">
  30. <div class="son">son</div>
  31. </div>
  32. <!--
  33. <script>
  34. // 捕获
  35. const son = document.querySelector(".son");
  36. son.addEventListener(
  37. "click",
  38. event => {
  39. console.log("son"); // 后
  40. },
  41. false
  42. );
  43. const father = document.querySelector(".father");
  44. father.addEventListener(
  45. "click",
  46. event => {
  47. console.log("father"); // 先
  48. },
  49. false
  50. );
  51. </script>
  52. -->
  53. <script>
  54. // 冒泡
  55. const son = document.querySelector(".son");
  56. son.addEventListener(
  57. "click",
  58. event => {
  59. console.log("son"); // 先
  60. },
  61. false
  62. );
  63. const father = document.querySelector(".father");
  64. father.addEventListener(
  65. "click",
  66. event => {
  67. console.log("father"); // 后
  68. },
  69. false
  70. );
  71. </script>
  72. </body>
  73. </html>
  • JS 代码中只能执行捕获或者冒泡其中的一个阶段
  • onclickattachEvent只能得到冒泡阶段