冒泡阶段就是事件从最顶层的子节点一步步冒泡到各级父元素阶段
addEventListener("eventName", doSomething, false) , 第三个Boolean参数为 true 时, 表示事件处理程序注册在时间捕获阶段, 为 false 时, 注册在冒泡阶段.
事件冒泡是一个从后代节点向祖先节点冒泡的过程,这个可以理解吧。
事件捕获就正好相反,是一个从祖先节点到后点节点的过程。
IE只支持冒泡,不支持捕获。
以标准浏览器为例:
<div id="d1"><div id="d2"></div>
</div>
<script>
//按下边的方法绑定事件,当点击d2的时候console的顺序是 d2 clicked,d1 clicked
//第三个参数是false,是绑定在冒泡阶段
document.getElementById('d1').addEventListener('click', function(){
console.log('d1 clicked')
}, false)
document.getElementById('d2').addEventListener('click', function(){
console.log('d2 clicked')
}, false)
//按下边的方法绑定事件,当点击d2的时候console的顺序是 d1 clicked,d2 clicked
//第三个参数是true,是绑定在捕获阶段
document.getElementById('d1').addEventListener('click', function(){
console.log('d1 clicked')
}, true)
document.getElementById('d2').addEventListener('click', function(){
console.log('d2 clicked')
}, true)
</script>
在各种浏览器中存在三种事件模型:原始事件模型,DOM2事件模型,IE事件模型。
其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE以外的所有主流浏览器支持.
原始事件模型:
在原始事件模型中(也有说DOM0级),事件发生后没有传播的概念,没有事件流。北大青鸟http://www.kmbdqn.cn/认为事件发生,处理,结束,就这么简单。监听函数只是元素的一个属性值,通过指定元素的属性值来绑定监听器。书写方式有两种:
(1)HTML代码中指定属性值:
(2)在js代码中指定属性值:document.getElementsByTagName(‘input’)[0].onclick=func
优点:所有浏览器都兼容
缺点:
1.逻辑与显示没有分离
2.相同事件的监听函数只能绑定一个,后绑定的会覆盖掉前面的
3.无法通过事件的冒泡、委托等机制。
DOM2事件模型
此模型是W3C制定的标准模型。W3C制定的事件模型中,一次事件的发生包含三个过程:
(1)事件捕获阶段。事件被从document一直向下传播到目标元素,在这过程中依次检查经过的节点是否注册了该事件的监听函数,若有则执行。
(2)事件处理阶段。事件到达目标元素,执行目标元素的事件处理函数.
(3)事件冒泡阶段。事件从目标元素上升一直到达document,同样依次检查经过的节点是否注册了该事件的监听函数,有则执行。
所有的事件类型都会经历"事件捕获阶段"但是只有部分事件会经历"事件冒泡阶段"阶段,例如submit事件就不会被冒泡。
e.target与e.currentTarget是干什么的?
e.target获取当前实际触发事件节点,e.currentTarget获取获取当前监听节点。
11111
$('div').on('click',function(e){console.log(e.currentTarget)console.log(e.target)})
如果点击span的输出:
li对象
span对象
点击li的非span区域,输出
li对象
li对象
preventDefault与stopPropagation是干什么的