2010-12-02 103 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