#javascript #safari #geolocation #google-maps-api-3
#javascript #safari #геолокация #google-maps-api-3
Вопрос:
Я получаю эту ошибку при загрузке моей страницы в Safari:
Ошибка типа: результат выражения ‘map.getCenter’ [не определено] не является функцией.
Та же страница абсолютно нормально загружается в любом другом крупном браузере (Chrome, FF и IE).
Я использую Javascript API Google Maps V3 вместе с их 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) amp;amp; (map.getCenter() != undefined)
{
// do stuff
}
}
Но это должно запускать код, только если этот материал НЕ является неопределенным. Кроме того, еще раз, это РАБОТАЕТ во всем, кроме Safari.
РЕДАКТИРОВАТЬ: Запустите это в JFiddle С safari. Она появится и заработает примерно через 5 секунд. Но затем запустите его снова (либо обновите, либо снова нажмите «Выполнить»). Это не сработает.
Комментарии:
1. Как вы загружаете карту? Можете ли вы показать пример кода?
2. есть ли возможность для живого примера? или, по крайней мере, некоторый исходный код, чтобы мы могли видеть, что происходит..
3. Я загружаю карту так, как они рекомендуют, здесь; code.google.com/apis/maps/documentation/javascript /…
Ответ №1:
Вы пробовали переключать эти две строки кода
google.maps.event.addListener(map, 'idle', function() {
saveSession();
});
getInitialLocation();
Для
getInitialLocation();
google.maps.event.addListener(map, 'idle', function() {
saveSession();
});
в случае, если safari запускает idle
событие до установки центра карты.
или даже лучше, если бы вы могли привязаться к idle
событию после того, как, конечно, установили центр карты. Так что, возможно, установите ее внутри getInitialLocation
в успешных обратных вызовах и для сбоя в handleNoGeolocation
Похоже, что это широко распространенная проблема с Safari.
- https://discussions.apple.com/message/11780026?messageID=11780026
- http://www.phpfreaks.com/forums/index.php?topic=318586.0
Я предполагаю, что это проблема только для рабочего стола, поскольку из сообщений я вижу, что устройства с GPS будут работать с (iphone и т.д.)
Комментарии:
1. У меня нет. Но я сделаю. Хорошая идея
2. По-прежнему не работает. Я привязываюсь к idle сразу после строки кода map.setCenter(); и он все еще жалуется
3. Добавлено в jfiddle. однако следуйте инструкциям. работает в первый раз (после длительного использования), не работает во второй раз — ТОЛЬКО в safari. работает везде
4. @slandau, обновленный ответ в конце ( кажется, что это проблема с реализацией safari, и она широко распространена )
5. Но дело в том, что это действительно работает, просто не в первый раз. Я думаю, что он дважды пытается saveSession () при повторной загрузке страницы.
Ответ №2:
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>