本来想用html5的新API navigator.geolocation 来实现获取用户的经纬度的。
MDN 中介绍的语法+例子
1 navigator.geolocation.getCurrentPosition(success , error , options )
参数是回调函数,好像调用一下成功的回调函数就可以获得数据啦( ̄▽ ̄)。然鹅,实际就算你去跑官网的例子,一样不行,返回错误信息如下:
1 ERROR (3 ) : Timeout expired
为啥超时了呢,搜了一波发现有个解释:因为部分浏览器使用的谷歌的定位服务,而谷歌服务在中国被墙了,所以要么定位非常非常慢,也非常非常不准,要么直接无法定位。。。。
所以放弃使用geolocation来获取经纬度,准备用腾讯地图的API来获取。
react中引入腾讯地图 但是腾讯地图 官网的例子,直接在react项目中使用,直接报错,qq对象不存在。
第一种方法:
首先,需要在react中的webpack中设置:
1 2 3 4 5 module .exports = { externals:{ 'QMap' :'qq.maps' }, }
然后引用
直接使用
1 new QMap.Map(this .refs .map , this .props .options )
我自己是webpack4.44.2版本的,需要注意的是module.exports变成了这样
1 2 3 4 5 6 7 8 module.exports = function (webpackEnv) {//由对象变成了函数 ... return {//在return 中配置 //entry:... //output:... externals:{...} } }
其中,如果我们想引用一个库,但是又不想让webpack打包,并且又不影响我们在程序中以CMD、AMD或者window/global全局等方式进行使用,那就可以通过配置externals。
或者直接npm i qqmap,引入依赖。
第二种方法
用Window对象保存QMap变量,实现HTML文件和JS文件间的变量传递
先引入脚本
1 2 3 4 <script type ="text/javascript" src ="https://apis.map.qq.com/tools/geolocation/min?key=UQPBZ-RCU36-K2YS3-EMV6Y-JI6JJ-3WBUM&referer=myapp&callback=showPosition" > </script > <script > window .QMap = qq.maps; </script >
将QMap对象保存到全局可访问的window对象中,使用方法如下
我在项目中使用new qq.maps.Geocoder就会报错,后来查看文档发现了可以自动获取IP地址进行定位👍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let citylocation = new qq.maps.CityService(); citylocation.setComplete(function (result ) { let a= JSON .parse(JSON .stringify(result.detail.latLng)) console .log(a); let {lat,lng}= a; console .log(lat+',' +lng) this .setState({ location:lat+',' +lng }) }); citylocation.setError(function ( ) { alert("出错了,请输入正确的经纬度!!!" ); }); citylocation.searchLocalCity(); })
控制台成功输出经纬度
由于使用IP定位会出现定位不准的情况,所以还是得使用腾讯前端定位组件,在react中使用。
我的项目中,react项目创建的index在public里面,所以在public/index.html中引入script标签实现跨域。
1 2 3 4 5 6 7 8 9 let QMap=window.QMaplet geolocation=new QMap.Geolocation() geolocation.getLocation(showPosition , showErr ) ;function showPosition(position ) { console.log(JSON . stringify(position)) };function showErr() { console.log("err!!!!" ) };
然鹅,发现一个很诡异的问题,成功拿到了返回的数据,但是一直走失败逻辑!!!!我设置了callback都无用。
在搜了一波之后,官网的FAQ其实就告诉我了👇
因为我本地创建的react项目默认走的是http协议,所以要升级为https。方法见下篇文章。