Google Maps API的库JS文件分析(4)
在Google Maps API提供的JS文件中,引用了一个后台的JS库文件,该文件针对不同的浏览器有三个版本,这几天因为我想给我的Google Map扩展一些功能,所以研究了这个文件,我现在正打算陆续将我注释过的该文件放在网上,该文件一共有7000多行,我会分段渐渐的注释出来,我是按照分类注释的,所以并不会按照该JS文件顺序。
该文件Google作了处理,所有的变量名都被处理成了简单的a,b,c,d之类,所以理解起来比较费劲。
该JS文件是以IE版本的http://maps.google.com/mapfiles/maps.21.js来分析的,其他的几个我觉得基本的架构也应该差不多,所以我没有仔细看,实际上,这个文件Google也会不停的更新(在我写这个文章的时候,我发现Google已经更新到maps.25.js了),不过我想架构上也不会有太大的变动吧。
由于该文件是在比较复杂,所以难免会出现理解错误的情况,请谅解!
下面是第4个(这个是关于事件处理的代码):
1
//j是GEvent和_Event类,用来提供事件绑定和处理支持
2
function j()
3
{
4
}
5
//当指定的事件触发时,调用指定的listenerFn函数, addListener返回一个变量,这个变量可以作为removeListener的参数.
6
j.addListener=function(a,b,c)
7
{
8
var d=j.getPropertyName(b); //获得事件名称
9
if(a[d])
10
{
11
a[d].push(c)
12
}
13
else
14
{
15
a[d]=[c]
16
}
17
return new Zb(a,d,c)
18
};
19
//移除事件监视器,参数应该是addListener的一个返回值
20
j.removeListener=function(a)
21
{
22
var b=a.instance[a.propertyName];
23
for(var c=0;c<b.length;c++)
24
{
25
if(b[c]==a.listenerFn)
26
{
27
b.splice(c,1); //移除元素
28
return
29
}
30
}
31
};
32
//删除对该事件的所有监视
33
j.clearListeners=function(a,b)
34
{
35
var c=j.getPropertyName(b);
36
a[c]=null
37
};
38
//触发该事件
39
j.trigger=function(a,b)
40
{
41
var c=j.getPropertyName(b);
42
var d=a[c];
43
if(d&&d.length>0)
44
{
45
var e=[];
46
for(var f=2;f<arguments.length;f++)
47
{
48
e.push(arguments[f])
49
}
50
for(var f=0;f<d.length;f++)
51
{
52
var i=d[f];
53
if(i)
54
{
55
try
56
{
57
i.apply(a,e)
58
}
59
catch(g)
60
{
61
z.dump(g) //记录出错情况
62
}
63
}
64
}
65
}
66
};
67
//事件的访问句柄
68
function Zb(a,b,c)
69
{
70
this.instance=a; //事件源
71
this.propertyName=b; //事件名称
72
this.listenerFn=c //执行函数
73
}
74
//返回事件名称
75
j.getPropertyName=function(a)
76
{
77
return"_e__"+a
78
};
79
//对控件a的b事件添加监视,发生时执行c函数,这些都是window.onclick之类系统支持的事件
80
j.addBuiltInListener=function(a,b,c)
81
{
82
if(t.type==3&&b=="dblclick")
83
{
84
a["on"+b]=c;
85
return
86
}
87
if(a.addEventListener)
88
{
89
a.addEventListener(b,c,false)
90
}
91
else if(a.attachEvent)
92
{
93
a.attachEvent("on"+b,c)
94
}
95
else
96
{
97
a["on"+b]=c
98
}
99
};
100
//删除对控件a的b事件的c监视,这些都是window.onclick之类系统支持的事件
101
j.removeBuiltInListener=function(a,b,c)
102
{
103
if(a.removeEventListener)
104
{
105
a.removeEventListener(b,c,false)
106
}
107
else if(a.detachEvent)
108
{
109
a.detachEvent("on"+b,c)
110
}
111
else
112
{
113
a["on"+b]=null
114
}
115
};
116
//将c的d方法绑定到事件
117
j.bindDom=function(a,b,c,d)
118
{
119
var e=j.createAdapter(c,d);
120
return j.addBuiltInListener(a,b,e)
121
};
122
//绑定到点击事件
123
j.bindClick=function(a,b,c)
124
{
125
j.bindDom(a,"click",b,c);
126
if(t.type==1)
127
{
128
j.bindDom(a,"dblclick",b,c)
129
}
130
};
131
//将给定的对象的给定方法绑定到给定的事件,当给定的时间被触发时,指定的方法就会被调用 例如GEvent.bind(map, "move",this, this.onMapMove)
132
j.bind=function(a,b,c,d)
133
{
134
return j.addListener(a,b,function()
135
{
136
d.apply(c,arguments)
137
}
138
)
139
};
140
//返回一个执行实例a的方法的函数,这就是回调(callback)么?
141
j.callback=function(a,b)
142
{
143
var c=function()
144
{
145
return b.apply(a,arguments)
146
};
147
return c
148
};
149
//创建一个事件处理的"适配器"
150
j.createAdapter=function(a,b)
151
{
152
return function(c)
153
{
154
if(!c)
155
{
156
c=window.event
157
}
158
if(c&&!c.target)
159
{
160
c.target=c.srcElement
161
}
162
b.call(a,c) //call方法:调用一个对象的一个方法,以另一个对象替换当前对象,即以a代替当前对象执行b方法,为参数
163
}
164
};
//j是GEvent和_Event类,用来提供事件绑定和处理支持2
function j()3
{4
}5
//当指定的事件触发时,调用指定的listenerFn函数, addListener返回一个变量,这个变量可以作为removeListener的参数.6
j.addListener=function(a,b,c)7
{8
var d=j.getPropertyName(b); //获得事件名称9
if(a[d])10
{11
a[d].push(c)12
}13
else14
{15
a[d]=[c]16
}17
return new Zb(a,d,c)18
};19
//移除事件监视器,参数应该是addListener的一个返回值20
j.removeListener=function(a)21
{22
var b=a.instance[a.propertyName];23
for(var c=0;c<b.length;c++)24
{25
if(b[c]==a.listenerFn)26
{27
b.splice(c,1); //移除元素28
return29
}30
}31
};32
//删除对该事件的所有监视33
j.clearListeners=function(a,b)34
{35
var c=j.getPropertyName(b);36
a[c]=null37
};38
//触发该事件39
j.trigger=function(a,b)40
{41
var c=j.getPropertyName(b);42
var d=a[c];43
if(d&&d.length>0)44
{45
var e=[];46
for(var f=2;f<arguments.length;f++)47
{48
e.push(arguments[f])49
}50
for(var f=0;f<d.length;f++)51
{52
var i=d[f];53
if(i)54
{55
try56
{57
i.apply(a,e)58
}59
catch(g)60
{61
z.dump(g) //记录出错情况62
}63
}64
}65
}66
};67
//事件的访问句柄68
function Zb(a,b,c)69
{70
this.instance=a; //事件源71
this.propertyName=b; //事件名称72
this.listenerFn=c //执行函数73
}74
//返回事件名称75
j.getPropertyName=function(a)76
{77
return"_e__"+a78
};79
//对控件a的b事件添加监视,发生时执行c函数,这些都是window.onclick之类系统支持的事件80
j.addBuiltInListener=function(a,b,c)81
{82
if(t.type==3&&b=="dblclick")83
{84
a["on"+b]=c;85
return86
}87
if(a.addEventListener)88
{89
a.addEventListener(b,c,false)90
}91
else if(a.attachEvent)92
{93
a.attachEvent("on"+b,c)94
}95
else96
{97
a["on"+b]=c98
}99
};100
//删除对控件a的b事件的c监视,这些都是window.onclick之类系统支持的事件101
j.removeBuiltInListener=function(a,b,c)102
{103
if(a.removeEventListener)104
{105
a.removeEventListener(b,c,false)106
}107
else if(a.detachEvent)108
{109
a.detachEvent("on"+b,c)110
}111
else112
{113
a["on"+b]=null114
}115
};116
//将c的d方法绑定到事件117
j.bindDom=function(a,b,c,d)118
{119
var e=j.createAdapter(c,d);120
return j.addBuiltInListener(a,b,e)121
};122
//绑定到点击事件123
j.bindClick=function(a,b,c)124
{125
j.bindDom(a,"click",b,c);126
if(t.type==1)127
{128
j.bindDom(a,"dblclick",b,c)129
}130
};131
//将给定的对象的给定方法绑定到给定的事件,当给定的时间被触发时,指定的方法就会被调用 例如GEvent.bind(map, "move",this, this.onMapMove) 132
j.bind=function(a,b,c,d)133
{134
return j.addListener(a,b,function()135
{136
d.apply(c,arguments)137
}138
)139
};140
//返回一个执行实例a的方法的函数,这就是回调(callback)么?141
j.callback=function(a,b)142
{143
var c=function()144
{145
return b.apply(a,arguments)146
};147
return c148
};149
//创建一个事件处理的"适配器"150
j.createAdapter=function(a,b)151
{152
return function(c)153
{154
if(!c)155
{156
c=window.event157
}158
if(c&&!c.target)159
{160
c.target=c.srcElement161
}162
b.call(a,c) //call方法:调用一个对象的一个方法,以另一个对象替换当前对象,即以a代替当前对象执行b方法,为参数163
}164
};posted on 2005-10-21 16:02 K_Reverter 阅读(457) 评论(0) 收藏 举报

浙公网安备 33010602011771号