K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

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    }
;

posted on 2005-10-21 16:02  K_Reverter  阅读(452)  评论(0编辑  收藏  举报