当前位置: 首页 > news >正文

e.target与e.currentTarget的区别

起初是在微信小程序的项目中发现了这样一段代码:

<label data-url="../logs/logs" bindtap="debug">调试按钮</label>
debug: function(e) {
    console.log(e);
    let url = e.target.dataset.url;
    wx.navigateTo({
      url: url,
    });
  },

然后打开调试器看到e对象的结构发现此时target和currentTarget是一样的,如下图所示:
在这里插入图片描述
所以引发了一个思考,两者什么时候会不一样呢?它们之间又有什么区别与联系?
在上网查阅了一番后我写了一个demo带大家来感受一下~

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .A{
            width: 100px;
            height: 100px;
            border: 1px solid red;
        }
        .B{
            width: 50px;
            height: 50px;
            border: 1px solid blue;
        }
        
    </style>
</head>
<body>
    <div id="A" class="A">我是A
        <div id="B" class="B">我是B</div>
    </div>


    <script>
         var a = document.getElementById('A'),
            b = document.getElementById('B');
        function handler (e) {
            console.log(e.target);
            console.log(e.currentTarget);
            //因为绑定监听事件的是a对象,故this始终指向a
            console.log(this);
        }
        a.addEventListener('click', handler);   
    </script>
</body>
</html>

点击A时我们发现控制台输出结果是
在这里插入图片描述
说明此时的currentTarget和target是一样的,都指的是A;但是我们点击子元素B时控制台输出的结果是
在这里插入图片描述
说明此时currentTarget指的是A,target指的是B,this始终指向绑定监听事件的对象A。
假如此时监听事件(就是图中的点击事件)绑定的是B,那么此时currentTarget和this指向的就是B,点击B时target也是B,但是点击A时却没有任何反应。这是为什么呢?

首先要明确一个概念,事件的捕获或者冒泡,是DOM本身存在的一个现象,跟你加不加监听器没有关系。你加了监听器,只是为了在冒泡或者捕获的阶段,截取到这个事件。也就是说,点击b,他会冒泡到a,但是你没在a上安监听器,他当然不会有任何反应(没有处理函数嘛)。但这时,如果b里面有子元素,你点击子元素也会看到不同的target与currentTaget打印出来。

总结一下:对父元素绑定监听事件时,点击子元素控制台是能输出currentTarget和target的(此时两者不一样,currentTarget指的是父元素,target指的是子元素),但是对子元素绑定监听事件时,点击父元素是没有任何反应的。(此时currentTarget和target两者一样,指向的都是子元素)

参考原文作者链接:https://www.jianshu.com/p/77f94e5cad45
有需要的朋友们可以看一下原文~

相关文章:

  • 解决:微信小程序饼状图组件层级过高覆盖在日历选择器上
  • JS中数组splice方法使用需要注意的点
  • JS中for,for...in,for...of和forEach的用法和区别
  • JSON.parse和JSON.stringify的用法
  • 一文搞懂JS中变量作用域的那些事
  • JS给函数添加属性
  • 开发中常见的一些Bug
  • 一分钟搞懂JS函数提升与变量提升的优先级
  • ES5中原型、实例对象和构造函数的那些事
  • 我的创作纪念日
  • JS之手写bind原理
  • 关于解决电脑蓝屏C:\Windows\System32\Logfiles\Str\StrTrail.txt
  • 解决:flex布局之 flex-wrap:wrap 自动换行属性,导致上下两行div中间有空行
  • uni app 自定义 头部组件(1)禁用原生
  • uni app 自定义 头部组件(2) 局部 右侧按钮
  • [nginx文档翻译系列] 控制nginx
  • [NodeJS] 关于Buffer
  • 2018一半小结一波
  • Android开源项目规范总结
  • CentOS7简单部署NFS
  • eclipse的离线汉化
  • es6
  • Map集合、散列表、红黑树介绍
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python语法速览与机器学习开发环境搭建
  • Spring Cloud Feign的两种使用姿势
  • windows下mongoDB的环境配置
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 学习使用ExpressJS 4.0中的新Router
  • 译有关态射的一切
  • 硬币翻转问题,区间操作
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ###C语言程序设计-----C语言学习(3)#
  • (003)SlickEdit Unity的补全
  • (3)选择元素——(17)练习(Exercises)
  • (C#)一个最简单的链表类
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (生成器)yield与(迭代器)generator
  • (正则)提取页面里的img标签
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Family_物联网
  • .net web项目 调用webService
  • .NET框架
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @private @protected @public
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [2016.7 test.5] T1
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法