target与currentTarget的区别_高先生的猫的博客-程序员宅基地

技术标签: jQuery  前端面试之道  JavaScript  

这两天去面试的两个小伙伴都遇到了一个问题,面试官问到你用jQuery的时候有没有用过target和currentTarget?他们的区别是什么?他们都是一脸懵,平时练习也没有用过currentTarget啊?其实currentTarget这个属性很是鸡肋,其实我们平时也用不到,下面我们通过两个例子说明平时我们为什么用不到:

举个例子:

   <ul>
    <li>按钮1</li>
    <li>按钮2</li>
    <li>按钮3</li>
    <li>按钮4</li>
  </ul>

 

<script>
    let ul = document.querySelectorAll('ul')[0]
    let aLi = document.querySelectorAll('li')
    ul.addEventListener('click',function(e){
       let oLi1 = e.target  
       let oLi2 = e.currentTarget
       console.log(oLi1)   //  被点击的li
       console.log(oLi2)   // ul
       console.og(oLi1===oLi2)  // false
    })
  </script>

我们知道,e.target可以用来实现事件委托,e.target指向用户点击的li,而e.currentTarget指向的是给绑定事件监听的那个对象,即ul,从这里可以发现,e.currentTarget===this返回true,而e.target===this返回falsee.currenttargete.target是不相等的。
总结:
上面的例子是:省略selector或者是null,那么事件处理程序被称为直接事件 或者 直接绑定事件 。每次选中的元素触发事件时,就会执行处理程序,不管它直接绑定在元素上,还是从后代(内部)元素冒泡到该元素的

再举一例:

<ul>
    <li><span>hello 1</span></li>
    <li><span>hello 1</span></li>
    <li><span>hello 1</span></li>
    <li><span>hello 1</span></li>
  </ul>

 

<script>
    let ul = document.querySelectorAll('ul')[0]
    let aLi = document.querySelectorAll('li')
    $('ul').on('click','li',function(e){
        console.log(e.target)   //  被点击的元素
        console.log(e.currentTarget)   //  li   
        console.log(e.currentTarget === this)  // true
    })
  </script>

总结:
上面的例子:当li中含有子元素的时候,如果点e.target指的是触发事件的元素,可能是span也可能是li,此时的e.currentTarget指的是selector那个参数,也就是本例中的li。

还有一种情况举例:

  <ul>
    <li>hello 1</li>
    <li>hello 2</li>
    <li>hello 3</li>
    <li>hello 4</li>
  </ul>

 

<script>
    let ul = document.querySelectorAll('ul')[0]
    let aLi = document.querySelectorAll('li')
    for(let i=0;i<aLi.length;i++){  
      aLi[i].addEventListener('click',function(e){
        let oLi1 = e.target  
        let oLi2 = e.currentTarget
        console.log(oLi1)  // li
        console.log(oLi2)  // li
        console.og(oLi1===oLi2)  // true
      })
    }
  </script>

在本例中,事件的目标阶段即li,由于e.currentTarget始终指向添加监听事件的那个对象,即aLi[i],也就是HTML中的li,而e.target指向触发事件监听的那个对象,也是li,因此e.target和e.currentTarget相等,同时也和this相等。

总结

因此不必记什么时候e.currentTarget和e.target相等,什么时候不等,理解两者的究竟指向的是谁即可。

e.target 指向触发事件监听的对象。
e.currentTarget 指向添加监听事件的对象。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z591102/article/details/106357466

智能推荐

Tomcat启动闪退的原因排查_moxiaoran5753的博客-程序员宅基地

windows Tomcat9安装好后,启动闪退,查看日志没找到有用的信息,解决办法:1、使用CMD命令进入到tomcat的bin目录,2、执行./startup.bat命令,得到如下图示结果从中可以看出,tomcat并没有成功启动,然而也未打印出异常信息。3、解决办法,打开startup.bat文件,将最下面这一行call "%EXECUTABLE%" start %CMD_LINE_ARGS%修改为call "%EXECUTABLE%" run %CMD_LINE_ARG

