JavaScript-事件委托

1. 事件委托
机制
事件委托利用事件冒泡,可以只使用一个事件处理程序来管理一种类型的事件。
假设,你的列表里有100个列表项。现在需要去监听点击的列表项时哪一个,如果给每一个列表项都添加监听函数,那么就有100个事件处理程序,会占用大量内存。
利用事件的冒泡机制,列表项的点击事件后续会冒泡到列表,可以给列表设置一个监听程序去捕获该次点击事件。列表监听到事件之后,只需要检查event对象的id属性就可以确认点击的列表项时哪一个。
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
    <meta charset="utf-8">
  </head>
  <body>
    <script>
      onload = function() {
        document.getElementById('dir').addEventListener('click', event=>{
          console.log(event.target);
        })
      }
    </script>
    <div>
      <ul id="dir">
        <li></li>
        <li></li>
        <li>西</li>
        <li></li>
      </ul>
    </div>
  </body>
</html>
2. 事件流
顺便写一点关于事件流的。
事件流描述了页面接收事件的顺序。
事件冒泡,事件从最具体的元素开始触发,然后向上层传播。
事件捕获,事件从文档树的最上层开始触发,然后向文档树的下层传播。

DOM事件流分为3个阶段:事件捕获、到达目标和事件冒泡。
事件捕获先发生,在捕获阶段可以拦截事件。然后实际的目标元素接收到事件。然后在由底向上冒泡。
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
    <meta charset="utf-8">
  </head>
  <body>
    <script>
      onload = function() {
        let twindow = window;
        let tdocument = document;
        let tbody = document.body;
        let inner = document.getElementById("inner");

        // false 表示在冒泡阶段调用事件处理程序
        inner.addEventListener('click', ()=>{
          console.log('inner 冒泡');
        }, false);

        // true 表示在捕获阶段调用事件处理程序
        inner.addEventListener('click', ()=>{
          console.log('inner 捕获');
        }, true);

        tbody.addEventListener('click', ()=>{
          console.log('tbody 冒泡');
        }, false);

        tbody.addEventListener('click', ()=>{
          console.log('tbody 捕获');
        }, true);

        tdocument.addEventListener('click', ()=>{
          console.log('tdocument 冒泡');
        }, false);

        tdocument.addEventListener('click', ()=>{
          console.log('tdocument 捕获');
        }, true);

        twindow.addEventListener('click', ()=>{
          console.log('twindow 冒泡');
        }, false);

        twindow.addEventListener('click', ()=>{
          console.log('twindow 捕获');
        }, true);
      }

    </script>
    <div id="inner" style="width: 100px; height: 100px; background-color: aquamarine;">
    </div>
  </body>
</html>
点击结果为:
// twindow 捕获
// tdocument 捕获
// tbody 捕获
// inner 捕获
// inner 冒泡
// tbody 冒泡
// tdocument 冒泡
// twindow 冒泡
可以很清楚的看到事件先由外层的window捕获,然后向内传播,inner接收到之后,再向外层冒泡。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值