4

我在使用MarkerClusterer的页面上有一个Google Map API v3 地图对象。当我们点击地图时,我有一个需要运行的功能,它被注册为:

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地图对象的点击事件后上升。然后我无法删除地图对象的侦听器作为解决方案。有什么方法可以测试地图的点击事件中是否有集群点击?或者一种复制标记行为并且在调用时不引发地图点击事件的clustererclick方法?谷歌和文档没有帮助我。

4

4 回答 4

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;
}); 
于 2010-05-21T10:55:00.617 回答
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();
    });
};

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

于 2013-11-25T19:12:01.803 回答
1

我找到了另一种可能有效的解决方案。在 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/#!topic/google-maps-js-api-v3/PGeNrzv_SAs

于 2015-03-01T06:31:00.833 回答
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();
    });
}
于 2017-05-03T09:24:31.123 回答