0

我有一个严重的问题,我已经尝试调试了几天。我有一个脚本可以获取用户当前的纬度和经度,然后将它们存储在变量中。但是,当我尝试在此函数之外和 //init 地图区域中使用这些变量时,地图只是没有显示出来。通过提醒变量,我可以看到位置函数之外的变量设置为“未定义”。这是我的代码:

//main function here
function initialize() {
var lat;
var lon;

//check if user has geo feature
if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(
//get position
function(position){
    lat = position.coords.latitude;
    lon = position.coords.longitude;
    },
// if there was an error
function(error){
    alert('ouch');
});
}
//case the users browser doesn't support geolocations
else {
alert("Your browser doesn't support geolocations, please consider downloading Google Chrome");
}
//init map
var myOptions = {
    center: new google.maps.LatLng(lat, lon),
    zoom: 16,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };
var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

}

感谢您的帮助,爱丽儿

4

2 回答 2

4

那是因为您在函数中声明了变量。变量对函数是私有的initialize,只能从函数内部访问。如果您需要能够在初始化函数之外访问变量,则将变量声明移出函数。

var lat;
var lon;
function initialize() {
...

看看这篇关于 JavaScript 中变量作用域的 MDN 文章。

更新

再次查看代码,我意识到问题不是变量范围,而是被缩进弄糊涂了。我不熟悉 Geolocation API,但我相信问题可能navigator.geolocation.getCurrentPosition()是异步的,因为它必须等待用户允许网站获取设备的位置。因此myOptions将在检索实际位置之前分配 - 因此lat&在分配lng时仍然未定义myOptions

试试这个:

//main function here
function initialize() {
var lat, lon, map, myOptions;

//check if user has geo feature
if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(
//get position
function(position){
    lat = position.coords.latitude;
    lon = position.coords.longitude;

    //init map
    myOptions = {
       center: new google.maps.LatLng(lat, lon),
       zoom: 16,
       mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
},
// if there was an error
function(error){
    alert('ouch');
});
}
//case the users browser doesn't support geolocations
else {
alert("Your browser doesn't support geolocations, please consider downloading Google Chrome");
}
}
于 2012-03-09T17:05:40.310 回答
0

更多对另一个答案的更正。范围问题无关紧要。如原始代码中所定义,lat并且lon在问题作者使用的上下文范围内alert

这是一个可运行的示例来证明这一点。

function getPos( f ) {
    var position = new Object();
    position.coords = new Object();
    position.coords.latitude = 5;
    position.coords.longitude = 10;
    f( position );          
}


function initialize() {
    var lat;
    var lon;
    getPos(

        function(position){
            lat = position.coords.latitude;
            lon = position.coords.longitude;
            }

            );

       alert( lat + " " + lon );

}


initialize(); //expected 5 & 10

无论如何,这似乎不是一个纯粹的 JS 问题。这似乎是您使用的任何 google api 的问题。这个问题应该被这样标记,因为我不知道这个 API 或者你是否称它错误。

于 2012-03-09T17:38:50.510 回答