【问题标题】:Removing a Marker from an array in Google maps v3.0 problem从谷歌地图 v3.0 中的数组中删除标记问题
【发布时间】:2011-04-13 12:53:21
【问题描述】:

我在从数组中删除标记时遇到了这个问题。我单击地图并在单击的位置放置标记,然后将标记保存在数组中。删除它们时,它只能按照我放置它们的顺序工作,但要向后,这意味着我放置 1 2 3 但必须像 3 2 1 一样删除它们。

如果我尝试以随机顺序删除标记,则删除第一个标记,但随后其他标记停止工作,侦听器仍然有效,但似乎 forloop 没有在数组中找到其他标记。

有什么想法吗?我完全迷路了。

代码如下:

 var map;
    var tempLatLng;
    var zoomLevel;
    var markers = [];
    var zoomLevels = [];
    var count = -1;
    var nullLatlng = new google.maps.LatLng(84.52,45.16);
    var nullMarker = new google.maps.Marker({
    position: nullLatLng, 
    });

    function initialize() {
    var myLatlng = new google.maps.LatLng(55.605629745598904,13.000441789627075);
    var myOptions = {
    zoom: 17,
    center: myLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    scrollwheel:false
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);


    //Puts a listener on the map, when clicking on the map, it places a marker.
    google.maps.event.addListener(map, 'click', function(event) {
    zoomLevel = map.getZoom();
    document.getElementById("zoom").value = zoomLevel;
    tempLatLng = event.latLng;
    setTimeout("placeMarker(tempLatLng)", 800);     //placeMarker is called with a duration so that                                                         //doubleclicking doesn't bother the placement.
    });

    }
    //Function to place markers.
    function placeMarker(location) {
    if(zoomLevel == map.getZoom()){
        if(true){
            var marker1 = new google.maps.Marker({
                position: location, 
                map: map,
                draggable:true
            });
            count = count + 1;
            markers[count] = marker1;
            document.getElementById("count").value = count;

            google.maps.event.addListener(marker1,'rightclick', function(event){
                document.getElementById("test2").value = "funkar";
                for(var i = 0 ;i < markers.length ;i++){
                    if(markers[i].getTitle() == marker1.getTitle()){
                        marker1.setMap(null);
                        document.getElementById("markerpos").value = markers[i].getTitle();
                        document.getElementById("test1").value = markers[i].getTitle();
                        count = count - 1;
                        document.getElementById("count").value = count;
                        markers[i] = nullMarker;
                    }
                }

            });

            marker1.setTitle(location.toString());

        }
        map.setCenter(location);
    }
}

【问题讨论】:

  • 您的删除标记基于右键单击标记本身。即使删除标记是随机顺序的,一切似乎都正常。 IE 创建标记 1 2 3,右键单击标记 2 将其删除,然后 1 3 也可以。
  • 在您认为代码没有问题时会起作用吗?你试过了吗?我想把它放在服务器上,这样你们也可以试试。
  • @Denis 我现在看到了问题。如果我帮助您修复代码,如果它适合您,您会通过将复选标记标记到答案来接受答案吗?
  • 当然是kjy!只需告诉我在代码修复后我在哪里执行此操作 :) (第一次使用 stackoverflow 用户)
  • @Denis 如果您有任何问题,请告诉我。要接受答案,请将鼠标悬停在上下箭头上,您应该会看到一个白色填充的复选标记。要接受,只需单击该复选标记。欢迎来到社区 =)

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


【解决方案1】:

这里是JSFiddle Demo:

基本上,您使用var count 来跟踪标记的数量。你可以这样做markers.length。您可以使用原生数组的 push 方法将元素添加到数组中,而不是使用 markers[count]。要删除使用 splice(i, 1); ,其中 i 是元素的位置并从该位置删除 1 个元素。此外,要检查两个标记是否相等或“相同”,而不是使用 getTitle() 使用 === 这样做:

完全等于(值和类型)

问题是,如果您在同一位置创建两个或多个标记,则会删除这两个标记,但实际上您只删除了两个“克隆”中的一个,从而使标记无法删除。这是由于使用 getTitle 返回 lat lng 造成的,如果您有两个带有相同 lat lng 的标记,您就会遇到问题。另外,我在你的onclick 函数中将marker1 更改为this,它们指的是同一个对象以提高可读性。

//Function to place markers.
function placeMarker(location) {
    if (zoomLevel == map.getZoom()) {
        if (true) {
            var marker1 = new google.maps.Marker({
                position: location,
                map: map,
                draggable: true
            });
            count = count + 1;
            markers.push(marker1);
            document.getElementById("count").value = markers.length;

            google.maps.event.addListener(marker1, 'rightclick', function(event) {
                document.getElementById("test2").value = "funkar";
                for (var i = 0; i < markers.length; i++) {
                    if (markers[i] === this) {
                        this.setMap(null);
                        document.getElementById("markerpos").value = markers[i].getTitle();
                        document.getElementById("test1").value = markers[i].getTitle();
                        markers.splice(i, 1);
                        document.getElementById("count").value = markers.length;
                    }
                }

            });

            marker1.setTitle(location.toString());

        }
        map.setCenter(location);
    }
}

【讨论】:

  • 太棒了!我完全忘记了推送和拼接功能!非常感谢你的帮助! :D 我想我也标记了复选标记:)
  • 谢谢!我会在这里花更多时间:)
  • 当您向地图添加相同的标记时,推送和拼接很有用。当标记基于某些事件添加到地图并且它们的数据也不相似时,无法使用这些功能并且标记应该具有唯一的ID。例如,可视化过去 10 秒内从地理位置对网站的请求。您需要删除过期的并添加新的。请注意删除所有标记并将它们再次添加到地图是非常繁重的过程。
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 2013-04-10
  • 2015-04-09
  • 1970-01-01
  • 2013-09-29
  • 2015-06-05
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多