4

我有一个使用 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

4

2 回答 2

3

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

更新:

由于您需要保留它,如果您希望不显示标记,则需要将它们从 markerClusterer 中删除:

 markerCluster.clearMarkers();

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

于 2012-06-28T16:37:37.033 回答
1

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

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

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

斜体字是错误的解释,请参阅下面的响应以获得正确的解决方案

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

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

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

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

于 2012-06-28T20:19:17.393 回答