Pregunta

Tengo un API Google Map v3 mapa objeto en una página que utiliza MarkerClusterer . Tengo una función que deben ejecutarse cuando se hace clic en el mapa para que se registró en:

google.maps.event.addListener(map, 'click', function (event) {
    CallMe(event.latLng);
});

Así que mi problema es el siguiente:. Cuando hago clic en un grupo de MarkerClusterer lugar de comportarse como un marcador y no provocar el evento click en el mapa, pero sólo el uno del marcador que llama el clic del mapa

Para probar esto ha generado una alerta de la markerclusterer clic:

google.maps.event.addListener(markerClusterer, "clusterclick", function (cluster) {
    alert('MarkerClusterer click event');
}); 

Así que la clusterclick se eleva después de que el evento click del objeto de mapa. I a continuación, no puede quitar el oyente de objeto de mapa como una solución. ¿Hay alguna manera de probar si había una clusterer clic en el evento click del mapa? O una manera de replicar el comportamiento marcador y no suba el evento click del mapa cuando clustererclick se llama? Google y la documentación no me ayudaron.

Thx

¿Fue útil?

Solución

Esto es algo que funciona, pero todavía estoy abierto a otras mejores respuestas.

Yo uso un setTimeout para retransmitir el evento del mapa Haga clic para recibir lo último que debe ejecutar javascript y consulte con un valor lógico si clustererclick se ha abordado antes con algo como esto:

google.maps.event.addListener(map, 'click', function (event) {
    setTimeout(function () {
        if (!clusterClicked) {
            CallMe(event.latLng);
            alert('Map click executed');
        }
        else {
            clusterClicked = false;
            alert('ClusterClicked map click not executed');
        }
    }, 0);
});

google.maps.event.addListener(markerClusterer, "clusterclick", function (cluster) {
    clusterClicked = true;
}); 

Otros consejos

tuve mismos problemas y la solución que terminó con:

ClusterIcon.prototype.onAdd = function() {
    this.div_ = document.createElement('DIV');
    if (this.visible_) {
        var pos = this.getPosFromLatLng_(this.center_);
        this.div_.style.cssText = this.createCss(pos);
        this.div_.innerHTML = this.sums_.text;
    }

    var panes = this.getPanes();
    panes.overlayMouseTarget.appendChild(this.div_);

    var that = this;
    google.maps.event.addDomListener(this.div_, 'click', function(e) {
        =======> e.stopImmediatePropagation(); //<====================
        that.triggerClusterClick();
    });
};

odio hacer esto, pero en el otro lado es normal para "extender" bibliotecas externas?

He encontrado otra solución que puede funcionar. Encuentra los interiores markerclusterer.js siguiente código:

google.maps.event.addDomListener(this.div_, 'click', function() {
  that.triggerClusterClick();
});

y el cambio a:

google.maps.event.addDomListener(this.div_, 'click', function(ev) {
  ev.cancelBubble = true;
  if (ev.stopPropagation) {
    ev.stopPropagation();
  }
  that.triggerClusterClick();
});

Según Martin Matysiak de Google "Esto se llama la propagación de eventos, el evento siempre 'burbujas' en la jerarquía DOM. Puede que esto no suceda con el código [que]."

Ver: https: // grupos. google.com/forum/#!topic/google-maps-js-api-v3/PGeNrzv_SAs

He utilizado este método, inspirado en las otras respuestas, pero sin copiar y pegar código de la biblioteca o el cambio de la propia biblioteca:

originalOnAdd = ClusterIcon.prototype.onAdd;
ClusterIcon.prototype.onAdd = function() {
    originalOnAdd.call(this);

    google.maps.event.addDomListener(this.div_, 'click', function (ev) {
        ev.cancelBubble = true;
        if (ev.stopPropagation)
            ev.stopPropagation();
    });
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top