navigator.geolocation 和回调的回调
Posted
技术标签:
【中文标题】navigator.geolocation 和回调的回调【英文标题】:navigator.geolocation and callback of callback 【发布时间】:2015-05-17 08:27:49 【问题描述】:最初,我有一个有效的代码:
function get_coords(callback)
//If html5 Geolocation Is Supported In This Browser
if (navigator.geolocation)
//Use HTML5 Geolocation API To Get Current Position
navigator.geolocation.getCurrentPosition(function(position)
//Get Latitude From Geolocation API
var lat = position.coords.latitude;
//Get Longitude From Geolocation API
var lng = position.coords.longitude;
callback(["coords", lat, lng]);
,
function()
callback(["geoloc_deactivated"]);
);
else
callback(["geoloc_not_supported"]);
然后我想整合这个页面的解决方案: http://jsfiddle.net/CvSW4/
现在我的代码看起来像这样,它不再工作了(丢失在回调函数中):
function get_coords(callback)
//If HTML5 Geolocation Is Supported In This Browser
if (navigator.geolocation)
//~ //Use HTML5 Geolocation API To Get Current Position
navigator.geolocation.getCurrentPosition(
successCallback,
errorCallback_highAccuracy,
maximumAge:600000, timeout:5000, enableHighAccuracy: true
);
else
callback(["geoloc_not_supported"]);
function successCallback(position)
var lat = position.coords.latitude;
var lng = position.coords.longitude;
position(["coords", lat, lng]);
function errorCallback_highAccuracy(callback_high_accuracy)
if (error.code == error.TIMEOUT)
// Attempt to get GPS loc timed out after 5 seconds,
// try low accuracy location
navigator.geolocation.getCurrentPosition(
successCallback,
errorCallback_lowAccuracy,
maximumAge:600000, timeout:10000, enableHighAccuracy: false);
return;
if (error.code == 1)
callback_high_accuracy(["perm_denied"])
else if (error.code == 2)
callback_high_accuracy(["pos_unavailable"])
function errorCallback_lowAccuracy(callback_low_accuracy)
if (error.code == 1)
callback_low_accuracy(["perm_denied"])
else if (error.code == 2)
callback_low_accuracy(["pos_unavailable"])
else if (error.code == 3)
callback_low_accuracy(["timeout"])
我得到错误:
Uncaught TypeError: object is not a functioncampaigns.min.js:37 successCallback
该行是:
position(["coords", lat, lng]);
如何使回调起作用?
【问题讨论】:
因为position
不是一个函数,而是传递给您的回调的位置对象...您没有阅读navigator.geolocation.getCurrentPosition
的文档吗?
我投票决定将此问题作为题外话结束,因为阅读友好手册可以轻松解决它。
我知道我得到了一个位置对象。但我不明白如何在回调中返回它! :(
你不退货。 API 是异步的。你不能向调用者返回任何东西;这就是使用回调的原因。
【参考方案1】:
我刚刚发现了如何让它发挥作用。
下面的代码使用他/她的 IP 地址(html5 功能)跟踪用户的位置。先用高精度5秒,万一出错,再用低精度10秒。
如果有错误,回调给出错误。如果地理位置有效,它会给出坐标。
function get_coords(callback)
//If HTML5 Geolocation Is Supported In This Browser
if (navigator.geolocation)
//Use HTML5 Geolocation API To Get Current Position
// try high accuracy location for 5 seconds
navigator.geolocation.getCurrentPosition(function(position)
//Get Latitude From Geolocation API
var lat = position.coords.latitude;
//Get Longitude From Geolocation API
var lng = position.coords.longitude;
window.console&&console.log('coords : latitude=' + lat + ", longitude=" + lng);
callback(["coords", lat, lng]);
,
function(error)
if (error.code == error.TIMEOUT)
// Attempt to get GPS loc timed out after 5 seconds,
// try low accuracy location for 10 seconds
navigator.geolocation.getCurrentPosition(function(position)
//Get Latitude From Geolocation API
var lat = position.coords.latitude;
//Get Longitude From Geolocation API
var lng = position.coords.longitude;
window.console&&console.log('coords : latitude=' + lat + ", longitude=" + lng);
callback(["coords", lat, lng]);
,
function(error)
if (error.code == 1)
window.console&&console.log('low accuracy geoloc_deactivated');
callback(["geoloc_deactivated"]);
else if (error.code == 2)
window.console&&console.log('low accuracy position_unavailable');
callback(["position_unavailable"]);
else if (error.code == 3)
window.console&&console.log("low accuracy timeout");
callback(["timeout"]);
,
maximumAge:600000,
timeout:10000,
enableHighAccuracy: false
);
if (error.code == 1)
window.console&&console.log('high accuracy geoloc_deactivated');
callback(["geoloc_deactivated"]);
else if (error.code == 2)
window.console&&console.log('high accuracy position_unavailable');
callback(["position_unavailable"]);
,
maximumAge:600000,
timeout:5000,
enableHighAccuracy: true
);
else
window.console&&console.log("geoloc_not_supported");
callback(["geoloc_not_supported"]);
代码使用方法:在你要跟踪用户的页面上,使用这个javascript
调用:
get_coords(function(callback)
if (callback[0]=="coords")
user_coords=[callback[1],callback[2]];
//do stuff
else if(callback[0]=="position_unavailable")
//do stuff
else if(callback[0]=="timeout")
//do stuff
else if(callback[0]=="geoloc_deactivated")
//do stuff
else if(callback[0]=="geoloc_not_supported")
//do stuff
);
【讨论】:
以上是关于navigator.geolocation 和回调的回调的主要内容,如果未能解决你的问题,请参考以下文章
html5-geolocation : navigator.geolocation.watchPosition 连续回调
navigator.geolocation.getCurrentPosition 的“无操作”回调在哪里?
navigator.geolocation.getCurrentPosition的回调没有在firefox中触发