【发布时间】:2012-04-22 02:03:18
【问题描述】:
我正在构建一个小脚本,客户将安装在他们的页面上。地理定位对它来说不是必需的,但是如果它存在,那就太好了。有没有办法让我检查客户页面是否请求了地理位置信息,以及用户是否选择了允许在不创建另一个提示的情况下获取纬度和经度?
【问题讨论】:
标签: javascript w3c-geolocation
我正在构建一个小脚本,客户将安装在他们的页面上。地理定位对它来说不是必需的,但是如果它存在,那就太好了。有没有办法让我检查客户页面是否请求了地理位置信息,以及用户是否选择了允许在不创建另一个提示的情况下获取纬度和经度?
【问题讨论】:
标签: javascript w3c-geolocation
您可以通过检查窗口对象来检测该功能是否存在。
if('geolocation' in window){
navigator.geolocation.getCurrentPosition(...);
}
这将导致出现单个用户提示,询问用户是否希望与您的页面共享其位置。
如果地理定位在浏览器中不可用,则根本不会运行。
您可以在该页面会话期间对 API 进行后续调用而无需提示。
【讨论】:
getCurrentPosition() without提示,因为该网站之前已经引起过这样的提示。
geolocation 在导航器对象中,而不是在窗口对象中。
根据API不可能找出用户已经允许当前站点检索用户的位置,如果他还没有引起提示。见无尽@ 987654322@
我建议您在嵌入脚本时允许用户传递一个参数,告诉它是否应该使用地理定位功能。
【讨论】:
是否提示您似乎取决于浏览器及其“隐私”设置。 Safari 6 有 3 种设置:每个站点提示一次、每天每个站点提示一次和拒绝。 Chrome 23 有 3 种设置:全部允许、询问和全部拒绝。如果有一种方法可以在不打扰用户的情况下检查它是否已经被允许,那肯定会好起来的。
【讨论】:
地理定位 API 无法实现,但新权限 API 可以实现
如果您想尝试接收坐标但又不想通过提示对话框打扰用户,此代码很有用,因为坐标并不那么重要,不妨回退到 geoIP
function getCoords() {
return new Promise((resolve, reject) =>
navigator.permissions ?
// Permission API is implemented
navigator.permissions.query({
name: 'geolocation'
}).then(permission =>
// is geolocation granted?
permission.state === "granted"
? navigator.geolocation.getCurrentPosition(pos => resolve(pos.coords))
: resolve(null)
) :
// Permission API was not implemented
reject(new Error("Permission API is not supported"))
)
}
getCoords().then(coords => console.log(coords))
如果未授予权限,这将解析为 null,如果浏览器不支持某些 javascript 代码,则抛出错误,如果已授予,则解析为坐标
【讨论】:
我也遇到了同样的问题。而且,经过我的搜索和实验,我终于找到了答案。
你可以添加这个JS代码:
navigator.permissions.query({name:'geolocation'}).then(function(result) {
// Will return ['granted', 'prompt', 'denied']
console.log(result.state);
});
然后您可以根据需要使用您的自定义代码。
来源:https://developer.mozilla.org/en-US/docs/Web/API/Navigator/permissions
【讨论】: