封装一个事件处理函数,解决了跨浏览器问题以及多个事件绑定
红皮书13.3.3定义了一个事件处理程序EventUtil1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var EventUtil={
addHandler:function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,handler);
}else{
element["on"+type]=handler;
}
},
removeHandler:function(element,type,handler){
if(element.removeEventListener){
element.removeEventListener(type,handler,false);
}else(element.detachEvent){
element.detachEvent("on"+type,handler);
}else{
element["on"+type]=null;
}
}
};
这个问题要从DOM发展来说了
DOM0级
- 小写element.onclick=function(){};
- 简单
- 跨浏览器
- 冒泡阶段注册事件处理程序
- 移除直接element.onclick=null;
DOM2级
- element.addEventListener(“click”,function(){},false);
*三个参数:事件名,函数,布尔值。true,捕获阶段调用事件处理程序false,冒泡阶段调用事件处理程序 - 可以添加多个事件处理程序,依次执行
- 移除element.removeEventListener(“click”,handler,false);参数要和Add的相同
跨浏览器隔离浏览器差异
为确保大多数浏览器下一致运行,只需要关注冒泡阶段1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40var EventUtil={
addHandler:function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,handler);
}else{
element["on"+type]=handler;
}
},
getEvent:function(event){
return event?event:window.event;
},
getTarget:function(event){
return event.target||event.srcElement;
},
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault;
}else{
event.returnValue=false;
}
},
removeHandler:function(element,type,handler){
if(element.removeEventListener){
element.removeEventListener(type,handler,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,handler);
}else{
element["on"+type]=null;
}
},
stopPropagation:function(event){
if(event.stopPropagation){
event.stopPropagation;
}else{
event.cancelBubble=true;
}
}
};
事件委托
13.5.1利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
1 |
|
事件委托比事件绑定优点:占内存小,耗时少