在了解什么是DOM事件以及给DOM事件绑定监听器的几种方法后,我们来谈谈事件委托。
1. e.target 和 e.currentTarget
当我们给目标元素target 绑定一个事件监听器target.addEventListener(event,function(){}), 并指定回调函数function(e), 函数的参数e表示事件。此时e.target 与 e.currentTarget分别表示自己触发事件的元素与被监听的元素
<html>
<body>
<ul style='list-style:none;max-width:200px;border:1px solid;'><li>点我试试</li>
<ul>
<script>(document.querySelector('ul')).addEventListener('click' ,function(e){console.log('e.target')console.log(e.target)console.log('e.currentTarget')console.log(e.currentTarget)})</script>
</body>
</html>
x

1
<html>

2
<body>

3
<ul style='list-style:none;max-width:200px;border:1px solid;'>

4
  <li>点我试试</li>

5
<ul>

6
<script>

7
  (document.querySelector('ul')).addEventListener('click' ,function(e){

8
    console.log('e.target')

9
    console.log(e.target)

10
    console.log('e.currentTarget')

11
    console.log(e.currentTarget)

12
  })

13
  </script>

14
</body>

15
</html>

16

这段代码为一个ul元素绑定了一个监听器,当ul上发生点击事件时,分别输出e.target和e.currentTarget的值。
当点击ul中的li元素时,该段代码的在控制台输出的结果如下:
此时,e.target为直接点击的元素li,而e.currentTarget为被监听的元素ul。由此我们可以得到一个启发,触发事件的元素与被监听的元素不一定是一个元素。于是就来到了本文的重点内容——事件委托。
2. 如何进行事件委托
什么情况下回用到事件委托呢?举两个例子
1) 当存在多个元素可以共用同一个监听器
<body>
<ul><li>点<span>这里</span></li><li>点这里</li>
</ul>
<style>ul, li{list-style:none;border:1px solid;padding:10px;background:#ddd
}
li{text-align:center;margin:10px;background:#fff
}
</style>
</body>
</html>
x

1
<body>

2
<ul>

3
  <li>点<span>这里</span></li>

4
  <li>点这里</li>

5
</ul>

6
<style>

7
  ul, li{

8
  list-style:none;

9
  border:1px solid;

10
  padding:10px;

11
  background:#ddd

12
}

13
li{

14
  text-align:center;

15
  margin:10px;

16
  background:#fff

17
}

18
</style>

19
</body>

20
</html>

21

上面的代码中定义了如图所示的一个ul,它包裹着两个li,第一个li中还有一个子元素span。如果我们希望点击两个li均执行同一条命令时,第一种方法是为每个li都绑定一个监听器,但当li很多时,这样处理就过于繁琐。
这时我们会想到可以直接监听ul,为ul绑定事件函数,那么只要li存在于ul的内部,点击任意的一个li都会执行这条命令。但同样存在一个问题,当点击li的外部,也就是图中的灰色区域时,命令同样会被执行。
那么如何仅仅在点击li的覆盖区域的时候才执行这段命令呢,可以用以下这段代码。
var ul=document.querySelector('ul')
ul.addEventListener('click',function(e){var el = e.target
//判断当前点击的元素是否为li,如果不是,执行以下的while循环while(el.tagName !== 'LI'){
//如果点击的元素为ul,直接跳出循环if(el === ul){el = nullbreak;}
//否则,将当前元素父元素赋给elel=el.parentNode}
//如果最后el不为null,则打出'ok'if(el){console.log('ok')}
//否则,打出'你点击的不是li'else console.log('你点击的不是li')
})
x

1
var ul=document.querySelector('ul')

2
ul.addEventListener('click',function(e){

3
  var el = e.target

4
//判断当前点击的元素是否为li,如果不是,执行以下的while循环

5
  while(el.tagName !== 'LI'){

6
//如果点击的元素为ul,直接跳出循环

7
    if(el === ul){

8
      el = null

9
      break;

10
    }

11
//否则,将当前元素父元素赋给el

12
      el=el.parentNode

13
  }

14
//如果最后el不为null,则打出'ok'

15
  if(el){

16
    console.log('ok')

17
  }

18
//否则,打出'你点击的不是li'

19
  else console.log('你点击的不是li')

20
})

21

