【问题标题】:Unable to remove all markers in Google Map v3无法删除 Google Map v3 中的所有标记
【发布时间】:2013-11-15 02:56:57
【问题描述】:

我正在添加这样的制造商:

 var markers = [];
    var map = null;
$.ajax({
        type:"GET",
        dataType:"json",
        url:"<?php echo site_url("sandbox_faizan/get_coordinates") ?>",
        success: function(result)
        {
            for(var i=0;i<result.length;i++)
            {
                var obj = [] ;
                obj.lat=result[i].lat;
                obj.lng=result[i].lng;
                obj.count=result[i].Count;
             //   points.push(new google.maps.LatLng(result[i].lat,result[i].lng));
               markers.push(obj);
                //console.log(points[i]);
                console.log(markers[i]);
            }
            addMarkers();
        }
    });
 function addMarkers() {
        // when the map is initialized and the points have been initialized, add them to the map
        if ((map != null) && (markers.length > 0)) {
            for (var i = 0; i < markers.length; i++) {
                var marker = new MarkerWithLabel({
                    map: map,
                    position: new google.maps.LatLng(markers[i].lat,markers[i].lng),
                    icon: pinImage,
                    shadow: pinShadow,
                    labelContent: markers[i].count,
                    labelAnchor: new google.maps.Point(12, -5),
                    labelClass: "labels"
                });
                bounds.extend (new google.maps.LatLng(markers[i].lat,markers[i].lng));
                map.fitBounds (bounds);
            }
        }
    }

我正在清除这样的标记:

  function remove_markers(){

        google.maps.Map.prototype.clearMarkers = function() {
            for(var i=0; i < this.markers.length; i++){
                this.markers[i].setMap(null);
                alert("removing now"); // THIS DOES NOT ALERT
            }
            this.markers = new Array();
        };
    }

它什么也没做,我尝试了其他使用 setMap(null) 的方法,之前它给了我错误未捕获的类型错误 setMap not defined in console。

我做错了什么?

【问题讨论】:

  • 控制台不记录任何内容?
  • 这种情况下什么都没有,连alert都不弹出来。

标签: javascript google-maps google-maps-api-3 google-maps-markers removeall


【解决方案1】:
var marker = new MarkerWithLabel({
                map: map,
                position: new google.maps.LatLng(markers[i].lat,markers[i].lng),
                icon: pinImage,
                shadow: pinShadow,
                labelContent: markers[i].count,
                labelAnchor: new google.maps.Point(12, -5),
                labelClass: "labels"
            });
markersToRemove.push(marker); // markersToRemove is a global array

function removeMarkers() {
    for(var i = 0; i < markersToRemove.length; i++) {
        markersToRemove[i].setMap(null);
    }
}

【讨论】:

  • 谢谢,你很快就解决了这个问题。
  • 但这不会清除 javascript 内存中的标记。
  • 使用上面的代码我得到Uncaught ReferenceError: removeMarkers is not defined。这是什么意思?
  • @dj_cd 你请粘贴一个链接到你的脚本
【解决方案2】:

您的标记数组不是 google.maps.Map 对象的属性(除非您使用的是这样做的库)。您的代码添加它们的方式是,它们位于名为“标记”的全局数组中。

但这不是 google.maps.Marker 对象的数组,您需要保留对这些标记的引用。

 var gmarkers = [];
 function addMarkers() {
        // when the map is initialized and the points have been initialized, add them to the map
        if ((map != null) && (markers.length > 0)) {
            for (var i = 0; i < markers.length; i++) {
                var marker = new MarkerWithLabel({
                    map: map,
                    position: new google.maps.LatLng(markers[i].lat,markers[i].lng),
                    icon: pinImage,
                    shadow: pinShadow,
                    labelContent: markers[i].count,
                    labelAnchor: new google.maps.Point(12, -5),
                    labelClass: "labels"
                });
                bounds.extend (new google.maps.LatLng(markers[i].lat,markers[i].lng));
                gmarkers.push(marker);
                map.fitBounds (bounds);
            }
        }
    }

然后这应该删除它们(并且对大量标记非常烦人)。

  function remove_markers(){
     for(var i=0; i < gmarkers.length; i++){
       gmarkers[i].setMap(null);
       alert("removing now"); // THIS DOES NOT ALERT
     }
     gmarkers = [];
  };

【讨论】:

  • 是的,您的解决方案也可以正常工作:) 如果我不添加这个 gmarkers[]; 你能解释一下吗?最后,它仍然清除标记。使用与不使用有什么区别?
  • gmarkers[i].setMap(null); 清除地图上的标记。 gmarkers = [] 从数组中删除标记 - 不再有标记。
  • 这意味着如果我想在清除旧标记后再次添加新标记,那么我也应该从数组中清除它们?
  • 如果您想再次在地图上重复使用相同的标记,请不要清除数组。如果您希望全新的标记出现在地图上,请清除数组。
  • 如果您不将它们从数组中删除(使用 gmarkers = []),那么当您添加新的时,它们将继续在数组中累积。如果您只是添加它们然后隐藏它们,这不是问题,但是如果您这样做会浪费内存,如果您想隐藏和重新显示标记,则会增加处理时间(并导致意外行为)。
【解决方案3】:

1) 您在标记中添加了错误的信息。您需要在声明标记后添加它:

首先,将标记数组重命名为markersData

然后确保您的标记数组正在获取每个标记。

var marker = new MarkerWithLabel({
  // stuff
});

markers.push(obj);

然后在不调用该原型的情况下尝试它:

function remove_markers() {
  for(var i=0; i < this.markers.length; i++){
    markers[i].setMap(null);
    alert("removing now");
  }
  this.markers = new Array();
}

请注意this.markers = new Array();this.markers.length = 0; 将破坏标记数组,它们将不再存在。如果您只想从地图中删除标记,只需执行以下操作:

function remove_markers() {
  for(var i=0; i < this.markers.length; i++){
    markers[i].setMap(null);
    alert("removing now");
  }
}

标记仍会在数组中,您可以随时将它们添加回地图。

我不确定,但我认为fitbounds 语句应该在循环之外,但我可能错了。

Fiddle

【讨论】:

  • 我认为@edotassi 是对的,因为我尝试了你的代码 Andy,它在控制台上给了我这个错误,“Uncaught TypeError: Object [object Array] has no method 'setMap'”。我该如何解决这个问题?
  • 我已经修改了答案。
  • 谢谢,现在每个人都找到了正确的解决方案,我很难决定谁给出最佳答案:P
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2017-01-12
  • 2013-05-27
  • 1970-01-01
  • 2011-10-07
  • 2011-12-19
  • 2012-07-20
相关资源
最近更新 更多