了解js中的事件处理模型 | 8月更文挑战

175 阅读2分钟

这是我参与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使用。