一、冒泡
冒泡是从下向上(内->外),DOM元素绑定的事件被触发时,此时该元素为目标元素,目标元素执行后,它的父级元素绑定的事件会按向上的顺序执行。
addEventListener函数的第三个参数设置为false说明不是捕获事件,即冒泡事件。
- class="one">
- one
- class="two">
- two
- class="three">
- three
- class="four">
- four
-
-
-
-
- <script>
- document.querySelector('.one').addEventListener('click', e => {
- console.log('one')
- }, false)
- document.querySelector('.two').addEventListener('click', e => {
- console.log('two')
- }, false)
- document.querySelector('.three').addEventListener('click', e => {
- console.log('three')
- }, false)
- document.querySelector('.four').addEventListener('click', e => {
- console.log('four')
- }, false)
-
- // 点击one,输出one;
- // 点击two,输出two one;
- // 点击three,输出 three two one;
- // 点击four,输出 four three two one;
- script>
二、捕获
捕获则和冒泡相反,目标元素被触发后,会从目标元素的最顶层的父级元素事件往下执行到目标元素为止。
将addEventListener函数的第三个参数设置为true即可
操作之前的dom元素:
点击one,输出one;
点击two,输出one two;
点击three,输出one two three;
点击four,输出one two three four;
三、事件委托
事件委托,通俗来讲,就是把一个元素响应事件的函数委托给另一个元素,实现机制就是事件冒泡。
假如ul列表中有很多个li,需要给这些li添加点击事件,会消耗大量的内存,可以把点击事件加到ul上,点击的时候再去匹配目标元素li
jquery中的事件委托是这样实现的:
1、绑定事件:
$('.one').on('click', '.four', function() {
console.log('点击four')
})
2、删除委托事件
$('.one').delegate('click', '.four', function() {
console.log('点击four')
})