2012-02-28 3 views
2

Я работаю над приложением, использующим API Карт Google. У меня нет предыдущего опыта работы с javascript. То, что я пытаюсь сделать, это следующее:JavaScript Event Handler Scope

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

ОК, так что это может быть специфическими для Google Maps, но вот что происходит, когда Я запускаю код выше (а не Function.bind): - обработчик вызывается, когда я вызывать конструктор, не нажимая на маркер (это не происходит, если я использую исходную версию с предупреждением) -если я пытаюсь запустить этот обработчик позже, я получаю сообщение об ошибке из карт Google, говоря: не удалось найти свойство ' xx ', (я предполагаю, потому что я больше не в контексте карты, поэтому this.xx не существует) – user472875

+0

Я предполагаю, что вы пропустили анонимную функцию и передаете что-то вроде этого: '... addListener (this .marker, 'click', self.ShowInfoWindow()); '... что неправильно. –

+0

* Facepalm * - моя ошибка :(Работает отлично сейчас благодаря – user472875