内容:
1.事件复习
2.事件冒泡与事件捕获
3.事件委托
1.事件复习
(1)事件
事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器
下面的链接描述了所有事件:https://developer.mozilla.org/en-US/docs/Web/Events
(2)事件绑定
事件绑定有3种方法,前两钟方法在这里不介绍,主要看第三种:
addEventListener方法(使用事件监听绑定事件)
addEventListener:
1 element.addEventListener(event, function, useCapture)
2 event : (必需)事件名,支持所有 DOM事件 注:事件名要去掉开头的on
3 function:(必需)指定要事件触发时执行的函数
4 useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false
2.事件冒泡与事件捕获
- 事件冒泡:从触发事件的那个节点一直到document,是自下而上的去触发事件
- 事件捕获:指从document到触发事件的那个节点,即自上而下的去触发事件
- 事件委托:利用了事件冒泡的原理
补充:绑定事件方法(addEventListener)的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。该参数默认为false,当对一个dom节点触发事件时,若外层的节点也设置了相应的事件函数,就会使外层的节点也触发自己的事件函数,而如果设置该参数为true,当对一个dom节点触发事件时,将从最外层开始触发事件而不是从这个dom节点开始!
阻止事件冒泡:event.cancelBubble = true
取消事件冒泡:
if(typeof e.cancelBubble == 'undefined'){
e.stopPropagation(); // 兼容IE
} else{
e.cancelBubble = true;
}
事件冒泡实例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>事件冒泡和事件捕获</title>
<style>
#id1 {
background: lightblue;
padding: 20px;
}
#id2 {
background: lightyellow;
padding: 20px;
}
</style>
</head>
<body>
<div id='id1'>
<div id="id2">
<button id='id3'>id3 按钮</button>
</div>
</div>
<script>
var id1 = document.querySelector('#id1');
var id2 = document.querySelector('#id2');
var id3 = document.querySelector('#id3');
// 事件冒泡:
id1.addEventListener('click', function(event){
console.log('click id1', event)
});
id2.addEventListener('click', function(event){
console.log('click id2', event)
});
id3.addEventListener('click', function(event){
console.log('click id3', event) // 阻止事件冒泡
// event.cancelBubble = true
});
</script>
</body>
</html>
事件捕获实例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>事件冒泡和事件捕获</title>
<style>
#id1 {
background: lightblue;
padding: 20px;
}
#id2 {
background: lightyellow;
padding: 20px;
}
</style>
</head>
<body>
<div id='id1'>
<div id="id2">
<button id='id3'>id3 按钮</button>
</div>
</div>
<script>
var id1 = document.querySelector('#id1');
var id2 = document.querySelector('#id2');
var id3 = document.querySelector('#id3'); // 事件捕获:
// addEventListener 的第三个参数 useCapture 设置为true
id1.addEventListener('click', function(event){
console.log('capture click id1', event)
}, true);
id2.addEventListener('click', function(event){
console.log('capture click id2', event)
}, true);
id3.addEventListener('click', function(event){
console.log('capture click id3', event)
}, true);
</script>
</body>
</html>
3.事件委托
事件委托相关概念
=== 在前端中一些元素是动态添加的
对于这样的元素, 我们没办法实现绑定事件
我们可以把 click 事件绑定在事先存在的父元素上
通过父元素响应click事件 调用相应的事件响应函数
而事件响应函数会被传入一个参数, 就是事件本身
然后在运行的时候通过 event.target 属性(发起事件的元素,例如某个按钮)
来检查被点击的对象是否是需要的对象, 如果是就可以对这个对象进行操作, 这个概念就是事件委托
事件委托实例:
<!-- author: wyb -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>事件委托实例</title>
</head>
<body> <div id="test">
<button class="i1">按钮1</button>
<button class="i2">按钮2</button>
<button class="i3">按钮3</button>
</div> </body> <script>
// 事件委托:
document.querySelector("#test").addEventListener("click", function (event) {
var target = event.target
log(target)
if(target.classList.contains("i1")){
alert("点击了按钮1")
}else if(target.classList.contains("i2")){
alert("点击了按钮2")
}else if(target.classList.contains("i3")){
alert("点击了按钮3")
}
})
</script> </html>