博客列表 >3分钟学会:ES6事件代理的实现原理,实例演示:简化代码和业务逻辑

3分钟学会:ES6事件代理的实现原理,实例演示:简化代码和业务逻辑

张福根一修品牌运营
张福根一修品牌运营原创
2020年11月06日 17:43:59802浏览

事件代理的实现原理,实例演示

实例效果:

事件代理的实现原理

实例源码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>事件代理的实现原理,实例演示</title>
  7. </head>
  8. <body>
  9. <div class="first">
  10. <div class="second">
  11. <div class="three">事件传递</div>
  12. </div>
  13. </div>
  14. <script>
  15. // 事件的捕获和冒泡
  16. const first = document.querySelector(".first");
  17. const second = document.querySelector(".second");
  18. const three = document.querySelector(".three");
  19. // true: 捕获阶段, false: 冒泡阶段
  20. // addEventListener(evName, callback, true);
  21. // ev.target: 事件的触发者, ev.currentTarget: 事件的绑定者
  22. // true: 捕获阶段
  23. first.addEventListener(
  24. // %s:占位符
  25. "click",
  26. (ev) =>
  27. console.log(
  28. "捕获:触发 %s, 绑定 %s",
  29. ev.target.classList.item(0),
  30. ev.currentTarget.classList.item(0)
  31. ),
  32. true
  33. );
  34. second.addEventListener(
  35. "click",
  36. (ev) =>
  37. console.log(
  38. "捕获:触发 %s, 绑定 %s",
  39. ev.target.classList.item(0),
  40. ev.currentTarget.classList.item(0)
  41. ),
  42. true
  43. );
  44. three.addEventListener(
  45. "click",
  46. (ev) =>
  47. console.log(
  48. "捕获:触发 %s, 绑定 %s",
  49. ev.target.classList.item(0),
  50. ev.currentTarget.classList.item(0)
  51. ),
  52. true
  53. );
  54. // false: 冒泡阶段
  55. first.addEventListener(
  56. "click",
  57. (ev) =>
  58. console.log(
  59. "冒泡:触发 %s, 绑定 %s",
  60. ev.target.classList.item(0),
  61. ev.currentTarget.classList.item(0)
  62. ),
  63. false
  64. );
  65. second.addEventListener(
  66. "click",
  67. (ev) =>
  68. console.log(
  69. "冒泡:触发 %s, 绑定 %s",
  70. ev.target.classList.item(0),
  71. ev.currentTarget.classList.item(0)
  72. ),
  73. false
  74. );
  75. three.addEventListener(
  76. "click",
  77. (ev) =>
  78. console.log(
  79. "冒泡:触发 %s, 绑定 %s",
  80. ev.target.classList.item(0),
  81. ev.currentTarget.classList.item(0)
  82. ),
  83. false
  84. );
  85. </script>
  86. <!-- 冒泡实现事件委托 / 事件代理 -->
  87. <ul>
  88. <li>item1</li>
  89. <li>item2</li>
  90. <li>item3</li>
  91. <li>item4</li>
  92. <li>item5</li>
  93. </ul>
  94. <script>
  95. // 给每一个 < li > 逐个添加点击事件;
  96. // document
  97. // .querySelectorAll("ul li")
  98. // .forEach((item) =>
  99. // item.addEventListener(
  100. // "click",
  101. // (ev) =>
  102. // console.log("触发 %s, 绑定 %s", ev.target, ev.currentTarget),
  103. // false
  104. // )
  105. // );
  106. // 根据冒泡原理,子元素的同名事件会向上冒泡到父级元素的同名事件上,所以直接将这个事件干脆添加给它的父元素就可以
  107. document
  108. .querySelector("ul")
  109. .addEventListener(
  110. "click",
  111. (ev) => console.log("触发 %s, 绑定 %s", ev.target, ev.currentTarget),
  112. false
  113. );
  114. // 将应该在子元素的触发的事件,委托给父元素去触发了, 可以极大的简化代码和业务逻辑
  115. </script>
  116. </body>
  117. </html>

实例总结:

事件的捕获和冒泡:

  • true: 捕获阶段, false: 冒泡阶段
  • addEventListener(evName, callback, true);
  • ev.target: 事件的触发者, ev.currentTarget: 事件的绑定者

冒泡实现事件委托/事件代理:

  • 冒泡原理,子元素的同名事件会向上冒泡到父级元素的同名事件上,所以直接将这个事件干脆添加给它的父元素就可以
  • 将应该在子元素的触发的事件,委托给父元素去触发了, 可以极大的简化代码和业务逻辑
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议