Map Google Map API V3 Event Click Нажмите, когда нажмите MACHMARKERCORTERCUER?
-
04-10-2019 - |
Вопрос
у меня есть Карта Google API V3 карта объект на странице, которая использует MarkerClusterer. Отказ У меня есть функция, которая должна работать, когда мы нажимаем на карту к нему зарегистрированы как:
google.maps.event.addListener(map, 'click', function (event) {
CallMe(event.latLng);
});
Итак, моя проблема заключается в следующем: когда я нажимаю на кластер маркеровщика вместо того, чтобы вести себя как маркер, а не поднять событие Click на карте, но только один из маркера, он вызывает клик от карты.
Чтобы проверить это, я сгенерировал оповещение от MarkerCluster Click:
google.maps.event.addListener(markerClusterer, "clusterclick", function (cluster) {
alert('MarkerClusterer click event');
});
Таким образом, ClusterClick поднимается после события клики объекта карты. Затем я не могу удалить слушателя объекта карты как решение. Есть ли способ тестировать, если бы был кластеризатор, нажмите на событие клики карты? Или способ повторить поведение маркера и не поднимайте событие Click на карте, когда вызывается ClusterClick? Google и документация не помог мне.
Спасибо
Решение
Вот что работает, но я все еще открыт для других лучших ответов.
Я использую SettimeOut для ретрансляции Map Click Event - это последнее, что JavaScript должен выполняться и проверить с логией, если ClusterClick был поднят раньше с чем-то подобным:
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;
});
Другие советы
У меня были те же проблемы, и решение, которое я оказался:
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();
});
};
Я ненавижу делать это, но в другой руке нормально, чтобы «продлить» внешние библиотеки?
Я нашел другое решение, которое может работать. Найдите следующий код внутри MarkerCluster.js:
google.maps.event.addDomListener(this.div_, 'click', function() {
that.triggerClusterClick();
});
и изменить его на:
google.maps.event.addDomListener(this.div_, 'click', function(ev) {
ev.cancelBubble = true;
if (ev.stopPropagation) {
ev.stopPropagation();
}
that.triggerClusterClick();
});
Согласно Martin Matysiak of Google ", это называется распространение событий, событие всегда« пузыри »в иерархии DOM. Вы можете остановить это с этим с [TO] кодом».
Видеть: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/pgenrzv_sas.
Я использовал этот метод, вдохновленный другими ответами, но без копирования библиотечного кода или изменение самой библиотеки:
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();
});
}