//以a为参数,运行b和c函数,如果a是一个html控件而且包含子控件,则以子控件为参数也运行该函数
  function RunFunction(a,b,c)
  {
   if(b)
   {
    b.call(null,a)
   }
   for(var d=a.firstChild;d;d=d.nextSibling)
   {
    if(d.nodeType==1)
    {
     arguments.callee.call(this,d,b,c)
    }
   }
   if(c)
   {
    c.call(null,a)
   }
  }
  //设置html控件的属性
  function setElementAttribute(a,b,c)
  {
   a.setAttribute(b,c)
  };
  var GEvent_newcopyright="newcopyright";
  var GEvent_click="click";
  var GEvent_contextmenu="contextmenu";
  var GEvent_dblclick="dblclick";
  var GEvent_error="error";
  var GEvent_load="load";
  var GEvent_mousedown="mousedown";
  var GEvent_mousemove="mousemove";
  var GEvent_mouseout="mouseout";
  var GEvent_mouseup="mouseup";
  var GEvent_unload="unload";
  var GEvent_remove="remove";
  var GEvent_mouseover="mouseover";
  var GEvent_closeclick="closeclick";
  var GEvent_addmaptype="addmaptype";
  var GEvent_addoverlay="addoverlay";
  var GEvent_clearoverlays="clearoverlays";
  var GEvent_infowindowclose="infowindowclose";
  var GEvent_infowindowopen="infowindowopen";
  var GEvent_maptypechanged="maptypechanged";
  var GEvent_moveend="moveend";
  var GEvent_movestart="movestart";
  var GEvent_removemaptype="removemaptype";
  var GEvent_removeoverlay="removeoverlay";
  var GEvent_resize="resize";
  var GEvent_zoom="zoom";
  var GEvent_zoomend="zoomend";
  var GEvent_dragstart="dragstart";
  var GEvent_drag="drag";
  var GEvent_dragend="dragend";
  var GEvent_move="move";
  var GEvent_clearlisteners="clearlisteners";
  var AllEvents=[];
  //添加一个事件,参数分别为:对象、事件名称、运行句柄
  function addListener(a,b,c)
  {
   var d=new GEventListener(a,b,c,0);
   AllEvents.push(d);
   return d
  }
  //删除一个事件
  function removeListener(a)
  {
   a.remove();
   RemoveFromArray(AllEvents,a)
  }
  //删除a对象的所有b事件
  function clearListeners(a,b)
  {
   trigger(a,GEvent_clearlisteners,b);//先触发clearlisteners事件
   RunMethodForAll(CopyEventArray(a),function()
   {
    if(this.isEvent(b))
    {
     this.remove();
     RemoveFromArray(AllEvents,this)
    }
   })
  }
  //删除对象a的所有事件
  function clearInstanceListeners(a)
  {
   trigger(a,GEvent_clearlisteners);
   RunMethodForAll(CopyEventArray(a),function()
   {
    this.remove();
    RemoveFromArray(AllEvents,this)
   })
  }
  //删除系统之中的所有事件
  function RemoveAllEvents()
  {
   var a=[];
   var b="__tag__";
   for(var c=0;c<AllEvents.length;++c)
   {
    var d=AllEvents[c];
    var e=d.getSrcObject();//获得事件源
    if(!e[b])
    {
     e[b]=true;
     trigger(e,GEvent_clearlisteners);//删除源上的所有事件
     a.push(e)
    }
    d.remove()
   }
   for(var c=0;c<a.length;++c)//这一段代码比较古怪,不过我觉得很可能是为了防止对象循环引用造成内存不能释放的原因
   {
    var e=a[c];
    if(e[b])
    {
     try
     {
      delete e[b]
     }
     catch(f)
     {
      e[b]=false
     }
    }
   }
   AllEvents.length=0
  }
  //复制事件数组
  function CopyEventArray(a)
  {
   var b=[];
   if(a["__e_"])
   {
    CopyArray(b,a["__e_"])
   }
   return b
  }
  //返回a的事件监视器列表数组
  function getEventArray(a,b)
  {
   var c=a["__e_"];
   if(!c)
   {
    if(b)
    {
     c=(a["__e_"]=[])
    }
    else
    {
     c=[]
    }
   }
   return c
  }
  //触发对象a的b事件
  function trigger(a,b,c,d)
  {
   var e=[];
   //将arguments之后的参数作为运行参数
   CopyArray(e,arguments,2);
   RunMethodForAll(getEventArray(a),function()
   {
    if(this.isEvent(b))
    {
     try
     {
      this.apply(a,e)
     }
     catch(f)
     {
     }
    }
   })
  }
  //实际上这个就是以前的那个AddBuiltInListener
  function addDomListener(a,b,c)
  {
   var d;
   if(browser.type==2&&b==GEvent_dblclick)
   {
    a["on"+b]=c;
    d=new GEventListener(a,b,c,3)
   }
   else if(a.addEventListener)
   {
    a.addEventListener(b,c,false);
    d=new GEventListener(a,b,c,1)
   }
   else if(a.attachEvent)
   {
    var e=callback(a,c);
    a.attachEvent("on"+b,e);
    d=new GEventListener(a,b,e,2)
   }
   else
   {
    a["on"+b]=c;
    d=new GEventListener(a,b,c,3)
   }
   if(a!=window||b!=GEvent_unload)
   {
    AllEvents.push(d)
   }
   return d
  }
  //将c的d方法绑定到a(HTML控件)的b事件
  function bindDom(a,b,c,d)
  {
   var e=.createAdapter(c,d);
   return addDomListener(a,b,e)
  }
  //针对点击,在IE之中特别处理
  function bindClick(a,b,c)
  {
   bindDom(a,GEvent_click,b,c);
   if(browser.type==1)
   {//在IE之中绑定点击的同时绑定双击
    bindDom(a,GEvent_dblclick,b,c)
   }
  }
  //将c的d方法绑定到a(非HTML控件)的b事件
  function bind(a,b,c,d)
  {
   return addListener(a,b,callback(c,d))
  }
  //这个可能是要实现事件冒泡的功能,要知道,在Google原有的事件系统之中,只有浏览器集成的事件可以冒泡,而Google扩展的事件不支持的,
  //这个方法,将c对象的b事件绑定到a对象的b事件,这样就能实现当点击一个GMark的时候,地图也能捕获到点击事件的“冒泡”功能
  //这个方法的使用我还没有看,因此还不知道这个方法会实现哪些功能
  function bindEventToEvent(a,b,c)
  {
   return addListener(a,b,function()
   {
    var d=[c,b];
    CopyArray(d,arguments);
    trigger.apply(this,d)
   })
  }
  //返回一个事件适配器,因为IE之中事件发生时并不将Event对象作为参数传递,因此,必须用该适配器来读取window.event的值
  function .createAdapter(a,b)
  {
   return function(c)
   {
    if(!c)
    {
     c=window.event
    }
    if(c&&!c.target)
    {
     c.target=c.srcElement
    }
    b.call(a,c,this)
   }
  }
  //取得对a的b方法的回调函数
  function callback(a,b)
  {
   return function()
   {
    return b.apply(a,arguments)
   }
  }
  //取得对a的b方法的回调函数,并将第二个参数之后的参数作为调用参数
  function callbackArgs(a,b,c,d)
  {
   var e=[];
   CopyArray(e,arguments,2);
   return function()
   {
    return b.apply(a,e)
   }
  }
  //这是一个listener的对象
  function GEventListener(a,b,c,d)
  {
   var e=this;
   e.object=a;
   e.event=b;
   e.handle=c;
   e.type=d;//listener的类型
   getEventArray(a,true).push(e)
  }
  //移除该listener
  GEventListener.prototype.remove=function()
  {
   var a=this;
   switch(a.type)
   {
    case 1:
     a.object.removeEventListener(a.event,a.handle,false);
     break;
    case 2:
     a.Z.detachEvent("on"+a.event,a.handle);
     break;
    case 3:
     a.object["on"+a.event]=null;
     break;
   }
   RemoveFromArray(getEventArray(a.object),a)
  };
  //判断是否a事件的绑定
  GEventListener.prototype.isEvent=function(a)
  {
   return this.event==a
  };
  //运行该listener的句柄
  GEventListener.prototype.apply=function(a,b)
  {
   return this.handle.apply(a,b)
  };
  //获得该listener的对象
  GEventListener.prototype.getSrcObject=function()
  {
   return this.object
  };
  //静态函数,事件发生时,获得该事件的对象,如果srcElement是文字,则为其父对象
  function GetEventElement(a)
  {
   var b=a.srcElement||a.target;
   if(b&&b.nodeType==3)
   {
    b=b.parentNode
   }
   return b
  }
  //清除a和其包含的控件的所有事件
  function clearNode(a)
  {
   RunFunction(a,clearInstanceListeners)
  };

