1、事件对象
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
什么时候会产生Event 对象呢?
例如:当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象。
事件通常与函数结合使用,函数不会在事件发生前被执行!
使用场景即:
var oDIv = document.getElementById('box');oDiv.onclick = function(event){//.........}
2、事件流
2.1、事件流发展史
见:javascript事件系统的发展史 - 司徒正美 - 博客园
2.2、冒泡(由下到上)
意思就是说,假如用户单击了一个元素,该元素拥有一个click事件,那么同样的事件也将会被它的祖先触发,这个事件从该元素开始一直冒泡到DOM树的最上层,这一过程称为事件冒泡。
2.3、捕获(由上到下)
事件捕获和事件冒泡是相反的,也就是说,当用户触发了一个事件的时候,这个事件是从DOM树的最上层开始触发一直到捕获到事件源。
2.4、事件流的写法以及实现方式
标准实现方式使用关键词addEventListener
,假如你想要给某一个元素添加事件,现在就可以这样写element.addEventListener(eventType, fn, false)
dom对象.addEventListener(事件类型, 回调函数, 事件机制)
这里的事件类型表示你要使用哪种事件类型比如click
,回调函数里面写着触发此事件你要做什么事情,事件机制分为冒泡和捕获,如果为false
表示事件冒泡,为true
表示事件捕获。
IE写法:
dom对象.attachEvent(eventType, fn)
第一个参数表示事件类型,第二个是回调。这种写法兼容IE,IE没有实现事件捕获。
3、关于event对象
在触发的事件的函数里面我们会接收到一个event对象,通过该对象我们需要的一些参数,比如说我们需要知道此事件作用到谁身上了,就可以通过event的属性target
来获取到(IE暂且不谈),或者想阻止浏览器的默认行为可以通过方法preventDefault()
来进行阻止。以下是event对象的一些属性和方法。
IE
属性(除了上面的鼠标/事件属性,IE 浏览器还支持下面的属性)
标准 Event 属性 下面列出了 2 级 DOM 事件标准定义的属性
4.Event对象的一些兼容写法
获得event对象兼容性写法 event || (event = window.event);获得target兼容型写法 event.target||event.srcElement阻止浏览器默认行为兼容性写法 event.preventDefault ? event.preventDefault() : (event.returnValue = false);阻止冒泡写法 event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
事件绑定和取消事件绑定方法的形式
//事件绑定function on(dom, eventType, fn) {if(dom.addEventListener) {dom.addEventListener(eventType, fn);} else {if(dom.attachEvent) {dom.attachEvent('on' + eventType, fn);}}//取消事件绑定function un(dom, eventType, fn) {if(dom.removeEventListener) {dom.removeEventListener(eventType, fn, false);} else {if(dom.detachEvent) {dom.detachEvent("on" + eventType, fn)}}}
5.事件冒泡和事件捕获demo
<!DOCTYPE html><html><head><meta charset="utf-8"><title>bubble event</title><style type="text/css">body{margin:0;}#one{width:500px;height:500px;background:rgb(255,0,0);border: 1px solid transparent;}#two{width:400px;height:400px;margin: 0 auto;margin-top: 50px;background:rgb(255,50,50);border: 1px solid transparent;}#three{width:300px;height:300px;margin: 0 auto;margin-top: 50px;background:rgb(255,100,100);border: 1px solid transparent;}#four{width:200px;height:200px;margin: 0 auto;margin-top: 50px;background:rgb(255,150,150);}</style></head><body><div id='one'><div id='two'><div id='three'><div id='four'></div></div></div></div><script>var one = document.getElementById('one');var two = document.getElementById('two');var three = document.getElementById('three');var four = document.getElementById('four');var useCapture = false; //false为冒泡获取【目标元素先触发】 true为捕获获取【父级元素先触发】one.addEventListener('click', function(event) {event || (event = window.event);console.log(event);console.log('one');}, useCapture);two.addEventListener('click', function() {console.log('two');}, useCapture);three.addEventListener('click', function() {console.log('three');}, useCapture);four.addEventListener('click', function() {console.log('four');}, useCapture);/*false冒泡点击four div输出结果:four three two one true捕获点击four div输出结果: one two three four*/</script></body></html>
参考资料:javascript event(事件对象)详解 - Sunshine - 博客园