Google Maps API v3 - почему нет контекста с событиями? - PullRequest
3 голосов
/ 17 марта 2011

Использование Google Maps API v3 впервые, и у меня есть карта с кучей маркеров. Я хотел сделать так, чтобы при щелчке по одному из них отображалось конкретное информационное окно (в зависимости от выбранного вами маркера). Я был очень удивлен, что событие щелчка не говорит вам фактический маркер, который был нажат!

Я знаю, что есть решение, использующее отдельный метод для создания замыкания, но мне это кажется взломом. Есть ли лучший способ сделать это? Или есть способ спросить у карты «какие маркеры существуют в этой позиции» и передать эту позицию из аргумента события?

Я ожидал, что события будут работать так:

google.maps.event.addListener(marker, 'click', function(event, obj)
{
    //Now I can work with "obj" - the thing that was clicked.
});

Ответы [ 4 ]

10 голосов
/ 17 марта 2011

Вы должны просто обратиться к 'this' в прослушивателе событий.

google.maps.event.addListener(marker, 'click', function(e) {
  // this == marker;
  // e == MouseEvent
});
1 голос
/ 15 октября 2018
let mousemoveDraw = this.mousemoveDraw.bind(this);
    let mousedown_event_DrawPolygonByFinger = this.mousedown_event_DrawPolygonByFinger.bind(this);
    let mouseup_event_DrawPolygonByFinger = this.mouseup_event_DrawPolygonByFinger.bind(this);

    this.mapInst.addEvents([
        { type: 'mousedown', event : mousedown_event_DrawPolygonByFinger },
        { type: 'mousemove', event: mousemoveDraw },
        { type: 'mouseup', event : mouseup_event_DrawPolygonByFinger }
    ]);

mapInst - это обертка на гугл и яндекс карте. Именно так можно использовать в callbacak

 //event drawing event
mousemoveDraw(event : any){
    console.log('mousemoveDraw')
    console.log(this)
    console.log(this.stateDrawing)
    try{
        if (this.stateDrawing != 1){
            console.log(this.stateDrawing)
            let lat = event.latLng.lat();
            let lng = event.latLng.lng();
            console.log(lat,lng)
            this.polyLine.pushCoord({ lat, lng });
        }
    }catch(e){
        console.log('error Polyline.mousemoveDraw : ',e.message);
    }
}
0 голосов
/ 17 марта 2011

Как это взломать, если это предусмотрено API? То, что вы описываете, является взломом. Когда вы нажимаете на маркер, он пропускает событие, которое содержит широту и долготу.

google.maps.event.addListener(marker, 'click', function(e) {
  console.log(e); // { x: 0, y: 0 }
});
0 голосов
/ 17 марта 2011

Я думаю, что было бы ошибкой пытаться выследить маркерный объект в зависимости от положения события щелчка.Использование замыканий для привязки события к определенному маркеру кажется мне правильным решением.Я хотел бы создать функцию, которая выглядит примерно так:

function createMarker (point, map)
{
    var marker = new google.maps.Marker({
            position: point,
            map: map,
            title: "blah"});

    marker.stuffOnTheMarker = "Some interesting stuff";

    var content = buildSomeContentForThisMarker ();

    google.maps.event.addListener(marker, 'click', function() {
            infowindow.close ();
            infowindow.setContent(content); 
            infowindow.open(map,marker);

            // access the marker than caused this event
            alert (marker.stuffOnTheMarker);
        });
}
...