【问题标题】:Check if Geolocation was allowed and get Lat Lon检查是否允许地理定位并获取 Lat Lon
【发布时间】:2012-04-22 02:03:18
【问题描述】:

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

【问题讨论】:

    标签: javascript w3c-geolocation


    【解决方案1】:

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

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

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

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


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

    您可以在该页面会话期间对 API 进行后续调用而无需提示。

    参考:MDN Geolocation -- Watching the current position

    【讨论】:

    • 我不认为他在乎浏览器是否支持 - 他想知道,如果浏览器支持它,他是否可以调用getCurrentPosition() without提示,因为该网站之前已经引起过这样的提示。
    • @ThiefMaster。除非您提出问题,否则这不是反对票。提问者的意图不明确。但是,在这种情况下,请查看我的更新。
    • 我认为geolocation 在导航器对象中,而不是在窗口对象中。
    【解决方案2】:

    根据API不可能找出用户已经允许当前站点检索用户的位置,如果他还没有引起提示。见无尽@ 987654322@

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是一种方便的方法,但是 - 因为它是一个相当新的 API - 重要的是要提及可能的兼容性问题。例如:caniuse.com/#feat=permissions-api
        【解决方案5】:

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

        你可以添加这个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

        【讨论】:

        • 完美!谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多