[5]跨浏览器中事件
- 做前端兼容性是个躲不开的话题,当你写出来的代码兼容性越强说明你的功底越深。所以在这里探讨下事件event的兼容性问题。event兼容性问题主要是IE浏览器与其他浏览器事件处理的区别,有如下几个方面需要了解:
- IE事件模型
- 事件的兼容性写法
IE事件模型
- IE支持的事件是中间模型,这个模型有区别与DOM Level 0 Events和DOM Level 2 Events。IE事件模型包括Event对象,但event并不会传递给事件句柄函数,而是作为Window对象的属性。另外IE事件模型不支持捕获形式Capturing的事件传播形式,只支持冒泡Bubbling事件传播。
- IE Event对象
属性如下:
- type(String),声明事件的类型。该属性的值是删除前缀on的事件名称,如click、mouseover;与DOM Event对象的type属性兼容。
- srcElement(node), 发生事件的文档元素。与DOM Event对象的target属性兼容。
- cancelBubble(boolean), IE Event对象没有stopPropagation()函数,所以如果需要阻止事件冒泡则需要通过设置cancelBubble的值,为true的时候表示阻止当前事件冒泡。
- returnValue(boolean), IE Event对象没有preventDefault()函数,所以如果需要阻止浏览器的默认行为则需要通过设置returnValue的值,为false的时候表示阻止当前标签的浏览器默认行为。
- IE事件句柄的注册
- IE事件的注册是通过使用attachEvent()方法和detachEvent()方法,与DOM Event中的addEventListener()和removeEventListener()类似,但是以下几点不同:
- 由于IE事件模型只支持事件的冒泡传播方式,因此attachEvent()方法和detachEvent()方法都只有两个参数,分别是事件类型和句柄函数。
- 传递给IE方法的事件类型与DOM Event中有所区别,DOM Event使用的时候不需要带前缀on,而IE Event则需要。比如说对于点击事件,在DOM Event事件中则是用click进行绑定,而在IE Event则需要使用onclick绑定。
- 用attachEvent()注册的函数将被作为全局函数调用,而不是作为发生事件的文档元素的方法。也就是说,在attachEvent()注册的时间句柄执行时,关键字this引用的是window对象,而不是事件的目标元素。
4.attachEvent()允许同一事件句柄函数注册多次。当指定类型的一个事件发生的时候,注册函数被调用的次数和它被注册的次数一样多。
事件的兼容性写法
获取event对象
1
var event = event || window.event;
或者写成:
1
2
3
4var event;
if(event){
event = window.event;
}获取事件发生的文档元素
1
var _srcElemtn = event.target || event.srcElement
阻止当前事件冒泡
1
2
3
4
5if(event.stopPropagation){
event.stopPropagation();
} else {
event.cancelBubble = true;
}阻止浏览器的默认行为
1
2
3
4
5if(event.preventDefault){
event.preventDefault();
} else {
event.returnValue = false;
}