event.target和event.currentTarget

首先本质区别是:

event.target返回触发事件的元素

event.currentTarget返回绑定事件的元素

事件捕获


事件冒泡

我们为一个元素绑定一个点击事件的时候,可以指定是要在捕获阶段绑定或者换在冒泡阶段绑定。 当addEventListener的第三个参数为true的时候,代表是在捕获阶段绑定,当第三个参数为false或者为空的时候,代表在冒泡阶段绑定。

知道事件有这么一个穿透的过程之后,结合下面的例子,就可以很好来理解event.target和event.currentTarget:

    document.getElementById('a').addEventListener('click', function(e) {

<div id="a">

    <div id="b">

      <div id="c">

        <div id="d"></div>

      </div>

    </div>

</div>

<script>

    document.getElementById('a').addEventListener('click', function(e) {

      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);

    });   

    document.getElementById('b').addEventListener('click', function(e) {

      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);

    });   

    document.getElementById('c').addEventListener('click', function(e) {

      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);

    });   

    document.getElementById('d').addEventListener('click', function(e) {

      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);

    });

</script>

上面事件的绑定都是在冒泡阶段的,当我们点击最里层的元素d的时候,会依次输出:

target:d&currentTarget:d

target:d&currentTarget:c

target:d&currentTarget:b

target:d&currentTarget:a

从输出中我们可以看到,event.target指向引起触发事件的元素,而event.currentTarget则是事件绑定的元素,只有被点击的那个目标元素的event.target才会等于event.currentTarget。

如果我们把事件都绑定在捕获阶段,然后还是点击最里层的元素d,这时event.target还依旧会指向d,因为那是引起事件触发的元素,因为event.currentTaget指向事件绑定的元素,所以在捕获阶段,最先来到的元素是a,然后是b,接着是c,最后是d。所以输出的内容如下:

target:d&currentTarget:a

target:d&currentTarget:b

target:d&currentTarget:c

target:d&currentTarget:d

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