Frage

Ich habe einen Google Map API v3 Objekt auf einer Seite der Karte, dass verwendet MarkerClusterer . Ich habe eine Funktion, die Notwendigkeit zu laufen, wenn wir auf der Karte klicken, um es registriert ist, wie:

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

Also mein Problem ist, wie folgt:. Wenn ich auf einem Cluster von MarkerClusterer klicken, anstatt wie ein Marker verhalten und nicht das Click-Ereignisse auf der Karte erhöhen, aber nur die eine von der Markierung ruft er den Klick von der Karte

Um dies zu testen, habe ich eine Warnung aus dem markerclusterer Klick generiert:

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

So steigt die clusterclick nach dem Click-Ereignisse von Kartenobjekt. Ich kann dann nicht den Hörer von Map-Objekt als eine Lösung entfernen. Gibt es eine Möglichkeit zu testen, ob es ein Clusterer Klick in dem Click-Ereignisse von der Karte war? Oder ein Weg, um die Markierung Verhalten zu replizieren und erhöht nicht das Click-Ereignis der Karte, wenn clustererclick genannt wird? Google und Dokumentation haben mir nicht helfen.

Thx

War es hilfreich?

Lösung

Hier ist etwas, das funktioniert, aber ich bin immer noch offen für andere bessere Antworten.

Ich verwende eine SetTimeout die Karte klicken Ereignis Relais das letzte, was Sie Javascript sein sollte mit einem boolean ausführen und überprüfen, ob clustererclick zuvor so etwas angehoben wurde:

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

Andere Tipps

Ich hatte dieselben Probleme und die Lösung, die ich am Ende mit:

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

Ich hasse dies zu tun, aber in anderer Seite ist es normal zu „erweitern“ externe Bibliotheken?

fand ich eine andere Lösung, die funktionieren kann. Suchen Sie nach dem folgenden Code innerhalb markerclusterer.js:

google.maps.event.addDomListener(this.div_, 'click', function() {
  that.triggerClusterClick();
});

und ändern Sie es an:

google.maps.event.addDomListener(this.div_, 'click', function(ev) {
  ev.cancelBubble = true;
  if (ev.stopPropagation) {
    ev.stopPropagation();
  }
  that.triggerClusterClick();
});

Laut Martin Matysiak von Google „Das nennt man Ereignispropagierung, das Ereignis immer‚Blasen‘nach oben in der DOM-Hierarchie. Sie dies geschieht mit stoppen kann, [die] Code.“

Siehe auch: https: // Gruppen. google.com/forum/#!topic/google-maps-js-api-v3/PGeNrzv_SAs

habe ich diese Methode, die von den anderen Antworten inspiriert, aber ohne Kopie-Einfügen-Bibliothek Code oder das Ändern der Bibliothek selbst:

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();
    });
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top