博客列表 >【JS】事件冒泡 与 事件委托

【JS】事件冒泡 与 事件委托

可乐随笔
可乐随笔原创
2022年12月03日 23:42:59618浏览

事件冒泡 与 事件委托

1.事件冒泡

根据事件冒泡机制,当上一级元素也有同名事件时,会自动触发。

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. </head>
  9. <body>
  10. <div>
  11. <button>点击</button>
  12. </div>
  13. <script>
  14. document.querySelector('button').onclick = function () {
  15. console.log(this.tagName);
  16. };
  17. //根据事件冒泡机制,当上一级元素也有同名事件时,会自动触发
  18. //button 父级 div
  19. document.querySelector('div').onclick = function () {
  20. console.log(this.tagName);
  21. };
  22. //div 父级 body
  23. document.querySelector('body').onclick = function () {
  24. console.log(this.tagName);
  25. };
  26. //body 父级 html
  27. document.querySelector('html').onclick = function () {
  28. console.log(this.tagName);
  29. };
  30. </script>
  31. </body>
  32. </html>

2.事件委托

总结:

1.基于事件委托原理,点击子元素,也会触发父元素
2.点击子元素(如li),等同点击父元素(如ul)
3.将事件绑定到父元素即可实现事件委托

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. </head>
  9. <body>
  10. <ul>
  11. <li>item1</li>
  12. <li>item2</li>
  13. <li>item3</li>
  14. <li>item4</li>
  15. <li>item5</li>
  16. </ul>
  17. <script>
  18. //以下关于事件委托总结:
  19. //1.基于事件委托原理,点击子元素,也会触发父元素
  20. //2.点击子元素(如li),等同点击父元素(如ul)
  21. //3.将事件绑定到父元素即可实现事件委托
  22. //具体调用方法如下:
  23. // document.querySelector('ul').onclick = function (ev) {
  24. // console.log(ev.target.textContent);
  25. // };
  26. //任务:点击<li>,显示出它的内容文本
  27. //(一)传统方式
  28. // document.querySelectorAll('li').forEach((li) => {
  29. // // console.log(li.textContent);
  30. // li.onclick = () => {
  31. // console.log(li.textContent);
  32. // };
  33. // });
  34. //(二)事件冒泡方法
  35. //原理:li.onclick 必然会在 ul.onclick 上触发,只要在ul上写一个点击事件
  36. document.querySelector('ul').onclick = function () {
  37. // console.log(li.textContent);
  38. // console.log(this)
  39. // 事件委托中,不要用this
  40. // this 不能用它来引用事件触发主体
  41. };
  42. //事件对象参数
  43. //事件方法传参:要么传“事件对象”,要么就不要传参
  44. document.querySelector('ul').onclick = function (ev) {
  45. //ev:事件对象
  46. //console.log(ev);
  47. // 事件委托:事件主体不再是一个元素
  48. // 事件主体:二部分组成
  49. // 1.事件绑定“主体”:被添加了事件属性的元素,<ul>
  50. // ev.currentTarge
  51. // console.log(ev.currentTarget);
  52. // 2. 事件“触发”主体:用户实际点击的元素,<li>
  53. // ev.targe
  54. // console.log(ev.target);
  55. console.log(ev.target.textContent);
  56. //事件主体再讲:绑定主体,触发主体是父子关系 或 祖孙关系
  57. // 事件委托:事件主体一分为二
  58. };
  59. </script>
  60. </body>
  61. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议