4

我在使用MarkerClusterer的頁面上有一個Google Map API v3map對象。我有需要的時候,我們在地圖上點擊運行它註冊爲一個功能:點擊MarkerClusterer時,Google地圖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地圖對象的click事件後上升。然後我不能刪除地圖對象的偵聽器作爲解決方案。有沒有什麼方法可以測試地圖的點擊事件中是否有羣集點擊?或者一種複製標記行爲的方法,並且在調用clustererclick時不要引發map的點擊事件?谷歌和文檔沒有幫助我。

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」,然後點擊地圖上的其他地方時會發生什麼呢? – 2012-05-02 06:33:56

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「這就是所謂的事件傳播,事件一直‘泡’起來的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(); 
    }); 
} 
相關問題