4

У меня есть Google Map API v3map объект на странице, которая использует MarkerClusterer. У меня есть функция, которая нужна для запуска, когда мы нажмем на карте он зарегистрирован как:Google map API v3 при нажатии clickMarkerClusterer нажимает кнопку Google?

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

Итак, моя проблема заключается в следующем: Когда я нажимаю на кластере MarkerClusterer вместо себя как маркер и не поднять событие клика на карте, но только тот из маркера, который он называет кликом с карты.

Чтобы проверить это, я сгенерировал предупреждение от markerclusterer мыши:

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

Так clusterclick поднимается после щелчка события объекта карты. Затем я не могу удалить слушателя объекта карты в качестве решения. Есть ли способ проверить, есть ли щелчок кластера в событии click на карте? Или способ реплицировать поведение маркера и не вызывать событие щелчка карты при вызове clustererclick? Google и документация мне не помогли.

Thx

ответ

5

Вот то, что работает, но я по-прежнему открыт для других лучших ответов.

Я использую SetTimeout передать событие на карте Нажмите, чтобы быть последним, что Javascript должен выполнить и проверить с булево если clustererclick был поднят раньше с чем-то вроде этого:

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; 
}); 
+0

ли это работа? Что происходит, когда я сначала нажимаю на параметр кластера 'clusterclick' на' true', а затем нажимаю в другом месте на карте? –

4

я имел те же проблемы, и тому решение я закончил с:

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(); 
    }); 
}; 

Я ненавижу делать это, но в другой стороны, это нормально «расширить» внешние библиотеки?

2

Я нашел другое решение, которое может работать. Найдите следующий код внутри markerclusterer.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(); 
}); 

По словам Мартина Matysiak в Google «это называется распространение события, событие всегда„пузыри“вверх в DOM. Вы можете остановить это от кода [этого].

См: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/PGeNrzv_SAs

0

Я использовал этот метод, вдохновленный другие ответы, но без копирования вставки кода библиотеки или изменяя саму библиотеку:

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(); 
    }); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^