4

MarkerClusterer を使用するページにGoogleMapAPIv3マップオブジェクトがあります。マップをクリックしたときに実行する必要のある関数があり、次のように登録されています。

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または、マーカーの動作を複製し、が呼び出されたときにマップのクリックイベントを発生させない方法はありますか?Googleとドキュメントは私を助けませんでした。

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のMartinMatysiakによると、「これはイベント伝播と呼ばれ、イベントは常に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 に答える