2

我正在处理一个 Intranet 项目,因此我的 KML 文件无法在外部使用。这意味着我依赖 geoXML3 库将我的 XML 解析到我的谷歌地图上。然而,缺乏事件监听器的文档令人沮丧。我想调用一个单击侦听器并传入 geoXML3 地标。我正在尝试执行以下操作,但是始终将循环中clickListener处理的最后一个多边形接收为.afterParsep

kml = new geoXML3.parser({
    suppressInfoWindows: true,
    map: map,
    afterParse: function (doc) {
        for (var i = 0; i < doc[0].placemarks.length; i++) {
            var p = doc[0].placemarks[i];
            google.maps.event.addListener(
                p.polygon,
                "click",
                function () { clickListener(p); }
            );
        }
    }
});
kml.parse(mapSettings.kmlLocation);

如果我使用的是 Google Maps API 的 KML 支持,我可以这样做并将多边形传递给侦听器。

kml = new google.maps.KmlLayer(mapSettings.kmlLocation, {
    suppressInfoWindows: true,
    preserveViewport: false,
    map: map
});
google.maps.event.addListener(
    kml,
    "click",
    clickListener
};

有没有办法(更可取)将正确的 geoXML3 地标可靠地传递给clickListener,或者(不太可取)geoXML3.parser我可以将点击事件绑定到并接收kmlMouseEvent我使用 Google Maps API kml 解析器的方式的属性?最终,我需要能够更改多边形的样式并在数组中跟踪它已被选中/取消选中。

4

1 回答 1

6

使用函数闭包将地标与事件侦听器相关联。一种方法(您也可以使用匿名函数):

kml = new geoXML3.parser({
    suppressInfoWindows: true,
    map: map,
    afterParse: function (doc) {
        for (var i = 0; i < doc[0].placemarks.length; i++) {
            var p = doc[0].placemarks[i];
            clickablePolygon(p);
        }
    }
});
kml.parse(mapSettings.kmlLocation);
function clickablePolygon(p) {
  google.maps.event.addListener(
    p.polygon,
    "click",
    function () { clickListener(p); }
  );
}      
于 2015-02-04T13:37:49.700 回答