从控制器中的导航器获取用户位置

Posted

技术标签:

【中文标题】从控制器中的导航器获取用户位置【英文标题】:Get user location from navigator in controller 【发布时间】:2016-09-30 11:47:23 【问题描述】:

我正在使用 navigator.geolocation.getcurrentposition 来获取当前用户的位置(纬度/经度)。这是我的功能:

function userLocation()

    var response = [];
    if (navigator.geolocation) 

        navigator.geolocation.getCurrentPosition(function(p)
            // on success
            response['latitude'] = p.coords.latitude;
            response['longitude'] = p.coords.longitude;

            console.log(response);

        , function(e)
            // on error
            console.log(e);
        );

     else 
        console.log("Geolocation is not supported by this browser.");
    

    return response;


它总是返回空数组,我知道 getCurrentPosition 函数进行异步调用,因此无法返回响应。

我尝试使用 google geocode api 来获取位置,但这是基于用户的 IP 地址而不是那么准确。

我想要一个函数来返回这些纬度/经度。有什么方法可以在我的控制器函数中从 getCurrentPosition 获得响应?

【问题讨论】:

声明一个全局变量( var pos=; ),填充该变量并使用promises从异步地理定位调用返回值? 函数是异步的。它在后台运行,确定位置。当它成功(或失败)时,在您的代码点击return response; 几秒钟后,您传递的匿名函数将设置您的 response.latitude 和 .longitude。您需要在 console.log(response) 所在的位置运行 AJAX 调用,并使用简单的 GET/POST 请求将坐标发送到服务器。 @ChrisG 是的,这是在控制器中获取纬度/经度的方法,但是 userLocation() 函数会返回什么,如何让它等待来自 navigator.geolocation.getCurrentPosition() 的响应?我怎么知道请求是否成功? 你不能让它等待。您开始请求并告诉 JS 完成后该做什么,句号。您需要解决地理定位请求始终是异步的这一事实。 是的,这就是我要问的,你能建议一些解决方法吗? 【参考方案1】:

getLocation() 函数放置在onload 窗口中,一个弹出窗口将询问您是否允许您的位置,如果您允许,您的纬度和经度将被抓取。

请使用以下代码。

function getLocation() 
    if (navigator.geolocation) 
        navigator.geolocation.getCurrentPosition(showPosition);
     else 
        console.log("Geolocation is not supported by this browser.");
    


function showPosition(position) 
   console.log("Latitude: " + position.coords.latitude +
    "<br>Longitude: " + position.coords.longitude);
    $.ajax(
      url: 'abc.php',
      type: 'POST',
      data: 'latitude='+position.coords.latitude+'&longitude='+position.coords.longitude,
      success: function(data) 
        console.log(data);
      ,
      error: function(e) 
        //called when there is an error
        //console.log(e.message);
      
    );

请参考此链接以获取更多想法http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_geolocation

【讨论】:

我在控制台中得到响应,但我需要在控制器中访问响应 您可以从该函数向您想要的控制器方法进行ajax调用,您可以从ajax调用的请求中获取纬度和经度。 是的,这是在控制器中获取纬度/经度的方法,但是 userLocation() 函数将返回什么,如何让它等待来自 navigator.geolocation.getCurrentPosition() 的响应?我怎么知道请求是否成功? 仅从 showPosition 函数进行 ajax 调用。纬度和经度将在该函数中获取,您必须从那里进行 ajax 调用,以便在 ajax 请求中获取它。 var 结果 = getLocation();结果 true/false 的值是多少?【参考方案2】:

下面是如何处理结果:

function userLocation(cb) 
    if (navigator.geolocation) 
        navigator.geolocation.getCurrentPosition(function(p)
            // on success
            cb(null, p.coords);
        , function(e)
            // on error
            cb(e, null);
        );
     else 
        cb("Geolocation is not supported by this browser.", null);
    

现在像这样调用函数:

userLocation(function(err, coords) 
    if (err) console.log(err);
    else 
        // do something with coords
    
);

【讨论】:

【参考方案3】:

您可以使用getCurrentPosition 的第三个参数。 请参考以下示例。

var response = [];
var options = 
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
;

function success(pos) 
  response['latitude'] = pos.coords.latitude;
  response['longitude'] = pos.coords.longitude;
;

function error(err) 
  //
;

navigator.geolocation.getCurrentPosition(success, error, options);

您也可以参考以下链接。

https://www.tutorialspoint.com/html5/geolocation_getcurrentposition.htm

【讨论】:

我想在我的控制器中使用这些 lat long。我该怎么做? 您是否尝试在 PHP 控制器中使用 javascript 变量? 我只是想让这个函数的响应在我的控制器中使用。有什么建议吗? 你知道范围运算符吗?您已经在本地创建了 var response = []; 变量。所以它不会在功能之外进行管理。如果你想让它成为全局的并且可以从任何地方访问,只需在函数之外声明它。 var response = []; 并在函数中分配值。 这样不行。 getCurrentPosition 进行异步调用,因此它不会在返回之前等待响应

以上是关于从控制器中的导航器获取用户位置的主要内容,如果未能解决你的问题,请参考以下文章

从导航控制器内的表视图控制器中的按钮展开

从堆栈释放视图,带有导航控制器的标签栏

从嵌套在 UITabBarController 中的导航控制器推送视图控制器?

iOS 导航控制器获取弹出的视图控制器

使用导航控制器从 mapView 推送详细视图

iOS 中的 Mapbox 导航和我的 mapView 控制器