博主信息
博文 65
粉丝 2
评论 0
访问量 74956
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
3分钟学会:ES6事件代理的实现原理,实例演示:简化代码和业务逻辑
张福根一修品牌运营
原创
975人浏览过

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

实例效果:

事件代理的实现原理

实例源码:

  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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学