【问题标题】:Enabling and Disabling Dragging Markers by Checkbox通过复选框启用和禁用拖动标记
【发布时间】:2014-01-02 07:25:22
【问题描述】:

您能否看看这个Demo,并告诉我如何在未选中复选框时使标记可拖动。请注意,所有标记都有自己的关联复选框,这意味着用户可以锁定他们想要的每个标记(不是全部在一起)。最初,所有标记在加载到 page 时都未选中。最后,当标记检查为锁定时,我需要更改图标。

  var contentString = ' -- Lock <input name="your_name" value="your_value" type="checkbox">';
  map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  var infowindow =  new google.maps.InfoWindow({ content: "" });
  var data = {
        "markers": [{
                "latitude": 11.606503,
                "longitude": 122.712637,
                "title": "Copenhagen"
            }, {
                "latitude": 11.585988,
                "longitude": 122.757084,
                "title": "Barcelona"
            }
        ]
    };
    locations.length = 0;
    for (p = 0; p < data.markers.length; p++) {
        var marker = new google.maps.Marker({
            position: new google.maps.LatLng(data.markers[p].latitude, data.markers[p].longitude),
            map: map,
            draggable: true,
            title: "marker " + p,
            id: p
        });

        bindMarker(marker);
        bindInfoWindow(marker, map, infowindow, data.markers[p].title);
    }

    function bindMarker(marker) {
        google.maps.event.addListener(marker, 'dragend', function () {
   marker.setIcon('https://www.google.com/mapfiles/marker_green.png');
        });
        google.maps.event.addListener(marker, 'click', function () {
        });
    }
    function bindInfoWindow(marker, map, infowindow, strDescription) {
google.maps.event.addListener(marker, 'click', function() {
    infowindow.setContent(strDescription + contentString);
    infowindow.open(map, marker);
});
}
});

**

更新

  function bindMarkerDrag(marker){
        google.maps.event.addListener(checkbox, "click", function(){
            draggable: false
         //marker.setClickable(checkbox.checked);
      });
        }

然后我添加

 bindMarkerDrag(marker);

在循环内部这是一个Demo,但不起作用

【问题讨论】:

  • 添加另一个监听dragstart的监听器并勾选复选框值。
  • 谢谢 putvande,能否请您告诉我是否应该再次将润湿剂添加到记号笔中?比如:google.maps.event.addListener(如果是这样的话,我应该采取什么行动?
  • 我尝试添加一些不起作用的代码,你能看看更新看看我做的是否正确吗?谢谢
  • 请看更新演示

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


【解决方案1】:

正如我在评论中所说,您需要在标记单击事件侦听器中添加checkbox.checked = !marker.getDraggable();。不在复选框事件监听器中。

var checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.checked = !marker.getDraggable();
checkbox.addEventListener('click', function () {
    marker.setDraggable(!this.checked);
});
  1. 创建复选框
  2. 检查标记是否可拖动
  3. 管理复选框点击事件

【讨论】:

    【解决方案2】:

    你可以这样:

    google.maps.event.addListener(marker, 'mouseover', function(e){
        marker.setDraggable(document.getElementById('checkbox').checked);
    });
    

    这将在你开始拖动之前将draggable属性设置为false或true(如果你把它放在dragstart事件上,你会有一点延迟。) 将 ID checkbox 替换为您需要的 ID。

    【讨论】:

    • 谢谢,但我必须在哪里使用这个,在同一个函数中?
    • 是的,在bindMarker 我想。
    【解决方案3】:

    检查此代码!我已更新 buildInfoWindow 函数以满足您的要求。

    var map;
    var locations = [];
    var contentString = "--";
    var infowindows = [];
    
    $(document).ready(function () {
        var latlng = new google.maps.LatLng(11.610707, 122.740089);
        var myOptions = {
            zoom: 12,
            center: latlng,
            disableDefaultUI: true,
            scaleControl: true,
            zoomControl: true,
            zoomControlOptions: {
                style: google.maps.ZoomControlStyle.SMALL
            },
            mapTypeControl: true,
            draggableCursor: 'move',
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    
      var data = {
            "markers": [{
                    "latitude": 11.606503,
                    "longitude": 122.712637,
                    "title": "Copenhagen"
                }, {
                    "latitude": 11.585988,
                    "longitude": 122.757084,
                    "title": "Barcelona"
                }
            ]
        };
        locations.length = 0;
        for (p = 0; p < data.markers.length; p++) {
            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(data.markers[p].latitude, data.markers[p].longitude),
                map: map,
                draggable: true,
                title: "marker " + p,
                id: p
            });
            var infowindow =  new google.maps.InfoWindow({ content: "" });
            bindMarker(marker);
            bindInfoWindow(marker, map, infowindow, data.markers[p].title, p);
            bindMarkerDrag(marker);
        }
    
        function bindMarker(marker) {
            google.maps.event.addListener(marker, 'dragend', function () {
       marker.setIcon('https://www.google.com/mapfiles/marker_green.png');
            });
        }
        function bindMarkerDrag(marker){
    
        }
    
    
        function bindInfoWindow(marker, map, infowindow, strDescription, p) {
    google.maps.event.addListenerOnce(marker, 'click', function() {
         var checkbox = document.createElement("input");
            checkbox.type = "checkbox";
            checkbox.addEventListener('click', function () {
            marker.setDraggable(!this.checked);
        });
            var div = document.createElement('div');
            div.innerHTML = strDescription + contentString + "<br /> Lock             drag:  &nbsp;";
            div.appendChild(checkbox);
        infowindow.setContent(div);
        infowindow.open(map, marker);
        infowindows[p]= infowindow;
    });
       google.maps.event.addListener(marker, 'click', function() {
        infowindows[p].open(map, marker);
    });
    }
    
    });
    

    【讨论】:

    • 谢谢 jsjunkie,这正是我想要的
    • 如果您多次单击或单击某个框,它无法正常工作
    • 如果您第二次选中或取消选中该复选框,它将更改所有复选框的状态
    • @MonaCoder,我已经更新了我的答案。问题是每次点击都会创建内容,并且在所有标记上都使用了单个 infowindow 实例!!希望它现在有所帮助。
    • 是的,但仍然发生同样的事情。在单击其他标记关闭信息窗口之前没关系,但如果出于什么原因我不知道它会在所有框之间切换复选框跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多