美文网首页
js 事件机制

js 事件机制

作者: 鹏雨燕 | 来源:发表于2020-05-19 11:37 被阅读0次

    在分析react-window的源代码时react-scroll,监听dom的滚动事件取值往往都是event.currentTarget,为什么不是event.target呢?

    要彻底了解这两者的区别,我们要先了解浏览器中事件传递的机制冒泡捕获

    <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>
    
    捕获
    冒泡

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

    在上述代码块中,先点击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

    相关文章

      网友评论

          本文标题:js 事件机制

          本文链接:https://www.haomeiwen.com/subject/eeucohtx.html