今天遇到一件很诡异的事情。我在body上监听keyup事件,但是在chrome上在我选中文字或双击鼠标是会触发keyup事件,在IE和火狐上均无此现象,最后通过jock的帮助,发现是有道词典影响的。很无奈,假如知道明白这些事件关系的话,就不会发生如上问题了。今天就理一下,事件的问题。以上知识,是通过在javascript高级编程上学习的。
温习一下事件知识吧。
事件流:描述页面中接收事件的顺序。
有两种事件流。一种是典型的事件冒泡流。IE是事件冒泡流。
另一种是事件捕获流。
我概述一下不同的点。
其实际应用来说,我们知道的事件冒泡流已经够用了。事件冒泡流讲的是,
<html>
<body>
<div> </div>
</body>
</html>
div是会首先触发click事件的,紧拉着body上会触发事件上,而后是html.而事件捕获流则不然 ,首先会在经捕获阶断,html首先捕获到事件,而后是body,之后停止,然后处于目标阶断,而后是事件冒泡阶断。书上说的是,处于目标阶断是会开始触发事件的,而事件冒泡又会在目标上触 发事件,按它的道理上说,有可能会执行两次事件,但我没有遇到过这种情况。
现在我写习绑定事件的方法。
var EventUtil = {
addEventHandler:function(element,type,handler){
if(element.addEventLIstener){
element.addEventLIstene(type,handler,false);
}else if(element.attachEvent){
element.attachEvent('on'+type,handler);
}else{
element['on'+type]= handler;
}
}
};
因为ie attachEvent后加进去的事件先执行,其它浏览器则是先绑定的事件先执行,后绑定 的事件后执行,所以下面我写了个简单的方法做兼容处理。实际过程 中可能用不到。
var EventUtil = {
handlerArray: [],
addEventHandler:function(element,type,handler){
EventUtil.handlerArray.push(handler);
if(element.addEventListener){
element.addEventListener(type,EventUtil.deligateHandler,false);
}else if(element.attachEvent){
element.attachEvent('on'+type,EventUtil.deligateHandler);
}else{
element['on'+type]= deligateHandler;
}
},
deligateHandler:function(){
var obj= EventUtil.handlerArray.pop();
while(obj){
obj();
obj= EventUtil.handlerArray.pop();
}
}
};
这里有人很疑问,为什么我加了一个用户代理函数呢,因为ie在attachEvent加入多个事件的时候,是从最后加入的那个事件开始执行到最开始加的事件,而其它浏览器则相反。