事件捕获的疑问

<style>
div {padding: 50px;}
 #div1 {background: red;}
 #div2 {background: blue;}
 #div3 {background: green; position: absolute; top: 300px;}
</style>
<script>
window.onload = function() {
        
    var oDiv1 = document.getElementById('div1');
    var oDiv2 = document.getElementById('div2');
    var oDiv3 = document.getElementById('div3');
    
    function fn1() {
        alert( this.id );
    }
    oDiv1.addEventListener('click', function() {
        alert(1);
    }, false);
    oDiv1.addEventListener('click', function() {
        alert(3);
    }, true);
    oDiv3.addEventListener('click', function() {
        alert(2);
    }, false);
    //
    
}
</script>
</head>

<body>
    <div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
    </div>
</body>
</html>

代码如上:当点击div2的时候是先弹出3,再弹出1的;但是直接点击div1的时候是先弹出1,再弹出3的。按照理解点击div1时应该和点击div2一样的弹出顺序啊?希望大神给予解答

阅读 2.3k
2 个回答

因为事件触发是先捕获再冒泡的,所以点击div2时候是先3再1,。
然后直接点击在元素上时,其实是相当于同时触发了捕获和冒泡,这个时候的顺序是根据你代码的绑定事件的先后顺序。

看了一楼的答案我懂了,点了个赞。

就是点击div1的时候,因为没有点击到div1下的子元素,所以只会触发绑定在div1上面的事件。
楼主请看下图,此时对于div1,捕获与冒泡事件均是在中间那一点时触发,就是在同一时间触发,所以这时触发的顺序是按照事件绑定的先后顺序来,而不是非得捕获在前了

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题