千家信息网

Html5中如何解决定位问题

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关Html5中如何解决定位问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目标与分析我们的目标是经过封装之后,只需要调用一个方法就可以拿到返回的位
千家信息网最后更新 2026年11月03日Html5中如何解决定位问题

这篇文章给大家分享的是有关Html5中如何解决定位问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

目标与分析

我们的目标是经过封装之后,只需要调用一个方法就可以拿到返回的位置信息。

我们需要做的事情是,针对不同的端(微信H5和其他浏览器环境)封装不同的类,再通过一个方法通过 UA 区分,调用不同环境对应的类获取位置。

在微信内部,经过反复的实践之后,不论是通过原生的 HTML5 定位,还是通过第三方(如百度或腾讯地图) jsapi 获取位置,不仅定位时间长,甚至经常出现定位失败的情况,严重影响用户体验,尤其对于大部分信息流都依赖于用于位置的商城首页来说,是完全无法接受的。所以在微信内我们只有微信 sdk 这一种选择;

而对于浏览器端,通过第三方的地图 jsapi 或定位组件,可以稳定且较快速地获取位置信息,为了与微信内尽量保持一致,我们选择的是腾讯地图 jsapi。

解决方案

Talk is cheap, show me the code. 废话不多说,直接上代码:

1. 在浏览器中,通过腾讯地图jsapi获取位置

1.1 在项目的 html 模版文件中引入腾讯地图 jsapi:

说明:

使用腾讯地图 jsapi, 需要先去腾讯地图开放平台申请自己的账号,然后创建自己的应用,将腾讯地图key 和创建的应用名称替换上面的值。

1.2 调用获取位置接口,获取位置信息

为了方便复用,我们单独封装一个腾讯地图 jsapi 的类,命名为 tMap.js

// tMap.jsconst qq = window.qqvar geolocation = nullif (qq && qq.maps) {  // 初始化定位组件  geolocation = new qq.maps.Geolocation(    'QVLBZ-YUULR-OUMW7-WKXFD-4SUWS-UDBIA',    'mymap'  )}class TMap {  // 获取定位计数器 用于定位失败时累计次数 超过3次后不再继续,抛出定位失败错误  getPositionCount = 0  // 对外暴露的获取位置接口  getLocation () {    return new Promise((resolve, reject) => {      // 定位成功回调      this.getTMapLocation(resolve, reject)    })  }  // 调用腾讯地图获取位置  getTMapLocation (success, fail) {    const _self = this    // 定位成功回调    const showPosition = position => {      uni.setStorage({        key: 'positionData',        data: position      })      success(position)    }    // 定位失败回调    const showErr = (err) =>       // 如果获取定位失败超过3次 抛出错误 否则继续获取定位信息      if (this.getPositionCount > 3) {        fail('超过3次 获取定位失败')      } else {        // 定位失败递归        _self.getPositionCount = _self.getPositionCount + 1        _self.getTMapLocation(success, fail)      }    }    // 调用腾讯web定位组件获取位置信息    if (geolocation) {      geolocation.getIpLocation(showPosition, showErr, {        timeout: 6000,  // 定位超时时长 单位ms        failTipFlag: true      })    }  }}export default new TMap()

2. 在微信 webview 中, 通过微信sdk获取位置信息

2.1 微信 js-sdk 相关的准备工作
2.1.1 引入js文件

/** * 微信sdk异步加载 * @param {*} src * @param {*} callback api接口 */export const handlerLoadScript = callback => {  const src = `https://res.wx.qq.com/open/js/jweixin-1.4.0.js`  if (!(typeof callback === 'function')) {    callback = function() {}  }  var check = document.querySelectorAll(`script[src="${src}"]`)  if (check.length > 0) {    check[0].addEventListener('load', function() {      callback()    })    callback()    return  }  var script = document.createElement('script')  var head = document.getElementsByTagName('head')[0]  script.type = 'text/javascript'  script.charset = 'UTF-8'  script.src = src  if (script.addEventListener) {    script.addEventListener(      'load',      function() {        callback()      },      false    )  } else if (script.attachEvent) {    script.attachEvent('onreadystatechange', function() {      var target = window.event.srcElement      if (target.readyState === 'loaded') {        callback()      }    })  }  head.appendChild(script)}

2.1.2 注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用。通常是通过后台接口获取配置信息。

