从控制器中的导航器获取用户位置
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 进行异步调用,因此它不会在返回之前等待响应以上是关于从控制器中的导航器获取用户位置的主要内容,如果未能解决你的问题,请参考以下文章