这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
1.事件对象
e = event || window.event
*window.event 针对IE
*event是浏览器把当下触发事件的元素打包好的一个对象,放在处理函数的参数中。
2.事件源对象
target = e.target || e.srcElement
*事件源对象是事件对象的一个属性,这个属性标记和记录了事件的真正源头。
*target属性IE没有,srcElement真对IE。chrome两个都有,火狐没有srcElement
3.事件处理模型
(1)事件冒泡(bubble)
结构上(非视觉上)嵌套关系的元素,存在事件冒泡功能,即同一事件,自子元素冒泡向父元素(自底向上)
(2)事件捕获
结构上(非视觉上)嵌套关系的元素,存在事件捕获功能,即同一事件,自父元素冒泡向子元素(自顶向下)。注:IE没有事件捕获功能。Chrome以及最新的Firefox和最新的operay有事件捕获。
注意:
a.一个对象的一个事件类型,所绑定的一个处理函数,只能存在一个事件模型,要么捕获,要么冒泡。
b.触发顺序:
如果一个对象的一个事件类型,绑定了两个处理函数,一个冒泡一个捕获,那么他们的触发顺序是:先捕获,后冒泡。
c.冒泡变成捕获的方法:
ele.addEventListener("事件类型",处理函数fn,true);
从false改成false的时候,这个事件的处理函数立即变成里事件捕获。
d.focus、blur、change、submit、reset、select等事件不存来冒泡功能。
事件委托机制
利用事件冒泡和事件源对象进行事件委托:
优点:
性能好,不需要循环所有元素一个个绑定事件。
灵活,当有新的子元素时,不需要重新绑定事件。
取消冒泡和阻止默认事件
1.取消冒泡
(1)w3c标准 event.stopPropagation(); 不支持IE8及以下
(2)IE独有的:event.cancelBubble = true;后面Chrome也实现了。
2.阻止默认事件
默认事件,比如:表单提交、a标签跳转、右键出菜单等
(1)return false;以对象属性的方式注册的事件才生效(句柄)
(2)event.preventDefault();w3c标准,IE8及以下不兼容
(3)event.returnValue = false;//IE使用。