map.fitBounds (bounds) вызывает зависание браузера - PullRequest
8 голосов
/ 11 марта 2012

У меня действительно странная ошибка, из-за которой мой браузер просто зависает, когда я пытаюсь изменить размеры карты, чтобы она соответствовала маркерам, которые я на ней поместил.

Мой код изменения размера дляссылка:

 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 ]

4 голосов
/ 21 апреля 2015

Проблема, как уже упоминали другие, заключается в том, что вы пытаетесь создать объект 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 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);
}
0 голосов
/ 18 апреля 2015

Использование таймера:

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 
    }
0 голосов
/ 11 марта 2012

Насколько я знаю, вы не можете создать объект LatLng из одного строкового параметра. Если у вас есть строка в форме «lat, lng», то разбейте ее на части перед созданием объекта LatLng. Внутренняя часть вашего цикла будет выглядеть так:

        var tempLatLng = latlngArray[i].split(',');
        bounds.extend(new google.maps.LatLng(tempLatLng[0], tempLatLng[1]));
0 голосов
/ 12 марта 2012

Исходя из вашего обновленного кода, вам вообще не нужно создавать tempLatLng.Ваш массив уже содержит объекты LatLng, поэтому вы должны иметь возможность сказать bounds.extend(latlngArray[i]) в цикле for ...

0 голосов
/ 11 марта 2012

Вы не создаете новый 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...