我有一个 Google Map API V3 地图 使用页面上的对象 MarkerClusterer. 。当我们单击地图时,我有一个需要运行的函数,已注册为:

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

因此,在单击MAP对象事件之后,群集升起。然后,我无法将MAP对象的侦听器作为解决方案。是否有任何方法可以测试地图的单击事件中是否有凝聚器单击?还是一种复制标记行为并在调用clustererclick时不提出映射事件的方法? Google和文档对我没有帮助。

谢谢

有帮助吗?

解决方案

这是有效的东西,但我仍然对其他更好的答案开放。

我使用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;
}); 

其他提示

我遇到了同样的问题,最终解决的解决方案:

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

我讨厌这样做,但另一方面,“扩展”外部库是正常的吗?

我找到了另一个可能起作用的解决方案。在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();
});

根据Google的Martin Matysiak的说法,“这称为事件传播,该事件总是在DOM层次结构中“冒泡”。您可以阻止此事件使用[该代码]。”

看: https://groups.google.com/forum/# !!

我使用了此方法,灵感来自其他答案,但没有复制的库代码或更改库本身:

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();
    });
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top