Java Map类型与Json字符串的互相转换_dengwenjieyear的博客-程序员宅基地

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.io.UnsupportedEncodingException;import java...

java实现导出excel_ernesto_ji的博客-程序员宅基地

导出 function exportData(){var url = “ims/ibsc/ibscjxkh/bibscjxassessmentplanchild/BibscJxAssessmentPlanChildController/operation/queryExportData?formId=”+formId;window.open("&lt;%=ViewUtil.getRe...

Mac安装git,使用时提示 cannot run git xcode-select: note: no developer tools were found, requesting install._Siona_xin的博客-程序员宅基地

1. 苹果升级了系统到10.13,导致git不能使用,报以下错误no developer tools were found at ‘/Applications/Xcode.app’, requesting install. Choose an option in the dialog to download the command line developer t...

SpringBoot中,logback.xml里面读取yml里面的参数方式_Doubletree_lin的博客-程序员宅基地

文章目录解决方法步骤一:使用logback-spring.xml步骤二:xml中增加springProperty前应提要:使用logback做日志,日志的输出位置可能要根据部署的环境动态进行配置,而logbackxm.xml中使用${xxx.xxx.xxx}读取不到系统参数解决方法步骤一:使用logback-spring.xml将原先的logback.xml改成logback-spri...

随便推点

群晖的使用_weixin_33827590的博客-程序员宅基地

在过去一段时间,很多公司都是使用PCserver服务器做各部门的文件共享使用,这种做法看似没有太大毛病,但是诸多弊端也是隐藏在里面。其实随着NAS的发展,除了具备PCserver服务器的所有特性以外,NAS还具备即插即用、远程管理、小巧灵便等等一系列优势,也为家庭和小型的企业提供了更多服务。载这两款软件。群晖官网下载中心 笔者记得上次测试群晖产品时DSM还是4.2版...

初级运维工程师面试题_weixin_33744141的博客-程序员宅基地

1)Linux启动大致过程?*BIOS自检*运行系统内核并检测硬件从硬盘启动并运行系统的第一个进程init(LILO和GRUB模式)*init读取系统引导配置文件/etc/inittab,并根据运行级别配置服务/etc/rc.d/rc.localLinux系统缺省的运行级别0为停机,机器关闭1为单用户模式,就像Win下的安全模式2为多用户模式,但是没有NFS支持3为完全的多用...

hive小文件的问题弊端以及合并_CaptainDing的博客-程序员宅基地

小文件的弊端 1、HDFS中每个文件的元数据信息,包括位置大小分块信息等,都保存在NN内存中,在小文件数较多的情况下,会造成占用大量内存空间,导致NN性能下降; 2、在读取小文件多的目录时,MR会产生更多map数,造成GC频繁,浪费集群资源; 3、现在大数据平台文件总数超过30亿,单个NS文件数超过4亿的时候,读写性能会急剧下降,影响到所有读写该...

使用windbg 调试dll内存泄漏(使用vld已经无效果)_zhoutianyou的博客-程序员宅基地

1. 安装windbg2.设置windbg调试方式,这样出现内存泄漏的时候,可以打印出堆栈信息gflags.exe /i test.exe +ust3.单独启动test.exe即可(避免程序依赖相对路径引起无法启动)4.启动windbg, attach to a process,关联刚刚启动的test.exe5.加载symbol.sympath SRV*d:/localsy...

网络安全-pppoe拨号-防火墙的负载分担-ensp_error: the specified address conflicts with anothe_croumin的博客-程序员宅基地

 实验名称:防火墙应用有关实验实验拓扑图:实验需求:1.AR1是一台PPPoE服务器,内网防火墙通过拨号进行获得地址。2.通过所学技术实现对内网PC机的访问外网的数据分流,实现防火墙的负载分担 实验步骤:  1、PPPOEAR1创建地址池[ar1-ip-pool-pppoe1]net 61.67.1.0 m 24创建虚拟模板[ar1]int Vi...

推荐文章

热门文章

相关标签