map.fitBounds(bounds)导致浏览器冻结

时间:2012-03-11 15:45:38

标签: javascript google-maps-api-3

我有一个非常奇怪的错误,当我尝试调整地图大小以适应我放置的标记时,会导致浏览器冻结。

我的调整大小代码供参考:

 function sizeMap() {
            // create a new bounds object to define the new boundry
            var bounds = new google.maps.LatLngBounds();
            // loop through each the string latlang values held in the latlng
            // aray
            for ( var i = 0; i <latlngArray.length ; i++) {
                // create a new LatLng object based on the string value
                var tempLatLng = new google.maps.LatLng(latlngArray[i]);
                // extend the latlng bounds based on the new location
                bounds.extend(tempLatLng);
            }
            //  map.fitBounds(bounds); <== everything seems to work fine until this line is uncommented 
        }

问题是我无法使用firebug正确调试它因为冻结了! 任何人都对问题可能有什么想法?

提前致谢。

更新

在回答问题时,以下代码显示了填充latlng数组的位置:

function geocodeAddress (address) {

            var geocoder = new google.maps.Geocoder();
            geocoder.geocode( {'address': address}, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    loadMarker(results[0].geometry.location,"Info here",address);
                    latlngArray.push(results[0].geometry.location); <== latlngs are first added here they are as a result of a call to the google geocode service with a standard string address.
                } else {
                    alert("Geocode was not successful for the following reason: " +" "+  status);
                }
            });
        }

5 个答案:

答案 0 :(得分:4)

正如其他人提到的那样,您尝试使用另一个LatLng对象作为参数创建LatLng对象。它只接受2或3个参数,其中前两个是数字。 https://developers.google.com/maps/documentation/javascript/reference#LatLng

但是,您可以完全跳过创建新LatLng对象的部分,并使用循环内数组中的当前对象。

这解决了问题:http://jsfiddle.net/y9ze8a1f/1/

function sizeMap() {
    // create a new bounds object to define the new boundry
    var bounds = new google.maps.LatLngBounds();
    // loop through each the string latlang values held in the latlng
    // aray
    for ( var i = 0; i <latlngArray.length ; i++) {
        // This is causing the issue, you can only create a LatLng with two separate latitude and longitude arguments
        //var tempLatLng = new google.maps.LatLng(latlngArray[i]);

        bounds.extend(latlngArray[i]);
    }
    map.fitBounds(bounds);
}

如果您想基于旧的LatLng创建新的LatLng,可以使用LatLng方法lat()lng()

来实现

http://jsfiddle.net/q7sh4put/

function sizeMap() {
    // create a new bounds object to define the new boundry
    var bounds = new google.maps.LatLngBounds();
    // loop through each the string latlang values held in the latlng
    // aray
    for ( var i = 0; i <latlngArray.length ; i++) {
        // create a new LatLng object based on the string value
        var tempLatLng = new google.maps.LatLng(latlngArray[i].lat(), latlngArray[i].lng());

        // extend the latlng bounds based on the new location
        bounds.extend(tempLatLng);
    }
    map.fitBounds(bounds);
}

答案 1 :(得分:0)

据我所知,您无法从单个字符串参数创建LatLng对象。如果你有一个“lat,lng”形式的字符串,那么在创建LatLng对象之前将它们拆开。你的循环内部将如下所示:

        var tempLatLng = latlngArray[i].split(',');
        bounds.extend(new google.maps.LatLng(tempLatLng[0], tempLatLng[1]));

答案 2 :(得分:-1)

您不从字符串创建新的LatLng。它是由2个数字创建的,虽然看起来2个字符串也可以工作,一个用于纬度,一个用于经度。一个字符串不起作用。

所以你可以说new google.maps.LatLng(-25.363882, 131.044922)甚至new google.maps.LatLng('-25.363882', '131.044922')但不是new google.maps.LatLng('-25.363882, 131.044922') 因此,您需要将2个单独的值传递给新的google.maps.LatLng,但看起来您只传递了一个。

http://code.google.com/apis/maps/documentation/javascript/reference.html#LatLng

答案 3 :(得分:-1)

根据您更新的代码,您根本不需要创建tempLatLng。您的数组已包含LatLng对象,因此您应该能够在for循环中说出bounds.extend(latlngArray[i]) ...

答案 4 :(得分:-1)

使用计时器:

var Timer="";
    $(window).resize(function() {
        clearInterval(Timer);
        run_timer();
    });
    function run_timer() {
        Timer = setInterval(function(){sizeMap();}, 1500);
    }
    function sizeMap() {
        clearInterval(Timer);
        // create a new bounds object to define the new boundry
        var bounds = new google.maps.LatLngBounds();
        // loop through each the string latlang values held in the latlng
        // aray
        for (var i = 0; i <latlngArray.length ; i++) {
            // create a new LatLng object based on the string value
            var tempLatLng = new google.maps.LatLng(latlngArray[i]);
            // extend the latlng bounds based on the new location
            bounds.extend(tempLatLng);
        }
        //  map.fitBounds(bounds); <== everything seems to work fine until this line is uncommented 
    }