firefox位置感知+ javascript范围

时间:2011-05-25 21:44:52

标签: javascript firefox scope location gis

我主要用PHP编写代码,我对JavaScript范围没有广泛的了解;希望有人能很快解决我的问题。如评论所示,检查mapCenter.Latitude和mapCenter.Longitude - 它们显示为空。

如果将在浏览器中提供位置感知时执行 - 我确定它适用于我,我使用alert()测试它。此外,我知道它正确地抓住了position.coords.latitude / longitude,因为我也用alert()来测试它们......但是这些值在函数之外并不持久。这可能是微不足道的 - 有什么问题?

function load(){
        map = new VEMap('MapDiv');  
        map.LoadMap();
        mapCenter = new VELatLong();
        if(navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition(function(position) 
            {
                mapCenter.Latitude = position.coords.latitude;
                mapCenter.Longitude = position.coords.longitude;

            });             
        }           

        //Inspecting mapCenter.Latitude & mapCenter.Longitude shows empty...

        map.SetCenterAndZoom(mapCenter, 15);
...
...
}

谢谢!

2 个答案:

答案 0 :(得分:3)

getCurrentPosition接受一个回调,告诉我它正在执行异步操作。所以发生的事情是,在调用 map.setCenterAndZoom(mapCenter, 15)之后,匿名函数中的代码最有可能被执行。当您使用异步操作时,执行将继续执行异步调用,而无需等待完成(因此异步)。因此,如果您依赖于来自异步调用的任何数据,则需要确保在回调中处理它,因为否则很可能无法使用它。

你应该做的是在里面调用你的回调,如下所示:

function load(){
        map = new VEMap('MapDiv');  
        map.LoadMap();
        mapCenter = new VELatLong();
        if(navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition(function(position) 
            {
                mapCenter.Latitude = position.coords.latitude;
                mapCenter.Longitude = position.coords.longitude;
                map.SetCenterAndZoom(mapCenter, 15);
                //any other code that needs to deal with mapCenter
            });             
        }           
}

map将在匿名函数中可用,因为它的行为类似于闭包,因此它在词法上绑定到定义它的作用域。

答案 1 :(得分:0)

geolocation.getCurrentPosition()是asynchronous。这意味着getCurrentPosition()在传递给它的函数被调用之前返回。浏览器存储您的函数,计算坐标,然后最终调用您的函数。这在load()函数完成后很久就会发生,因此mapCenter为空。

一个简单的解决方法是将依赖于mapCenter的所有后续代码移动到回调函数中:

    ...
    navigator.geolocation.getCurrentPosition(function(position) 
    {
        mapCenter.Latitude = position.coords.latitude;
        mapCenter.Longitude = position.coords.longitude;
        ...
        map.SetCenterAndZoom(mapCenter, 15);
        ...
    });
}