Google Maps API 2.0解析(3-GEvent事件功能支持)相关推荐

  1. Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程

    Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程 参考文章: (1)Google Maps API v2 an ...

  2. Google Maps API 进级: GoogleMaps常用事件及应用思路1

    转自:http://hi.baidu.com/xfm_zhr/blog/item/8c1790517e87ea888d54302a.html 1.       GoogleMaps常用事件及应用思路 ...

  3. Java解析Google Maps API返回的Json

    Google Maps API是一个很强大的东西,能够进行经纬度的查询和反查等,对于Java,Google提供了一个Webservices,地址为如下形式: http://maps.googleapi ...

  4. Google maps API开发

    Google maps API开发 注:经纬度的查询,找了半天,终于找着活神仙了,(*^__^*) 嘻嘻-- 1.经纬度查询工具:http://www.playgoogle.com/googlemap ...

  5. Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等

    Google Maps API 网络服务 官网地址 : https://developers.google.com/maps/documentation/webservices/?hl=zh-cn 其 ...

  6. Google Maps API实例-地图搜索

    本文实现google maps API主要的函数库 html: <%@ Page Language="C#" AutoEventWireup="true" ...

  7. Google Maps API编程资源大全

    Google Maps API是Google自己推出编程API,可以让全世界对Google Maps有兴趣的程序设计师自行开发基于Google Maps的服务,建立自己的地图网站.以下是我在Googl ...

  8. Google Maps API 代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Google Maps API 简易教程(四)

    Google Maps 类型 一.基本地图类型 Google Maps API支持一下map类型: .ROADMAP(正式的,默认为2D地图) .SATELLITE(逼真的地图) .HYBRID(逼真 ...

最新文章

  1. gsea富集分析结果怎么看_怎么看肝功能检验结果?
  2. 织梦文章主表关联栏目查询 生成静态url语句
  3. android 获取对象,在Android中获取LayoutInflater对象的方法
  4. 缺氧游戏计算机,缺氧PC最低什么配置一览 你觉得高吗
  5. Shell练习(十一)
  6. java怎么自增2_从头认识java-2.3 自增自减与关系操作符
  7. Stream上传插件(Java接口实现)
  8. 黑马程序员_银行业务调度系统
  9. aspupload ,在winows server 2008 下无法使用
  10. 微信怎样诞生:张小龙给马化腾的一封邮件
  11. 软件安全实验——栈溢出漏洞利用
  12. 高等代数---欧几里得空间
  13. php 查询数据传值,php-如何在Laravel中传递数据进行查看?
  14. Linux安全原理简介
  15. MacBook pro新手教程
  16. 自定义店招应该具有的基本功能
  17. 【机器翻译】机器翻译入门
  18. 蓝桥杯 算法训练 Tennis Rackets (50%通过)
  19. layui标签页切换并自动刷新
  20. E. Boxers(贪心)

热门文章

  1. mysql内连接简写_技术分享 | MySQL 的 join_buffer_size 在内连接上的应用
  2. java线程 教程_Java多线程系列教程
  3. 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...
  4. linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程
  5. 分享apache http服务器设置虚拟主机的方法
  6. python 爬虫 使用requests设置代理
  7. Kotlin 在kotlin内使用Java的一些注意(长篇)
  8. 第一个项目GeoQuiz开发总结
  9. http://offlineinstallersofts.com/
  10. 375. Guess Number Higher or Lower II