2010-12-02 102 views
2

我在Google Maps JavaScript API和HTML5地理位置方面遇到了一个相当奇怪的问题。谷歌地图javascript API + HTML5地理位置怪癖

我有以下执行的onload:

var geocoder; 
    var map; 
    var latlng; 
    function initialize() { 
if(navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition(function(position){ 
    latlng = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); 
    }); 
}else{ 
    latlng = new google.maps.LatLng(geoip_latitude(),geoip_longitude()); 
} 

geocoder = new google.maps.Geocoder(); 
var myOptions = { 
    zoom: 8, 
    center: latlng, 
    streetViewControl: false, 
    mapTypeId: google.maps.MapTypeId.HYBRID 
}; 
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    google.maps.event.addListener(map, 'click', function(event) { 
    placeMarker(event.latLng); 
    var latLong = String(event.latLng).replace('(', ''); 
    latLong = latLong.replace(')', ''); 
    $('#latlng').attr('value', latLong); 
    }); 

    function placeMarker(location) { 
    if(undefined != initialize.marker){ 
    initialize.marker.setMap(null); 
    } 
    initialize.marker = new google.maps.Marker({ 
    position: location, 
    map: map 
    }); 
    initialize.marker.setMap(map); 
    map.setCenter(location); 
} 
    } 

现在,这是什么应该做的是浏览器是否支持地理定位,得到了纬度+长,创建地图,并显示为中心在地图上LAT +长。

,如果我使用geoip_功能(的MaxMind),但地理位置有一个奇怪的问题,工作得很好:

如果代码运行的是,在谷歌地图显示显示为没有一个灰色框地图和没有控制。

如果我添加一个alert();立即之后

if(navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition(function(position){ 
     latlng = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); 
    }); 
}else{ 
    latlng = new google.maps.LatLng(geoip_latitude(),geoip_longitude()); 
} 

地图显示就好了。

这是怎么回事?

回答

4

W3C地理定位API是异步;您所拥有的成功回调函数(将设置变量latlng)将不会立即调用 - 浏览器需要一些时间来实际进行地理定位;事实上,如果用户需要一些时间来阅读隐私提示并决定是否授予权限,则此过程可能需要几秒钟的时间。但与此同时,您的地图会立即加载。

您可能会发现它后面会有一条警报,因为该警报为浏览器提供了一些时间来完成地理定位过程,并在加载地图的代码之前调用回调。 (等待一两秒钟并不是一个好的解决方案,但有些用户和浏览器会比之前显示的位置花费更多的时间。)

修复:调用创建地图的函数(您会希望封装几乎所有的地理位置调用后),并在成功回调getCurrentPosition和geoip else分支中调用它。这样,只有在确保latlng变量已被适当填充后,才会尝试加载地图。

0

我今天早上第一次通过这个混乱的工作(老实说,我很惊讶地图API没有处理这个功能)。这是我的解决方案:JSFIddle