5

我想在用户单击地图上的任意位置时显示某个信息框,而当用户在 OverlayView 内单击时显示不同的信息框。

我正在为地图对象的单击事件添加一个侦听器,但此事件仅提供一个 latLong 参数,这似乎不足以判断是否点击了 OverlayView。

    google.maps.event.addDomListener(map, 'click', function(param) {
        // if( an OverlayView was clicked)
        // showInfoboxForOverlayView();
        // else
        // showStandarInfobox();
    });

我知道我可以为 OverlayView 对象添加一个单独的侦听器,但是当我这样做时,两个事件都会被触发(一个来自 OverlayView 对象,一个来自地图对象)。

这就是我构造我的 OverlayView 对象的方式,

    var overlay = new google.maps.OverlayView();
    overlay.onAdd = function () {

        var layer = d3.select(this.getPanes().overlayMouseTarget).append("div").attr("class", "SvgOverlay");
        var svg = layer.append("svg");
        var adminDivisions = svg.append("g").attr("class", "AdminDivisions");

        overlay.draw = function () {
            var markerOverlay = this;
            var overlayProjection = markerOverlay.getProjection();

            // Turn the overlay projection into a d3 projection
            var googleMapProjection = function (coordinates) {
                var googleCoordinates = new google.maps.LatLng(coordinates[1] + 0.0005, coordinates[0] - 0.0006);
                var pixelCoordinates = overlayProjection.fromLatLngToDivPixel(googleCoordinates);
                return [pixelCoordinates.x + 4000, pixelCoordinates.y + 4000];
            }

            path = d3.geo.path().projection(googleMapProjection);
            adminDivisions.selectAll("path")
                    .data(geoJson.features)
                    .attr("d", path) // update existing paths
                    .enter().append("svg:path")
                    .attr("d", path);;
        };
    };

有任何想法吗?

4

3 回答 3

1

尝试在覆盖元素的处理程序中使用全局事件对象中的cancelBubble标志:

event.cancelBubble = true;

这应该可以防止触发第二次点击处理程序。

于 2012-11-02T14:41:10.770 回答
0

我不确定这是否可行。这也不是一个容易解决的问题。

  1. 根本不要使用谷歌地图事件
  2. 为每个地理路径添加单独的事件侦听器 - 通过 d3.on()方法
  3. 创建svg:rect整个地图大小的透明,位于所有路径的后面。订阅它的点击事件。这表示常规地图点击。
于 2012-11-03T09:21:00.300 回答
0

在你的OverlayView

onAdd: 移除监听器map,添加覆盖层监听器。

onRemove:添加监听器map并删除覆盖层的监听器。

于 2012-10-29T01:38:55.767 回答