GMapsAPI と prototype.js の併用を止める

本館の Google Maps API RSS 1.0 から地図表示するページでは Google Maps APIprototype.js 1.3.1 を混ぜて使っていました。この2つはクリティカルな部分が重複していますので「いつかは衝突するだろう」と懸念してましたが、Ajax と Event 回りのハンドラの取り回しは prototype.js の方が扱いやすいので混ぜて使っていたのです。
そして、ついに Google Maps API が 2.66 にアップデートされたとき、懸念が現実となり、map2.addOverlay(marker) 実行でエラーが発生するようになりました。
というわけで、しぶしぶながら、ようやく Google Maps API 一本に統一することにしました。
まずは、RSSXmlHttpRequest で取ってくる部分です。GDownloadUrl() 関数が使えるようになりましたので、Google Maps API でも記述が楽になりました。prototype.js 流儀の Function.bind() を定義したい気持ちをおさえて、用心のために止めることに。

+  var self = this;
+  GDownloadUrl(url,function(data,responseCode){
+    var xml = GXml.parse(data);
+    self.items = self.parser.parseResponse(xml.documentElement);
+    self.redraw();
+  });
-  new Ajax.Request(url,{
-    method:'get',
-    onSuccess:this.onloadResponse.bind(this)
-  });

-GeoItems.prototype.onloadResponse = function(req) {
-  this.items = this.parser.parseResponse(req);
-  this.redraw();
-}

続いて、リストのアンカー要素に click イベントをアタッチする部分も prototype.js の Event クラスを使っていましたので、Google Maps API の GEvent を使うように変更しました。GEvent では、removeListener() へ observer だけ渡せばいいので、開放処理のために記録しておくべきものが減るのがいい点です。

+  this.listObservers.push(observer);
+  GEvent.addDomListener(a,'click',observer);
-  this.listObservers.push([a,'click',observer,false]);
-  Event.observe(a,'click',observer,false);

開放する方はこうなりました。

     for (var i = 0; i<this.listObservers.length; i++) {
+      GEvent.removeListener(listObservers[i]);
+      this.listObservers[i] = null;
-      Event.stopObserving.apply(Event, this.listObservers[i]);
-      this.listObservers[i][0] = null;
     }

他に、捨てがたい $() 関数の簡易版を作っておきました。Google Maps API でも e() という名で似たものが定義してありますが、関数名が変更されたら嫌なので自分で定義しておきました。

+function $(x) {
+  if (typeof x == 'string')
+    x = document.getElementById(x);
+  return x;
+}