/** * 注入权限验证配置 * @param {object} 微信 js-sdk 权限验证配置 */export const wxconfigInfo = config => {  wx.config({    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。    appId: config.appId,    timestamp: parseInt(config.timestamp),    nonceStr: config.nonceStr,    signature: config.signature,    jsApiList: [   // 需要使用的 jsapi 列表      ...,      'getLocation'  // 获取地理位置    ]  })}

2.2 调用 api 获取位置信息

 /** * 微信获取位置 */export const handleGetLocation = (config) => {  return new Promise((resolve, reject)=>{    wxconfigInfo(config)    wx.ready(function () {      wx.getLocation({        type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'        success: function (res) {          console.warn('微信sdk定位成功', res)          resolve({            lat: res.latitude, // 纬度            lng: res.longitude, // 经度            speed: res.speed, // 速度,以米/每秒计            accuracy: res.accuracy // 位置精度          })        },        fail: function (err) {          console.error('微信sdk定位失败', err)          reject(err)        }      })    })    wx.error(function(err) {      // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。      console.log('wxjsapi-error=', err)      reject(`wxjsapi-error: ${err}`)    })  })

2.3 根据不同运行环境调用不同的定位方法

// public.js/** * UA枚举 */const UA = {  /**   * 微信h6   */  WECHAT: 'WECHAT',  /**   * 支付宝h6   */  ALIPAY: 'ALIPAY',  /**   * 其他   */  OTHERS: 'OTHERS'}/** * 判断客户端运行环境 这里只判断微信和浏览器h6 */export const getUserAgent = () => {  var userAgent = navigator.userAgent.toLowerCase()  if (userAgent.match(/Alipay/i) == 'alipay') {    return UA.ALIPAY  } else if (userAgent.match(/MicroMessenger/i) == 'micromessenger') {    return UA.WECHAT  } else {    return UA.OTHERS  }}
// js-sdk.js/** * 唤起微信api * @param {*} _href 当前页面url * @param {*} options 分享信息 * @param {*} apiType 调用api类型 */export const handleWXSDKCall = (_href, apiType, options) => {  return new Promise((resolve, reject)=>{    // 通过后台接口获取配置信息    WeChatServivce.sign(_href)      .then(res => {        if (res) {          if ( apiType === 'location' ) {            handleGetLocation(res).then((res)=>{              resolve(res)            }).catch(err=>{              reject(err)            })          }        }      })      .catch(err => {        reject(`err-sign: ${err}`)        uni.showToast({          title: err.data.code + err.data.msg,          mask: true,          icon: 'none'        })      })  })}// getLocation.jsimport { getUserAgent, handlerLoadScript } from '@/module/utils'import { handleWXSDKCall } from '@/module/utils/wechat/wxJsApiSdk'import UA from '@/module/enums/userAgent'import TMap from '@/module/utils/tMap'/** * 对外暴露的获取位置方法 * @return Promise resolve一个 positionData 对象 lat-纬度 lng-经度 */const getLocation = () => {  return new Promise((resolve, reject) => {    console.log('进入全局获取用户位置方法')    const storageData = uni.getStorageSync('positionData')    const userAgent = getUserAgent()    if (storageData) {      resolve(storageData)    } else {      // 根据环境判断 如果在微信内使用微信sdk 其他使用腾讯地图定位组件      if (userAgent === UA.WECHAT) {        handlerLoadScript(() => {          handleWXSDKCall_(window.location.href, 'location').then((res) => {            uni.setStorageSync('positionData', res)            resolve(res)          }).catch(err => {            reject(err)          })        })      } else {        TMap.getLocation().then(res => {          uni.setStorageSync('positionData', res)          resolve(res)        }).catch((err) => {          reject(err)        })      }    }  })}export default getLocation

3. 页面调用

3.1 绑定方法到 Vue 原型上:

import getLocation from '@/module/utils/getLocation'Vue.prototype.$getLocation = getLocation

3.2 在页面组件中调用:

onShow() {  // 获取位置信息后请求后台接口  this.$getLocation()    .then(res => {      console.warn('首页获取位置成功', res)      this.latitude = res.lat      this.longitude = res.lng      // 这里根据获取到的经纬度请求后台接口...    })    .catch(err => {      console.error('首页获取位置失败', err)      // 错误处理    })}

总结

遇到的坑以及需要注意的点:

使用微信sdk获取位置信息需要按顺序完成以下步骤:

  • 异步加载微信sdk

  • 通过接口获取配置信息,配置微信sdk

  • 在wx.ready回调中调用方法

必须严格按顺序完成以上的三个步骤,否则是无法调用微信sdk的功能的。

感谢各位的阅读!关于"Html5中如何解决定位问题"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

定位 位置 信息 地图 腾讯 接口 配置 方法 不同 环境 组件 验证 成功 后台 浏览器 错误 页面 浏览 参数 权限 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 高科技互联网 中国互联网科技工作委员会毛军 迪茉互联网科技 凡科互联网科技 无锡溥仪互联网科技有限公司 上海电发互联网科技有限公司 现代科技和互联网有关系吗 北京华百购互联网科技有限公司 荆州市昕露互联网络科技有限公司 开一家科技互联网公司需要多少钱 互联网科技研发水平 互联网金融科技名词解释 深圳无忧互联网科技 浙南科技城互联网大厦招聘 九思连强互联网电子科技有限公司 互联网公司属于科技吗 数字科技和互联网金融哪个好 东风日产互联网科技公司叫什么 宁波允成互联网科技有限公司 科技与互联网发展 互联网科技咨询 互联网科技公司做什么 搜狐科技互联网 西安小鹰速贷互联网科技有限公司 滨湖区互联网智能科技产品有哪些 上海京穆互联网科技有限公司 伍佰万互联网科技怎么赚钱 北京天晋互联网科技有限公司 保山浩联互联网科技有限公司
0