JavaScript获取用户IP属地与地理位置的三种方案对比

作者:闭包旅人时间:2026-10-25 10:46:38浏览:626

本文详细解析利用JavaScript获取用户IP属地及地理位置的三种常见方案。通过对比navigator.geolocation、搜狐城市接口及百度地图API的实际调用过程,分析各方法在获取精度、跨域处理及用户授权提示方面的差异,帮助开发者选择最适合业务场景的定位技术。

前言

许多平台会展示用户所在的省市等位置信息,这通常依赖于通信网络运营商的数据支持。尽管具体实现机制尚不明确,但我们可以先通过实践来探索如何在Web端获取这些位置信息。

方案一:使用navigator.geolocation

首先尝试调用浏览器原生的 navigator.geolocation 接口,但实际测试中未能成功获取到预期的位置数据。

getGeolocation(){
  if ('geolocation' in navigator) {
    /* 地理位置服务可用 */
    console.log('地理位置服务可用')
    navigator.geolocation.getCurrentPosition(function (position) {
      console.dir('回调成功')
      console.dir(position) // 没有输出
      console.dir(position.coords.latitude, position.coords.longitude)
    }, function (error) {
      console.error(error)
    })
  } else {
    /* 地理位置服务不可用 */
    console.error('地理位置服务可用')
  }
}

方案二:调用搜狐城市接口

接着尝试通过访问 http://pv.sohu.com/cityjson?ie=utf-8 这一搜狐提供的接口来获取用户位置信息,该方式成功返回了数据。示例数据格式如下:

{"cip": "14.11.11.11", "cid": "440000", "cname": "广东省"}
// 需要做跨域处理
getIpAndAddressSohu(){
  // config 是配置对象,可按需设置,例如 responseType,headers 中设置 token 等
  const config = {
    headers: {
      Accept: 'application/json',
      'Content-Type': 'application/json;charset=UTF-8',
    },
  }
  axios.get('/apiSohu/cityjson?ie=utf-8', config).then(res => {
    console.log(res.data) // var returnCitySN = {"cip": "14.23.44.50", "cid": "440000", "cname": "广东省"};
    const info = res.data.substring(19, res.data.length - 1)
    console.log(info) // {"cip": "14.23.44.50", "cid": "440000", "cname": "广东省"}
    this.ip = JSON.parse(info).cip
    this.address = JSON.parse(info).cname
  })
}

在调试过程中,针对该接口的跨域请求进行了相应处理。

proxy: {
  '/apiSohu': {
    target: 'http://pv.sohu.com/', // localhost=>target
    changeOrigin: true,
    pathRewrite: {
    '/apiSohu': '/'
    }
  },
}

以下是成功获取到位置信息后的界面展示效果:

前言

方案三:集成百度地图接口

使用此方案需要引入百度地图的依赖库,并特别注意配置参数 ak,该参数需向百度地图管理方申请获取。具体引入方式如下:

<script src="https://api.map.baidu.com/api?v=2.0&ak=3ufnnh6aD5CST"></script>
getLocation() { /*获取当前位置(浏览器定位)*/
  const $this = this;
  var geolocation = new BMap.Geolocation();//返回用户当前的位置
  geolocation.getCurrentPosition(function (r) {
    if (this.getStatus() == BMAP_STATUS_SUCCESS) {
      $this.city = r.address.city;
      console.log(r.address) // {city: '广州市', city_code: 0, district: '', province: '广东省', street: '', …}
    }
  });
}
function getLocationBaiduIp(){/*获取用户当前位置(ip定位)*/
  function myFun(result){
    const cityName = result.name;
    console.log(result) // {center: O, level: 12, name: '广州市', code: 257}
  }
  var myCity = new BMap.LocalCity();
  myCity.get(myFun);
}

该方法能够获取用户的省市位置及经纬度坐标,但调用时会触发浏览器弹窗以征求用户的位置授权意见。

前言

前言

总结与反思

综合测试结果来看,各方案表现各有优劣。值得注意的是,搜狐接口内部似乎并未像其他方案那样触发浏览器层面的用户授权弹窗,其实现机制尚不明确。

前言

相比之下,navigator.geolocation 和 BMap.Geolocation() 在调用时均会弹出系统级的用户授权提示框。

依赖第三方接口虽然便捷,但对其底层实现逻辑缺乏掌控,且不清楚其无需用户授权提示的具体技术原理。

经实际测试验证,搜狐接口与 new BMap.Geolocation() 均能有效获取用户的位置信息,包括省市名称及经纬度坐标等关键数据。

本文关于利用JavaScript获取用户IP属地方法的详解到此结束,更多相关JavaScript获取用户IP属地内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章