1

我正在尝试 Spiderfy 我的标记并向它们添加听众。Spidefying 工作正常,这意味着我得到了重叠的标记,但问题是我似乎无法弄清楚如何将侦听器添加到这些标记。换句话说,我尝试了以下方法:

  • 把它oms.addListener()放在一个循环中。这样,在单击标记时,会infoWindow在同一个标​​记上打开所有 s,这并不令人愉快。
  • oms.addListener()像 OMS Git repo 上的示例一样将循环置于外部 。https://github.com/jawj/OverlappingMarkerSpiderfier/blob/gh-pages/demo.html。这样,所有标记都具有相同的标记infoWindow,即循环中的最后一个标记。

这是我的代码:

var iw = new google.maps.InfoWindow();
var oms = new OverlappingMarkerSpiderfier(carte, {keepSpiderfied:true});
oms.addListener('click', function(marker){
    iw.setContent(content);
    iw.open(carte, marker);
});
var markers =[];
var bounds = new google.maps.LatLngBounds();
if (response.length != 0) {
    for (var i = 0 ; i < response.length; i++) {
        var loc = new google.maps.LatLng(response[i].latlong[0], response[i].latlong[1]);
        bounds.extend(loc);
        var lemarqueur = new google.maps.Marker({
            position: loc,
            title: response[i].title
        });
        content = '<table><tr><td><img src="'
        +response[i].image+'"/></td><td><p style="font-size: 13px">'
        +response[i].title+'</p> <p style="font-size: 10px"><b>Artists:</b> '
        +response[i].artist+'<br><b>Date:</b> '+response[i].startDate+'<br>'
        +response[i].address.name +' '+response[i].address.street + '<br>'
        +response[i].address.postalcode +', '+response[i].address.city +', '
        +response[i].address.country
        +'<br><a target="_blank" href =' 
        +response[i].url+'>More info</a></p></td></tr></table>';

        oms.addMarker(lemarqueur);
        markers.push(lemarqueur);
    };
    carte.fitBounds(bounds);
    var markerCluster = new MarkerClusterer(carte, markers);
    markerCluster.setMaxZoom(15);
    markerCluster.setGridSize(40);
    google.maps.event.addDomListener(window, 'load', initialiser);

所以我想知道我应该把addListener()块放在哪里?

这是我之前在循环中使用的 using google.maps.event.addListener(),效果很好:

google.maps.event.addListener(lemarqueur, 'click', function() {
    InfoWindow.open(carte, lemarqueur);
});

我希望问题足够清楚,
在此先感谢。

4

2 回答 2

4

oms.addListener()行为方式与 不同google.maps.event.addListener()google.maps.event.addListener()所以我以某种方式通过使用原始而不是oms.addListener()for循环中使其工作。像这样:

var infoWindows = [];

function closeInfoWindows(){
    var i = infoWindows.length;
    while(i--){
        infoWindows[i].close();
    }
}

function newMarker(map, response, oms){
var loc = new google.maps.LatLng(response.latlong[0], response.latlong[1]);
var marker = new google.maps.Marker({
    position: loc,
    title: response.title
});
oms.addMarker(marker);
var WindowOptions = { content:'some desc...'};    
var InfoWindow = new google.maps.InfoWindow(WindowOptions);
infoWindows.push(InfoWindow);
google.maps.event.addListener(marker, 'click', function() {
    closeInfoWindows();
    InfoWindow.open(carte, marker); // or this instead of marker
});
return marker;
}


for (var i = 0 ; i < response.length; i++) {
        markers.push(newMarker(map, response[i], oms));
    };

额外归功于: geocodezip所有信息窗口都有相同的数据

可以在这里找到一个工作示例(我的应用程序):concert-dacote.com

于 2013-06-20T00:26:00.440 回答
0

这是另一种将侦听器添加到无需FOR LOOP NEEDED的蜘蛛标记标记的方法:

var oms = new OverlappingMarkerSpiderfier (...) ;

// Create this function
function addClickListenerToMarker(marker, onClickListener) {
    oms.addListener('click', function (markerArg, eventArg) {
        if (marker == markerArg)
            onClickListener(marker, eventArg);
    });
}

// Add a click listener to your marker
var myMarker = ...
addClickListenerToMarker(myMarker, function (marker, event) {
    alert('I have been clicked');
});
于 2017-02-14T02:09:05.960 回答