事件冒泡
IE事件流,事件被定义为从最具体的元素(文档树中最深的节点)开始触发,然后向上传播至没有那么具体的元素(文档)。
DOM 0 句柄写法
<div id="box" style="height:100px; width:100px; border: 1px solid #000;"></div>
<script type="text/javascript">
box.onclick = function(){
console.log('box');
}
document.body.onclick = function(){
console.log('body');
}
documenet.onclick = function(){
console.log('document');
}
window.onclick = function(){
console.log('window');
}
/*
box
body
document
window
*/
</script>
所有事件会一直冒泡到 window 上吗?
不是,只有现代浏览器(IE9 以上)会冒泡至 window,IE7、IE8 会有差别。
DOM 2 addEventListener写法
<div id="box" style="height:100px; width:100px; border: 1px solid #000;"></div>
<script type="text/javascript">
box.addEventListener('click', function(){
console.log('box');
}, false);
document.addEventListener('click', function(){
console.log('body');
}, false);
documenet.addEventListener('click', function(){
console.log('document');
}, false);
window.addEventListener('click', function(){
console.log('window');
}, false);
/*
box
body
document
window
*/
</script>
事件捕获
由Netscape Communicator团队提出另一种事件流。具体节点应该最后收到事件。
DOM2 才支持
<div id="box" style="height:100px; width:100px; border: 1px solid #000;"></div>
<script type="text/javascript">
box.addEventListener('click', function(){
console.log('box');
}, true);
document.addEventListener('click', function(){
console.log('body');
}, true);
documenet.addEventListener('click', function(){
console.log('document');
}, true);
window.addEventListener('click', function(){
console.log('window');
}, true);
/*
window
document
body
box
*/
</script>
DOM 事件流
DOM2 Events 规范规定事件流分为3个阶段:事件捕获 -> 到达目标 -> 事件冒泡。
事件捕获最先发生,然后实际目标元素接收事件,最后是冒泡。
没有捕获与冒泡的事件
- focus
- blur
- change
- submit
- reset
- select
面试问题
为什么有事件冒泡和事件捕获?
因为当初的设计团队在考虑 页面的哪一部分会触发事件? 这个问题时,有不同的差异。
如图:
当鼠标放在 圆1 上面时,鼠标是否也放 圆2 、圆3 上面呢?
答案明显是 YES。
在当初浏览器开发 IE4开发团队与网景开发团队,都认为:当鼠标点击在小圆时,同时也点击在大圆上面。
但是存在一个顺序的问题,这就是事件顺序:
是先点击小圆,还是后点击小圆的问题。
事件冒泡处理方式 IE 认为目标元素逐级往上冒泡的处理方式, 。
事件捕获处理方式 网景认为是先点击大圆再点击小圆,是捕获流的处理方式,。