e.target与e.currentTarget

通过一个例子来看e.target与e.currentTarget的区别与联系

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
</head>
<body>
    <div id="A">我是A
        <div id="B">我是B</div>
    </div>
</body>
</html>

<script>
    var a = document.getElementById('A'),
        b = document.getElementById('B');
    function handler (e) {
        console.log(e.target);
        console.log(e.currentTarget);
    }
    a.addEventListener('click', handler);   
</script>

1. 关于 a.addEventListener('click', handler)

如果写成:b.addEventListener('click', handler),就只有点击b时会在控制台打印出结果,点击a不会打印出任何东西。

image.png

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

2. 代码测试与结果:

  • 点击<div id="A">
    控制台打印出了:


    image.png

说明在点击a时,currentTargetarget都是 a

  • 点击作为子元素的<div id="B">
    控制台打印出:
    image.png

    说明在点击b时,target为b,但currentTarget仍为 a

3. 结论

currentTarget始终是监听事件者,即 直接调用addEventlistener那个节点
target是事件的真正发出者, 即 触发事件的节点,在click事件中就是被点击的节点。

4. 扩展

结合this来看:
this === e.currentTarget 总是为true
this === e.target 有可能不是true

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容