通常我们只考虑一个dom绑定一种事件类型。(碰到一个问题。一个dom分别绑定了冒泡和捕获类型的事件)在一个dom元素同时绑定冒泡和捕获的该怎么处理。
我们来看一下的问题。下面事件的触发顺序是如何的
<body>
<div class="warpper">
<div class="context">点我</div>
</div>
<script>
var divw=document.getElementsByClassName('warpper')[0];
var divc=document.getElementsByClassName('context')[0];
divw.addEventListener('click',function(){
console.log('D')
});
divc.addEventListener('click',function(){
console.log('C')
})
divc.addEventListener('click',function(){
console.log('A')
},true);
divw.addEventListener('click',function(){
console.log('B')
})
//结果为CADB
</script>
</body>
通过分析:
父级事件没有捕获事件,所以不会优先触发。
当一个子级事件同时有冒泡和捕获的时候(按代码顺序执行)
当子级为捕获,父级为冒泡的时候同样也可以触发父级事件(顺序为子到父)
不难看出以上题的答案是 CADB(由子级触发到父级)
<body>
<div class="warpper">
<div class="context">点我</div>
</div>
<script>
var divw=document.getElementsByClassName('warpper')[0];
var divc=document.getElementsByClassName('context')[0];
divw.addEventListener('click',function(){
console.log('D')
});
divc.addEventListener('click',function(){
console.log('C')
})
// divc.addEventListener('click',function(){
// console.log('A')
// },true);
divw.addEventListener('click',function(){
console.log('B')
})
//结果为CDB
</script>
</body>
<body>
<div class="warpper">
<div class="context">点我</div>
</div>
<script>
var divw=document.getElementsByClassName('warpper')[0];
var divc=document.getElementsByClassName('context')[0];
divw.addEventListener('click',function(){
console.log('D')
});
// divc.addEventListener('click',function(){
// console.log('C')
// })
divc.addEventListener('click',function(){
console.log('A')
},true);
divw.addEventListener('click',function(){
console.log('B')
})
//结果为ADB
</script>
</body>
<body>
<div class="warpper">
<div class="context">点我</div>
</div>
<script>
var divw=document.getElementsByClassName('warpper')[0];
var divc=document.getElementsByClassName('context')[0];
// divw.addEventListener('click',function(){
// console.log('D')
// });
divc.addEventListener('click',function(){
console.log('C')
})
divc.addEventListener('click',function(){
console.log('A')
},true);
// divw.addEventListener('click',function(){
// console.log('B')
// })
//结果为CA
</script>
</body>
通过以上可以看出。事件都是按代码顺序执行的(切换代码顺序时候也一样,可以自己尝试)
当我们给父级事件冒泡改成捕获时候会优先触发:
<body>
<div class="warpper">
<div class="context">点我</div>
</div>
<script>
var divw=document.getElementsByClassName('warpper')[0];
var divc=document.getElementsByClassName('context')[0];
divw.addEventListener('click',function(){
console.log('D')
});
divc.addEventListener('click',function(){
console.log('C')
})
divc.addEventListener('click',function(){
console.log('A')
},true);
divw.addEventListener('click',function(){
console.log('B')
},true)
//结果为BCAD
</script>
</body>
小结:
子级的父级(或父级以上)有捕获类型事件优先触发。
都为冒泡(子级为捕获),则按点击的dom元素事件向上传递执行(还有代码的顺序)