【问题标题】:Show Polyline after marker click event when dealing with multiple markers.处理多个标记时,在标记单击事件后显示折线。
【发布时间】:2016-01-21 14:49:01
【问题描述】:

我正在开发一个使用 Google Maps API v3 的网络应用程序。我在一小时内创建了大约 400 个标记,这些标记被推送到 currentDisplayedMarkers[] 中。对于每个标记,我正在创建一个包含其过去位置的折线。这工作正常。但是,我只想在单击特定标记时显示标记的折线。我创建了一个名为 addClickHandler 的函数,在其中我为每个标记定义了 onClick 侦听器。单击标记时,应将折线添加到地图中。

当我单击标记时,折线未显示在地图上。 你对我做错了什么有任何想法吗?

    if (!found)
                   {
                       var LatLng = { lat: data[i].Plots[0].Latitude, lng: data[i].Plots[0].Longitude };
                       createMarker(LatLng, 90, data[i].TrackNumber);
                       drawPolyline(data[i].Plots);
                   }
function createMarker(markerLatLng, direction, id) {
var iconImage = {
    path: 'M265.54,0H13.259C5.939,0,0.003,5.936,0.003,13.256v252.287c0,7.32,5.936,13.256,13.256,13.256H265.54c7.318,0,13.256-5.936,13.256-13.256V13.255C278.796,5.935,272.86,0,265.54,0z M252.284,252.287H26.515V26.511h225.769V252.287z',
    strokeColor: '#800000',
    scale: 0.05,
    fillOpacity: 1,
    strokeWeight: 1
}
//draw the marker and attach it to the map
marker = new google.maps.Marker({
    position: markerLatLng,
    map: map,
    icon: iconImage,
    draggable: false
});
//add aditional properties to the marker
marker.metadata = {
    id: id
};

//add the marker to the markers array
currentlyDisplayedMarkers.push(marker);
for (var j = 0; j < currentlyDisplayedMarkers.length; j++) {
    var pathMarker = currentlyDisplayedMarkers[j];
    addClickHandler(pathMarker);
}
}
function addClickHandler(pathMarker) {
google.maps.event.addListener(pathMarker, 'click', function () {
    flightPath.setMap(map);
});
}

【问题讨论】:

  • 请提供一个Minimal, Complete, Tested and Readable example 来证明这个问题。
  • 如果我要显示更多代码,那就太多了。如果您对此事感兴趣,代码已经过测试并且在我看来足够可读。如果我提供完整的代码,我还必须发布数据源,这恐怕是不可能的。
  • 提供运行代码的测试数据,不一定是“真实”数据。
  • 我认为任何有足够经验的人都会很容易地“看到”这个问题。我很确定任何类型的调试在这里都是无用的,所以我看不出提供更多信息的意义。在我看来,对我的问题的帮助只能来自以前见过这种情况的人。

标签: javascript jquery google-maps-api-3 google-maps-markers google-polyline


【解决方案1】:

您应该将下面的块移动到您的createMarker() 函数之外。

for (var j = 0; j < currentlyDisplayedMarkers.length; j++) {
    var pathMarker = currentlyDisplayedMarkers[j];
    addClickHandler(pathMarker);
}

每次创建标记时,只需将事件处理程序添加到每个标记,就无需遍历当前的 DisplayedMakers 集合。

只需为您刚刚创建的标记添加一个事件处理程序就足够了。

解决方案: 要么将迭代移到你的标记创建函数之外,要么只为你刚刚在标记创建函数中创建的标记添加一个事件处理程序。

【讨论】:

  • 谢谢!确实,在那里有循环是一种无用的做法。但是,我似乎仍然没有看到任何变化。
  • 我假设您的整个代码都在索引为i 的另一个迭代中,并且我在每个循环中看到,您在创建标记后创建了一个折线对象。我假设在您的 drawPolyline 函数中,您已将 currentDisplayedMarkers 分配给 flightPath 折线。当您没有任何“点击”事件时,逻辑是同步的,因此在创建每个标记后立即绘制飞行路径并将其设置为映射。但是一旦你添加了一个“点击”事件,逻辑就是异步的。以前的 flightPath 将替换为数据集中的最后一个对象。当你点击标记时,根本不会有任何变化。
  • 您需要做的是创建另一个名为var flightPaths = [] 的集合,并在您的drawPolyline 函数中将每个路径及其id 推送到这个新集合',然后编写一个子函数并调用它以通过来自 Marker.metadata 的id 从该集合中获取 flightPath。最后设置地图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多