17

我正在构建一个小脚本,客户将安装在他们的页面上。地理定位对它来说不是必需的,但是如果它存在,那就太好了。有没有办法让我检查客户页面是否已请求地理位置信息,以及用户是否选择允许在不创建另一个提示的情况下获取纬度和经度?

4

5 回答 5

29

使用地理定位 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 代码,则抛出错误,如果已被授予,则解析为坐标

于 2016-02-25T13:22:13.567 回答
7

您可以通过检查窗口对象来检测该功能是否存在。

if ('geolocation' in navigator) {
     navigator.geolocation.getCurrentPosition(...);
}

这将导致出现单个用户提示,询问用户是否希望与您的页面共享其位置。

如果地理定位在浏览器中不可用,则根本不会运行。


**编辑** 如果您已经在此 *页面加载* 上提示用户允许地理定位访问,它不会再次提示您。如果用户离开并返回此页面,它将重新提示他们。

在该页面会话期间,您可以在不提示的情况下对 API 进行后续调用。

参考:MDN Geolocation -- 查看当前位置

于 2012-04-09T18:10:44.000 回答
6

我也遇到了同样的问题。而且,经过我的搜索和实验,我终于找到了答案。

您可以添加此 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

于 2018-05-03T09:43:01.607 回答
4

根据API,不可能找出用户已经允许当前站点检索用户的位置,而不会在他没有提示的情况下得到提示。看到无尽的答案

我建议您在嵌入脚本时允许用户传递一个参数,告诉它是否应该使用地理定位功能。

于 2012-04-09T18:16:31.093 回答
2

是否提示您似乎取决于浏览器以及它的“隐私”设置。Safari 6 有 3 种设置:每个站点提示一次、每天每个站点提示一次和拒绝。Chrome 23 有 3 种设置:全部允许、询问和全部拒绝。如果有一种方法可以在不打扰用户的情况下检查它是否已经被允许,那肯定会好起来的。

于 2012-12-03T23:11:53.367 回答