Google Map API v3 caso, en Elevar cuando clickingMarkerClusterer?
-
04-10-2019 - |
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
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();
});
}