Google Map USGS Overlay在同一级别标记上单击事件多重响应

时间:2015-02-16 05:23:51

标签: javascript android google-maps google-maps-api-3

我使用Google Map V3创建了20个标记,单击一个标记,标记将显示它的infowindow(标记,infowindow全部由USGSOverlay创建)。

现在,我得到了一个错误,例如:

我点击了标记A,并显示了infowindow B,在这里我将点击infowindow B转到另一页,但是现在,标记C(在infowindow B下)也得到了clickenvent,并显示了它#s; s infowindow D。

为什么呢?我试着停止传播,但是nouse!

function makeInfoWindow(item){
    var marker= new USGSOverlay(getLargeView(item),item.getLatLng(),{x:-56,y:-118},'infobox',item.id);
    mGmap.addOverlay('infobox',marker);
    marker.bind("click",function(event){
        event.cancelBubble = true;
        if (event.stopPropagation) {
            event.stopPropagation();
        }
        console.log("InfoWindow click ");
    });
    return marker;
}

USGSOverlay.prototype.bind = function (eventname, callback) {
    this.clickListener=callback;
    google.maps.event.addDomListener(this.htmlObj_, eventname, this.clickListener);
}

我认为标记和infowindos在同一级别,所以他们得到了相同的clickevent,我花了很多时间为此,任何人帮助我?

//marker
function makePointMarker(item){
    var marker = new google.maps.Marker({
        position: item.getLatLng(),
        map: mGmap._map,
        draggable: false,
        icon: getPointIcon(item)
    });

    //infowindow
    if(item.infoWindow == null){
        item.infoWindow=makeInfoWindow(item);
        item.infoWindow.hide();
    }

    // register marker clickevent
    google.maps.event.addDomListener(marker, 'click', function() {
        //event.stopPropagation();
        // event.cancelBubble = true;
        if(mSelectedItem!=null){
            if(mSelectedItem.id==item.id){
                if(mSelectedItem.infoWindow.isShow()){
                    mSelectedItem.infoWindow.hide();
                    console.log("hide");
                }else{
                    mSelectedItem.infoWindow.show();
                    console.log("show");
                }
                refreshMap();
                window.gsMapNative.onMarkerClicked(mSelectedItem.infoWindow.isShow(),item.id,item.name,item.isMainPoi,item.poiType,item.mapType,item.inChina);
                return;
            }else{ 
                mSelectedItem.infoWindow.hide();
                mSelectedItem.infoWindow=null;
                mSelectedItem=null;
            }
        }

        console.log("create new !");
        mSelectedItem=item;
        mSelectedItem.infoWindow=makeInfoWindow(item);
        mSelectedItem.infoWindow.show();
        refreshMap();
        window.gsMapNative.onMarkerClicked(mSelectedItem.infoWindow.isShow(),item.id,item.name,item.isMainPoi,item.poiType,item.mapType,item.inChina);

        return true;
    });
    return marker;
}

1 个答案:

答案 0 :(得分:0)

之前我遇到过这个并通过使用markerOption infoWindowIndex解决了这个问题。因此,将所有20个infowindows放在一个全局数组列表中,并通过指定像这样的索引为每个标记指定infowindow,

var marker = new google.maps.Marker({
        position: item.getLatLng(),
        map: mGmap._map,
        draggable: false,
        icon: getPointIcon(item),
        infoWindowIndex : index    //* <- make sure this index points to the correct info window
    });

在listner函数中,使用标记对象中的this.infoWindowIndex索引到infoWindo对象