Error de JavaScript de Safari con Google Maps

Recibo este error cuando cargo mi página en Safari:

TypeError: El resultado de la expresión 'map.getCenter' [undefined] no es una función.

La misma página se carga absolutamente bien en todos los demás navegadores principales (Chrome, FF e IE).

Estoy usando Google Maps Javascript API V3 junto con su API de geolocalización.

Alguien ha tenido este problema antes?

Aquí está la ruta del código:

$(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);
            }
        }
    }

Ves el idle está obligado a saveSession()

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

Pero esto solo debería ejecutar el código si ese material NO ESTÁ indefinido. Además, una vez más, esto FUNCIONA en todo menos en Safari.

EDITAR: Ejecute esto en JFiddle CON safari. Aparecerá y funcionará después de unos 5 segundos. Pero luego ejecútelo nuevamente (actualice o presione ejecutar nuevamente). No funcionará.

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

preguntado el 16 de mayo de 11 a las 17:05

¿Cómo se carga el mapa? ¿Puede mostrar un ejemplo de código? -

¿Alguna posibilidad de un ejemplo vivo? o al menos algún código fuente para que podamos ver qué está pasando .. -

Cargo el mapa de la forma que recomiendan, aquí; code.google.com/apis/maps/documentation/javascript/… -

2 Respuestas

¿Ha intentado cambiar estas dos líneas de código

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

a

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

en caso de que safari dispare el idle evento antes de haber establecido el centro del mapa.


o incluso mejor si pudieras unirte a la idle evento después de haber establecido ciertamente el centro del mapa. Así que tal vez ponerlo dentro del getInitialLocation en las devoluciones de llamada exitosas y por las falladas en el handleNoGeolocation


Parece que es un problema generalizado con Safari.

Supongo que es un problema solo de escritorio, ya que por las publicaciones veo que los dispositivos con GPS funcionarán con (iphone, etc.)

contestado el 18 de mayo de 11 a las 13:05

Yo no he. Pero lo haré. Buena idea - slandau

Todavía no funciona. Estoy vinculado a inactivo justo después de la línea de código map.setCenter (); y sigue quejándose slandau

Agregado en jfiddle. Sin embargo, siga las instrucciones. funciona la primera vez (después de tardar mucho), no funciona la segunda vez, SOLO en safari. funciona en cualquier otro lugar - slandau

@slandau, respuesta actualizada al final (parece que es un problema con la implementación de safari, y está muy extendido) - Gabriele Petrioli

Pero la cosa es que funciona, pero no la primera vez. Creo que está intentando saveSession () dos veces en la recarga de la página. - slandau

Javascript te está diciendo que no sabe qué map.getCenter es. Probablemente signifique que map no se inicializó, se eliminó o no está disponible en cualquier función que esté generando el error. Intente establecer un punto de interrupción y mire hacia atrás a través del seguimiento de la pila para ver dónde han ido mal.

Puede reproducir el error con algo como esto:

<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>

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.