2012-02-28 9 views
2

Google Maps APIを使用するアプリケーションで作業しています。私はjavascriptの以前の経験がありません。私は何をしようとしていることは、次のとおりです。JavaScriptイベントハンドラの範囲

function SpeedMarker(position) { 
    this.speed = 50; 
    this.marker = new google.maps.Marker({ 
     position: position, 
     map: map, 
     icon: 'http://maps.google.com/mapfiles/markerA.png', 
     zIndex: Math.round(position.lat() * -100000) << 5 
    }); 
    google.maps.event.addListener(this.marker, 'click', this.ShowInfoWindow)   
} 

SpeedMarker.prototype.ShowInfoWindow = function() { 
    var contentString = 'stuff'; 
    infowindow = new google.maps.InfoWindow({ 
     content: contentString 
    }); 
    infowindow.open(map, this.marker); 
} 

問題は、クリックイベントがドキュメントオブジェクトで起こるということである、とthis.markerはそのコンテキストに存在しません。

作成したSpeedMarkerオブジェクト内でイベントを処理する方法はありますか?

答えて

5

変更

google.maps.event.addListener(this.marker, 'click', this.ShowInfoWindow); 

var self = this; 
google.maps.event.addListener(this.marker, 'click', function() { 
    self.ShowInfoWindow(); 
}); 

または使用Function.bind(警告:may require shim):

google.maps.event.addListener(this.marker, 'click', this.ShowInfoWindow.bind(this)); 
+0

OK、これはマップをGoogleに特異的であるが、ここではときに何が起こるかだかもしれません上記のコードを実行します(Function.bindではなく)。 - ハンドラが呼び出されると、私はマーカーをクリックせずにコンストラクタを呼び出します(これは、アラート付きで元のバージョンを使用すると発生しません)。 - このハンドラを後で実行しようとすると、Googleマップからエラーが表示されます。私はあなたが匿名関数を見逃していると思っていますが、このようなものを渡しています: '... addListener(これはmapコンテキストにありませんので、私は推測しています.x.xxは存在しません) – user472875

+0

.marker、 'click'、self.ShowInfoWindow()); '...これは正しくありません。 –

+0

* Facepalm * - 私の間違い:(。完璧に働いてくれてありがとう – user472875