谷歌地图geoXML3:将地标传递给它自己的事件监听器?

时间:2015-02-04 08:02:35

标签: javascript google-maps kml geoxml3

我正在开发一个内部网项目,因此我的KML文件无法在外部使用。这意味着我依赖于geoXML3库来将我的XML解析到我的Google地图上。然而,缺乏关于事件监听器的文档令人沮丧。我想调用点击监听器并传入geoXML3地标。我尝试执行以下操作,但clickListener始终接收afterParse循环中处理的最后一个多边形{{1 }}。

p

如果我使用Google Maps API的KML支持,我可以执行此操作并将多边形传递给侦听器。

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

是否有任何方法(更可取)将正确的geoXML3地标可靠地传递到kml = new google.maps.KmlLayer(mapSettings.kmlLocation, { suppressInfoWindows: true, preserveViewport: false, map: map }); google.maps.event.addListener( kml, "click", clickListener }; ,或者(不太可取)clickListener中的属性我可以将点击事件绑定到并接收geoXML3.parser我使用Google Maps API kml解析器的方式是什么?最后,我需要能够改变多边形的样式并跟踪它在数组中的选择/取消选择。

1 个答案:

答案 0 :(得分: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); }
  );
}