开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
DOM事件Event上有两个对象,target和currentTarget。我们都知道这俩有区别,MDN上对两者的解释:
target: 是对事件被分派对象的引用currentTarget: 是在事件冒泡或捕获阶段的当前对象
只看解释看的云里雾里,那么在实际应用中,某个元素通过data-*的方式绑定了一些自定义属性,要想获取这些属性,首先就要在触发事件时获取绑定元素的对象,那么该使用target还是currentTarget呢?
比如上图中的组件,如果需要在点击Menu.Item的时候能够获取到data-id, data-name的内容,应该将点击事件绑定到外层的Menu.Item上,还是内层的span元素上呢?分析发现,其实绑定到内层的span上会有个问题:只有在精确选中span时时间才会触发,点击span外的元素会无法触发事件,这其实很不友好。
所以应该是将事件绑定到Menu.Item上,接下来又有个问题:在获取data-*等对象时是通过target还是currentTarget去获取呢?因为在DOM上点击事件默认就是冒泡的,也就是说点击Menu.Item内的子元素都会触发父元素的点击事件。如果通过点击内层元素span触发事件,这时候就有了两个对象:
- 触发事件的对象
span - 绑定事件的对象
Menu.Item,也就是事件监听者
分别对应target和currentTarget,通过一张图来说明:
这就很明了啦:
- target: 触发事件的对象
- currentTarget: 绑定事件(监听事件)的对象
所以需要根据不同的需求去判断是使用target还是currentTarget,比如文中描述的需求,需要获取在点击的时候父级对象上绑定的属性,就使用currentTarget;而如果是全局监听的事件,比如埋点的场景,需要获取触发事件对象的属性,就使用target了。