forked from anbang/javascript-notes
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path封装的事件库-第二次.js
91 lines (87 loc) · 3.01 KB
/
封装的事件库-第二次.js
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*on:是负责往数组里安排一个队列的,程序池*/
function on(ele,type,fn){
if(!ele["aEvent"+type]){
ele["aEvent"+type]=[];
}
var aryEvent=ele["aEvent"+type];
for(var i=0;i<aryEvent.length;i++){//防止同一个方法被同事件绑定;
if(aryEvent[i]==fn)return;
}
aryEvent.push(fn);
bind3(ele,type,run);//只会执行一次
}
function off(ele,type,fn){
if(ele["aEvent"+type]){
var aryEvent=ele["aEvent"+type];
for(var i=0;i<aryEvent.length;i++){
if(aryEvent[i]==fn){
// aryEvent.splice(i,1);//数组塌陷解决
aryEvent[i]=null;
return;
}
}
}
}
/*run:负责具体的执行,在这里把IE兼容性全部解决掉;run方法是由系统的事件来触发的,真正绑定的是run方法*/
function run(e){
e=e||window.event;
if(!e.target){
e.target= e.srcElement;
e.pageX=(document.documentElement.scrollLeft||document.body.scrollLeft)+ e.clientX;
e.pageY=(document.documentElement.scrollTop||document.body.scrollTop)+ e.clientY;
e.stopPropagation=function(){e.cancelBubble=true;}//阻止事件传播;
e.preventDefault=function(){e.returnValue=false;}//阻止事件默认行为;
}
/*上面是IE不支持的*/
var a=this["aEvent"+e.type];
for(var i=0;i< a.length;){
/*下面是防止数组塌陷的*/
if(typeof a[i]=="function"){
//a[i].call(this);//this指向当前被绑定元素;
a[i].call(this,e);//this后面加e;就解决了e的兼容性问题;因为想this主体传了e;具体的函数就不需要再解决e的兼容了;
i++;
}else{
/*如果是空的,删掉;不删也是可以的*/
a.splice(i,1);
}
}
}
/*bind是解决好this关键字,解决了重复绑定*/
function bind3(ele,type,fn){
if(ele.addEventListener){
ele.addEventListener(type,fn);
}else{
var fnTemp=function(){fn.call(ele)};//解决fn的this关键字
if(!ele["myBind"+type]){
ele["myBind"+type]=[];
}
var oBind=ele["myBind"+type];
for (var i=0;i< oBind.length;i++){//防止重复绑定的;
if(oBind[i].flag==fn){
return;
}
}
oBind.push(fnTemp);
fnTemp.flag=fn;
ele.attachEvent("on"+type,fnTemp);
}
};
function unbind3(ele,type,fn){
if(ele.removeEventListener){
ele.removeEventListener(type,fn);
console.log("标准浏览器的"+type+"已经解绑!")
}else{
console.log("IE6/7/8的"+type+"已经解绑!")
var oBind=ele["myBind"+type];
if(oBind&& oBind.length){
for(var i=0;i< oBind.length;i++){
/*下面是确定要解绑的fn;*/
if(oBind[i].flag===fn){
ele.detachEvent("on"+type,oBind[i]);
oBind.splice(i,1);
return;
}
}
}
}
};