JavaScript进阶-事件冒泡与事件捕获
事件冒泡
子组件事件触发父组件事件(先触发子组件事件,然后触发父组件事件)
点击loader__bar
事件捕获
先触发父组件事件,然后触发子组件事件
addEventListener接收三个参数,第三个参数为是否开启事件捕获,默认为false
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#container {
width: 400px;
height: 400px;
background-color: #333;
}
#loader {
width: 200px;
height: 200px;
background-color: #444;
}
#loader__bar {
width: 100px;
height: 100px;
background-color: #aaa;
}
</style>
</head>
<body>
<div id="container">
<div id="loader">
<div id="loader__bar"></div>
</div>
</div>
</body>
<script>
let container = document.getElementById('container');
let loader = document.getElementById('loader');
let bar = document.getElementById('loader__bar');
container.addEventListener('click', (e) => {
console.log('container');
}, true)
loader.addEventListener('click', (e) => {
console.log('loader');
}, true)
bar.addEventListener('click', (e) => {
console.log('bar');
}, true)
</script>
</html>
点击loader__bar
阻止事件冒泡
stopPropagation()和stopImmediatePropagation()
stopPropagation:阻止事件向父组件冒泡,stopImmediatePropagation阻止除当前事件外的事件
stopImmediatePropagation()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#container {
width: 400px;
height: 400px;
background-color: #333;
}
#loader {
width: 200px;
height: 200px;
background-color: #444;
}
#loader__bar {
width: 100px;
height: 100px;
background-color: #aaa;
}
</style>
</head>
<body>
<div id="container">
<div id="loader">
<div id="loader__bar"></div>
</div>
</div>
</body>
<script>
let container = document.getElementById('container');
let loader = document.getElementById('loader');
let bar = document.getElementById('loader__bar');
container.addEventListener('click', (e) => {
console.log('container');
})
loader.addEventListener('click', (e) => {
console.log('loader');
})
bar.addEventListener('click', (e) => {
console.log('bar click');
e.stopImmediatePropagation();
// e.stopPropagation();
})
bar.addEventListener('click', (e) => {
console.log('bar');
})
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#container {
width: 400px;
height: 400px;
background-color: #333;
}
#loader {
width: 200px;
height: 200px;
background-color: #444;
}
#loader__bar {
width: 100px;
height: 100px;
background-color: #aaa;
}
</style>
</head>
<body>
<div id="container">
<div id="loader">
<div id="loader__bar"></div>
</div>
</div>
</body>
<script>
let container = document.getElementById('container');
let loader = document.getElementById('loader');
let bar = document.getElementById('loader__bar');
container.addEventListener('click', (e) => {
console.log('container');
})
loader.addEventListener('click', (e) => {
console.log('loader');
})
bar.addEventListener('click', (e) => {
console.log('bar click');
// e.stopImmediatePropagation();
e.stopPropagation();
})
bar.addEventListener('click', (e) => {
console.log('bar');
})
</script>
</html>
事件委托
借助冒泡机制,将需要绑定的多个子元素的方法绑定到父元素中做统一处理。