事件的三个阶段
- 捕获阶段
- 当前目标阶段
- 冒泡阶段
JS中注册事件的三种方式:
onclick只有事件冒泡,
attachEvent只有两个参数, 只有事件冒泡,
addEventListener三个参数,最后一个参数默认false为事件冒泡,true为事件捕获。所以demo用的addEventListener这个方式
事件冒泡
html部分
<div id="box1" style=" width: 200px;height: 200px;background-color: red;">
<div id="box2" style=" width: 100px;height: 100px;background-color: green;"></div>
</div>
js部分
var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
box1.addEventListener("click", function() {
console.log(this.id);
}, false)
box2.addEventListener("click", function() {
console.log(this.id);
}, false)
document.body.addEventListener("click", function() {
console.log('body');
}, false)
document.addEventListener("click", function() {
console.log('document');
}, false)
当我点击绿色的box2时候,从里往外依次给元素传递事件,后台返回依次是box2,box1,body,document。这就是事件冒泡。
事件捕获
js部分
var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
box1.addEventListener("click", function() {
console.log(this.id);
}, true)
box2.addEventListener("click", function() {
console.log(this.id);
}, true)
document.body.addEventListener("click", function() {
console.log('body');
}, true)
document.addEventListener("click", function() {
console.log('document');
}, true)
当我点击绿色的box2时候,从最外层往里依次传递事件,后台返回依次是document,body,box1,box2,。这就是事件捕获。
最后用一张图总结
阻止事件冒泡有两种方法:
- 标准的DOM方法
e.stopPropagation(); - 非标准的方式 老版本的IE支持
e.cancelBubble = true;