检测Click是否在OverlayView中

时间:2012-10-28 23:48:31

标签: javascript google-maps google-maps-api-3 d3.js

当用户点击地图上的任意位置时,我希望显示某个信息框,当用户点击OverlayView时,我想显示不同的信息框。

我正在为地图对象的click事件添加一个监听器,但是这个事件只提供了一个latLong参数,似乎不足以判断OverlayView是否被命中。

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

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

这是我构建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);;
        };
    };

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

event.cancelBubble = true;

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

答案 1 :(得分:0)

OverlayView

onAdd:删除map的侦听器,并添加覆盖的侦听器。

onRemove:为map添加侦听器并删除叠加层的侦听器。

答案 2 :(得分:0)

我不确定这是否有用。这也不是一件容易的事情。

  1. 请勿使用谷歌地图活动
  2. 为每个地理路径添加单个事件侦听器 - 通过d3 .on()方法
  3. 创建一个透明的svg:rect整个地图的大小,位于所有路径的后面。订阅点击活动就可以了。这表示定期地图点击。