Ошибка JavaScript Safari с Google Maps - PullRequest
1 голос
/ 16 мая 2011

Я получаю эту ошибку при загрузке своей страницы в Safari:

TypeError: Результат выражения 'map.getCenter' [undefined] не является функция.

Одна и та же страница загружается абсолютно нормально во всех основных браузерах (Chrome, FF и IE).

Я использую Google Maps Javascript API V3 вместе с их Geolocation API.

Кто-нибудь имел эту проблему раньше?

Вот путь к коду:

$(document).ready(function () {
        initialize();
    });


function initialize() {
        var myOptions = {
            zoom: 12,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map"), myOptions);
        google.maps.event.addListener(map, 'idle', function() {
         saveSession();
        });
        getInitialLocation();
    }

function getInitialLocation()
    {
        // Try W3C Geolocation (Preferred)
        if (navigator.geolocation) {

            browserSupportFlag = true;
            navigator.geolocation.getCurrentPosition(function (position) {
                initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
                map.setCenter(initialLocation);

            }, function () {
                handleNoGeolocation(browserSupportFlag);
            });
            // Try Google Gears Geolocation
        } else if (google.gears) {

            browserSupportFlag = true;

            var geo = google.gears.factory.create('beta.geolocation');
            geo.getCurrentPosition(function (position) {
                initialLocation = new google.maps.LatLng(position.latitude, position.longitude);
                map.setCenter(initialLocation);
            }, function () {
                handleNoGeoLocation(browserSupportFlag);
            });
            // Browser doesn't support Geolocation
        } else {
            browserSupportFlag = false;
            handleNoGeolocation(browserSupportFlag);
        }

        function handleNoGeolocation(errorFlag) {
            if (!errorFlag)
            {
                initialLocation = new google.maps.LatLng(geoip_latitude(), geoip_longitude());
                map.setCenter(initialLocation);
            }
        }
    }

Вы видите, что idle связан с saveSession()

function saveSession() {
        if ((map != undefined) && (map.getCenter() != undefined)
        {
            // do stuff
        }
    }

Но этот код должен запускаться только в том случае, если этот материал НЕ определен. Кроме того, еще раз, это работает во всем, кроме Safari.

РЕДАКТИРОВАТЬ: Запустите это в JFiddle С сафари. Он подойдет и заработает примерно через 5 секунд. Но затем запустите его снова (либо обновите, либо нажмите снова запустить). Это не сработает.

http://jsfiddle.net/gYJrF/1/

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Вы пытались переключить эти две строки кода

    google.maps.event.addListener(map, 'idle', function() {
     saveSession();
    });
    getInitialLocation();

на

    getInitialLocation();
    google.maps.event.addListener(map, 'idle', function() {
     saveSession();
    });

в случае, если safari запускает событие idle перед тем, как установить центр карты.


или даже лучше, если бы вы могли привязаться к событию idle после того, как определенно установили центр карты.Так что, возможно, установите его внутри getInitialLocation в обратных вызовах успеха и для неудачных в handleNoGeolocation


Кажется, что это широко распространенная проблема с Safari.

Я предполагаю, что это проблема только для рабочего стола, поскольку из постов я вижу, что устройства с GPS будут работать с( iphone и т. Д. )

0 голосов
/ 16 мая 2011

Javascript говорит вам, что он не знает, что такое map.getCenter. Это, вероятно, означает, что map не было инициализировано, удалено или недоступно в какой-либо функции, генерирующей ошибку. Попробуйте установить точку останова и оглянуться назад через трассировку стека, чтобы увидеть, где что-то пошло не так.

Вы можете воспроизвести ошибку примерно так:

<script>
function init() {
    var map = new google.maps.Map( /* params */ );
}

function get_map_center() {
    return map.getCenter();  // map is not defined here, it was only defined
                             // in the init() function above. 
}
</script>

...

<body onload="init">
...
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...