0

我对下面的代码有 2 个问题,我将分别发布它们。希望我已经将这个论坛的代码减少到一个合理的大小。这里的问题是,当我第一次转到页面(或重新加载页面)并单击 go 按钮时,地图会初始化,如果缩放太高,则在最后使用 setZoom() 调整缩放。当我再次单击 go 按钮时,此调整不再发生。我尝试添加一个不同的事件侦听器,然后删除/清除它,但这似乎也不起作用。由于我不想一直刷新页面,我该如何设置?该地图最终将由选择菜单驱动。

提前致谢。

<html>
<head>
<title>Untitled Document</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<script type="text/javascript">
var lat = -31.953;
var lon = 115.853;
var address = "200 St George's Terrace, Perth, WA, 6000";

function initialize() {

    var bounds = new google.maps.LatLngBounds();

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
                var addrLatLon = results[0].geometry.location;

                var mapOptions = {
                    center: addrLatLon,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };
                var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

                bounds.extend(addrLatLon);
                var addrMarker = new google.maps.Marker({
                    position: addrLatLon,
                    map: map,
                    title: 'Address Location',
                    draggable: true
                });

                if (lat != 0 && lon != 0) {
                    var LatLon = new google.maps.LatLng(lat, lon);
                    bounds.extend(LatLon);
                    var latlonMarker = new google.maps.Marker({
                        position: LatLon,
                        map: map,
                        title: 'Lat/Lon Location'
                    });
                }

                map.fitBounds(bounds);

                // Place control div
                var control = document.getElementById('map-control');
                control.style.display = 'block';
                map.controls[google.maps.ControlPosition.TOP_CENTER].push(control);

                // Update current position info.
                updateMarkerPosition(addrLatLon);

                // Add dragging event listener.
                google.maps.event.addListener(addrMarker, 'drag', function() {
                    updateMarkerPosition(addrMarker.getPosition());
                });

                // Check zoom and set accordingly
                google.maps.event.addListenerOnce(map, 'zoom_changed', function() {
                    if (map.getZoom() > 16) map.setZoom(16);
                });

            } else {
                alert('No result found for address.');
            }
        } else {
            alert('Geocoder failed: ' + status);
        }
    });
}

function updateMarkerPosition(p) {
    document.getElementById('map-control').innerHTML = [
        p.lat(),
        p.lng()
    ].join(', ');
}

$(document).ready(function(){
    $("#mapchk").click(function() {
        initialize();
    });
});
</script>
</head>
<body>
<div id="map-control" style="border:thin solid #000;"></div>
<div id="map-canvas" style="position:absolute;top:80px;left:30px;height:500px;width:600px;border:thin solid #000;"></div>
<input type="submit" name="mapchk" id="mapchk" value="Go"  />
</body>
</html>
4

1 回答 1

0

你的代码有很多问题。第一个问题是每次单击时都会生成地图go。所以在一个单独的函数中初始化所有你需要的东西,然后只在你点击按钮时运行你需要的代码。

#map-control { position: absolute; z-index: 2; width: 400px; height: 20px; text-align: center; background-color: white;}

var lat = -31.953;
var lon = 115.853;
var address = "200 St George's Terrace, Perth, WA, 6000";
var bounds, map, geocoder, control;

function init() {
    var mapOptions = { center: new google.maps.LatLng(lat, lon), mapTypeId: google.maps.MapTypeId.ROADMAP };
    map = new google.maps.Map($('#map-canvas')[0], mapOptions);
    control = $('#map-control').css({
        left: $('#map-canvas').position().left,
        width: $('#map-canvas').outerWidth(),
        top: $('#map-canvas').position().top + $('#map-canvas').outerHeight() - 24,
    });
    bounds = new google.maps.LatLngBounds();
    geocoder = new google.maps.Geocoder();
}

这就是 init 所做的。但请注意其他几件事。我使用定位的 div 来保存纬度和经度坐标,而不是控件。控件的问题在于,一旦将其添加到地图中,它就会从 DOM 中删除。这就是为什么您第二次尝试运行时出现错误的原因updateMarkerPosition:控件根本不存在。

function run() {
    geocoder.geocode({'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
            var latLngList = [];
                var addrLatLon = results[0].geometry.location;
                latLngList.push(addrLatLon);
                var addrMarker = new google.maps.Marker({
                    position: addrLatLon,
                    map: map,
                    title: 'Address Location',
                    draggable: true
                });
                if (lat != 0 && lon != 0) {
                    var LatLon = new google.maps.LatLng(lat, lon);
                    var latlonMarker = new google.maps.Marker({
                        position: LatLon,
                        map: map,
                        title: 'Lat/Lon Location'
                    });
                    latLngList.push(LatLon);
                }
                for (i = 0, l = latLngList.length; i < l; i++) {
                    bounds.extend(latLngList[i]);
                }
                map.fitBounds(bounds);
                updateMarkerPosition(addrLatLon);
                google.maps.event.addListener(addrMarker, 'drag', function() {
                    updateMarkerPosition(addrMarker.getPosition());
                });
               if (map.getZoom() > 16) map.setZoom(16);
            } else {
                alert('No result found for address.');
            }
        } else {
            alert('Geocoder failed: ' + status);
        }
    });
}

还有一个问题bounds,我已经更正,这可能会导致一些问题,并且我已经删除了缩放级别更改时调用的事件,因为我无法弄清楚你在那里尝试做什么。

function updateMarkerPosition(p) {
    $('#map-control').html([
        p.lat(),
        p.lng()
    ].join(', '));
}

$(document).ready(function(){
    $("#mapchk").click(function() {
        init();
        run();
    });
});

希望这会做你想要的。

于 2013-10-08T14:50:00.423 回答