这段代码实现了当点击的区域在li范围内时,不管点击的是li元素本身,还是li的子元素span,都会执行console.log('ok'),但当点击区域超出li的范围,则执行' console.log('你点击的不是li')'。这就成功实现了一个事件委托。
(2) 用事件委托实现动态监控
还有一种情况,也会用到事件委托,那就是需要动态监控的时候。
看以下代码:
<html>
<body>
<ul><li>1</li><li>2</li><li>3</li><li>4</li>
</ul><button id=addButton>+</button>
</body>
</html>
<style>
li{border: 1px solid;
}
</style>
<script>
addButton.onclick = function(){var li = document.createElement('li')li.textContent = 'new' document.querySelector('ul').appendChild(li)
}
document.querySelector('ul').onclick = function(e){console.log(e.target)
}
</script>
</body>
</html>
x

1
<html>

2
<body>

3
<ul>

4
  <li>1</li>

5
  <li>2</li>

6
  <li>3</li>

7
  <li>4</li>

8
</ul>

9
  <button id=addButton>+</button>

10
</body>

11
</html>

12
<style>

13
li{

14
  border: 1px solid;

15
}

16
</style>

17
<script>

18
addButton.onclick = function(){

19
  var li = document.createElement('li')

20
  li.textContent = 'new' 

21
  document.querySelector('ul').appendChild(li)

22
}

23
document.querySelector('ul').onclick = function(e){

24
  console.log(e.target)

25
}

26
</script>

27
</body>

28
</html>

29

这段代码实现的效果如下:
当点击左下角的加号按钮时,会增加一个新的li,同时在点击li时,在控制台输出被点击的li的内容。这就是用事件委托实现动态监控。
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/zjx2011/p/8447512.html

javascript举例介绍事件委托的典型使用场景相关推荐

  1. 详解事件代理(事件委托)以及应用场景

    事件代理(也称事件委托)事件代理,俗地来讲,就是把⼀个元素响应事件 ( click . keydown ......)的函数委托到另⼀个元素 前⾯讲到,事件流的都会经过三个阶段: 捕获阶段 -> ...

  2. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

  3. JavaScript:事件冒泡和事件委托

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript事件代理和委托(Delegation) JavaScript事件冒泡和事件委托 JavaScript:通过 ...

  4. js中的事件委托或是事件代理详解(转载)

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  5. 事件绑定、事件监听、事件委托

    2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等 ...

  6. js事件委托或事件代理

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  7. JS中的事件委托/事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  8. JS中的事件委托 / 代理详解

    [前言] 事件委托/代理是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的 [主体] 概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用 ...

  9. JS 事件代理和事件委托

    目录 事件委托的概念理解 为什么要用事件委托 事件委托的原理: 事件代理(委托)实现 总结: 事件委托的概念理解 为什么叫事件委托?它还有一个名字叫事件代理. JavaScript高级程序设计上讲:事 ...

最新文章

  1. CodeForces - 1512G Short Task(欧拉筛求因子和)
  2. HDU 3264 Open-air shopping malls
  3. 【hrbust2294】方方正正
  4. Image-to-Image Translation with Conditional Adversarial Networks
  5. 2048小游戏——网页版(提高篇)
  6. 宇视云所有故障排查思维导图
  7. 思科 计算机网络 第7章测试考试 答案
  8. sql server 常用工具
  9. VB操作EXCEL表的常用方法
  10. 将矩形图片绘制成圆形图片
  11. 网上教务评教管理系统
  12. h5调用Android、ios的方法
  13. 泪目!上海00后小伙AI「复活」奶奶,100%还原音容笑貌,却引发巨大争议
  14. 看看咱是如何用MATLAB白嫖遥遥领先于同行的神仙级翻译工具 — DeepL
  15. iris-session梳理
  16. 2022亚马逊云科技re:Invent,与合作伙伴描绘宏伟蓝图
  17. 计算机在线考试word,计算机一级考试word操作试题
  18. EOJ 3260:袋鼠妈妈找孩子
  19. 《罗生门》人如果不自私,就无法活下去
  20. 机械优化黄金分割法c语言编程,黄金分割法_机械优化设计_C语言程序.doc

热门文章

  1. 1.7 编程基础之字符串 27 单词翻转 4分 python
  2. win7怎么进入安全模式_windows 10如何进入安全模式
  3. 【ES6(2015)】Reflect
  4. Python笔记-假设检验之单样本T检验
  5. Android笔记-使用okhttp3库发送http请求
  6. cuda笔记-GPU多线程的奇偶排序
  7. Qt文档阅读笔记-QML Canvas的官方解析及实例
  8. java语言factory_一个简单例子解释 Java factory
  9. c#web页面显示弹窗_基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用
  10. php中子类实现多接口,PHP子类无法实现相同的接口父类实现