【问题标题】:Google maps V3 dragend listener adds all markers back onto mapGoogle maps V3 dragend 侦听器将所有标记添加回地图
【发布时间】:2012-06-28 16:09:51
【问题描述】:

我有一个使用 API V3 的谷歌地图。它上面有一个可拖动的标记,然后是其他静态标记的负载。我已经为可拖动标记设置了一个 dragend 侦听器,它调用了一个名为 clear_markers() 的函数,如下所示:

google.maps.event.addListener(marker_0, "dragend", function() {
    clear_markers();
});

function clear_markers()
{
  if (markers) {
    for (var i = 1; i <= markers.length; i++ ) {
        if(typeof markers[i] !== "undefined") {
            markers[i].setMap(null);
        }
    }
  }
}

我从 1 而不是 0 开始 for 循环的原因是我的可拖动标记是第一个标记,所以我想清除地图上除此之外的所有标记。

问题来了:

如果我调用 clear_markers();以任何其他方式,它都可以正常工作,并且标记已从地图中删除,因此类似这样的工作:

$('#mybutton').click(function() {
    clear_markers();
});

当您拖放绿色标记并从 dragend 侦听器调用它时,它不起作用。标记确实被删除,但随后它们立即被重新添加。我知道它们确实被删除了,因为如果我在杀死脚本的 for 循环之后在 clear_markers() 函数中放入一些东西,标记就会被删除。但是,如果允许脚本继续,它们仍然存在,这意味着它们已被删除,然后立即重新添加。

我没有调用任何其他代码,所以对我来说这似乎是 api 的一个错误。有人有什么想法吗?

这是一个显示问题的工作示例:

https://tinker.io/64b68/1

【问题讨论】:

  • 您没有提供足够的信息来说明问题所在。发布一个显示问题的地图链接,显然系统中还有其他一些代码导致了问题。
  • 我已经发布了链接,请看页面底部显示所有JS和HTML的链接
  • 他非常清楚地发布了指向 tinker.io 的链接,尽可能清楚地显示问题
  • 但是,我没有看到那个例子中的 green_marker(现在你已经发布了)this 不存在。
  • 对不起我的错现在再试一次!

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


【解决方案1】:

删除markerClusterer。它正在重新添加标记,而您没有使用它。

更新:

由于需要保留,如果不希望标记显示,则需要从 markerClusterer 中移除:

 markerCluster.clearMarkers();

(但您需要将其设为全局才能以这种方式使用它)

【讨论】:

  • 我目前没有使用它,但是将来当网站填充更多数据时,我们将使用它,因此这实际上只是一个短期解决方案
  • 那么你需要从markerclusterer中移除markers或者从map中删除markerclusterer来阻止它们被显示。它为您管理标记(在这种情况下您不需要)。
  • markerCluster.clearMarkers();非常感谢我的工作,我为此撕毁了我的头发!
【解决方案2】:

您以正确的方式调用 eventListener,只是不在您的代码中的正确位置。我在您的 eventListener 中添加了几个警报,以查看发生了什么以及您是否看到第二个警报,标记实际上已被清除 - 但是一旦警报框关闭,标记就会重新出现。自己试试吧:

google.maps.event.addListener(marker_0, "dragend", function() {
    alert("before calling clear_markers()");
    clear_markers();
    alert("markers should be cleared");
});

这意味着一旦 javascript 运行到您的“dragend”事件侦听器中,它将执行里面的代码 - 但随后它也会遍历其余代码,因此标记会再次填充到地图上.您可以通过在var markerCluster = new MarkerClusterer(map, markers, clusterOptions); 之后将事件侦听器添加到initialize() 函数的末尾来解决此问题。

斜体字是错误的解释,请参考下面的回复以获得正确的解决方案

/---------------------------------------------- -----------------------------------------------------------/

忽略我之前的回答,请允许我重新编辑。同样,您以正确的方式调用 eventListener。您只需在侦听器函数中添加以下代码,以确保不显示标记。

google.maps.event.addListener(marker_0, "dragend", function() {
    clear_markers();
    markerCluster.setMap(null);
});

似乎启动 markerCluster 会覆盖您在标记上的清除功能。因此,您还需要从地图中清除 markerCluster。很抱歉在我之前的回复中误导了您,markerCluster 对我来说也是一个新概念。

【讨论】:

  • 将来,如果您有任何触发“清除”功能的事件监听器 - 请将其添加到代码的末尾。
  • 这只是表面修复,放大或缩小都会重新绘制标记。重置集群的标记似乎是必要的。我怀疑实例化标记聚类器会改变侦听器中的某些内容并覆盖clear_markers。我认为“其余代码”不会再次运行,因为使用原始代码,我在 new MarkerClusterer 行之前放置了一个警报,并且警报没有弹出两次。
  • 你说得对,似乎启动MarkerCluster 确实做了一些有趣的覆盖。但是,类似于将地图上的 markerCluster 设置为 null 的标记,将清除标记为好的 markerCluster.setMap(null);。我将相应地编辑我的答案,感谢您的关注@MaryAnne
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多