成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > Html5定位終極解決方案

Html5定位終極解決方案

熱門標(biāo)簽:高德地圖標(biāo)注商戶怎么標(biāo) ok電銷機(jī)器人 黃石ai電銷機(jī)器人呼叫中心 智能電銷機(jī)器人被禁用了么 如何查看地圖標(biāo)注 地圖標(biāo)注軟件打印出來 電話機(jī)器人技術(shù) 惡搞電話機(jī)器人 欣鼎電銷機(jī)器人 效果

背景

到新公司的第二個(gè)項(xiàng)目,就是和小伙伴們一起做一個(gè)H5的商城,主要在微信內(nèi),但也要考慮到其他瀏覽器。其中,首頁需要根據(jù)當(dāng)前用戶的經(jīng)緯度找到距離最近的門店并展示。前端需要做的工作就是獲取用戶的經(jīng)緯度然后查詢后臺(tái)接口并渲染頁面。

目標(biāo)與分析

我們的目標(biāo)是經(jīng)過封裝之后,只需要調(diào)用一個(gè)方法就可以拿到返回的位置信息。

我們需要做的事情是,針對(duì)不同的端(微信H5和其他瀏覽器環(huán)境)封裝不同的類,再通過一個(gè)方法通過 UA 區(qū)分,調(diào)用不同環(huán)境對(duì)應(yīng)的類獲取位置。

在微信內(nèi)部,經(jīng)過反復(fù)的實(shí)踐之后,不論是通過原生的 HTML5 定位,還是通過第三方(如百度或騰訊地圖) jsapi 獲取位置,不僅定位時(shí)間長(zhǎng),甚至經(jīng)常出現(xiàn)定位失敗的情況,嚴(yán)重影響用戶體驗(yàn),尤其對(duì)于大部分信息流都依賴于用于位置的商城首頁來說,是完全無法接受的。所以在微信內(nèi)我們只有微信 sdk 這一種選擇;

而對(duì)于瀏覽器端,通過第三方的地圖 jsapi 或定位組件,可以穩(wěn)定且較快速地獲取位置信息,為了與微信內(nèi)盡量保持一致,我們選擇的是騰訊地圖 jsapi。

解決方案

Talk is cheap, show me the code. 廢話不多說,直接上代碼:

1. 在瀏覽器中,通過騰訊地圖jsapi獲取位置

1.1 在項(xiàng)目的 html 模版文件中引入騰訊地圖 jsapi

<!-- index.html -->
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=騰訊地圖key&referer=應(yīng)用名稱"></script>

說明:

使用騰訊地圖 jsapi, 需要先去騰訊地圖開放平臺(tái)申請(qǐng)自己的賬號(hào),然后創(chuàng)建自己的應(yīng)用,將騰訊地圖key 和創(chuàng)建的應(yīng)用名稱替換上面的值。

1.2 調(diào)用獲取位置接口,獲取位置信息

為了方便復(fù)用,我們單獨(dú)封裝一個(gè)騰訊地圖 jsapi 的類,命名為 tMap.js

// tMap.js
const qq = window.qq
var geolocation = null
if (qq && qq.maps) {
  // 初始化定位組件
  geolocation = new qq.maps.Geolocation(
    'QVLBZ-YUULR-OUMW7-WKXFD-4SUWS-UDBIA',
    'mymap'
  )
}

class TMap {
  // 獲取定位計(jì)數(shù)器 用于定位失敗時(shí)累計(jì)次數(shù) 超過3次后不再繼續(xù),拋出定位失敗錯(cuò)誤
  getPositionCount = 0

  // 對(duì)外暴露的獲取位置接口
  getLocation () {
    return new Promise((resolve, reject) => {
      // 定位成功回調(diào)
      this.getTMapLocation(resolve, reject)
    })
  }

  // 調(diào)用騰訊地圖獲取位置
  getTMapLocation (success, fail) {
    const _self = this

    // 定位成功回調(diào)
    const showPosition = position => {
      uni.setStorage({
        key: 'positionData',
        data: position
      })
      success(position)
    }

    // 定位失敗回調(diào)
    const showErr = (err) => 
      // 如果獲取定位失敗超過3次 拋出錯(cuò)誤 否則繼續(xù)獲取定位信息
      if (this.getPositionCount > 3) {
        fail('超過3次 獲取定位失敗')
      } else {
        // 定位失敗遞歸
        _self.getPositionCount = _self.getPositionCount + 1
        _self.getTMapLocation(success, fail)
      }
    }

    // 調(diào)用騰訊web定位組件獲取位置信息
    if (geolocation) {
      geolocation.getIpLocation(showPosition, showErr, {
        timeout: 6000,  // 定位超時(shí)時(shí)長(zhǎng) 單位ms
        failTipFlag: true
      })
    }
  }
}

export default new TMap()

2. 在微信 webview 中, 通過微信sdk獲取位置信息

2.1 微信 js-sdk 相關(guān)的準(zhǔn)備工作
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 注入權(quán)限驗(yàn)證配置
所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用。通常是通過后臺(tái)接口獲取配置信息。

/**
 * 注入權(quán)限驗(yàn)證配置
 * @param {object} 微信 js-sdk 權(quán)限驗(yàn)證配置
 */
export const wxconfigInfo = config => {
  wx.config({
    debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
    appId: config.appId,
    timestamp: parseInt(config.timestamp),
    nonceStr: config.nonceStr,
    signature: config.signature,
    jsApiList: [   // 需要使用的 jsapi 列表
      ...,
      'getLocation'  // 獲取地理位置
    ]
  })
}

2.2 調(diào)用 api 獲取位置信息

 /**
 * 微信獲取位置
 */
export const handleGetLocation = (config) => {
  return new Promise((resolve, reject)=>{
    wxconfigInfo(config)
    wx.ready(function () {
      wx.getLocation({
        type: 'wgs84', // 默認(rèn)為wgs84的gps坐標(biāo),如果要返回直接給openLocation用的火星坐標(biāo),可傳入'gcj02'
        success: function (res) {
          console.warn('微信sdk定位成功', res)
          resolve({
            lat: res.latitude, // 緯度
            lng: res.longitude, // 經(jīng)度
            speed: res.speed, // 速度,以米/每秒計(jì)
            accuracy: res.accuracy // 位置精度
          })
        },
        fail: function (err) {
          console.error('微信sdk定位失敗', err)
          reject(err)
        }
      })
    })
    wx.error(function(err) {
      // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。
      console.log('wxjsapi-error=', err)
      reject(`wxjsapi-error: ${err}`)
    })
  })

2.3 根據(jù)不同運(yùn)行環(huán)境調(diào)用不同的定位方法

// public.js

/**
 * UA枚舉
 */
const UA = {
  /**
   * 微信h5
   */
  WECHAT: 'WECHAT',
  /**
   * 支付寶h5
   */
  ALIPAY: 'ALIPAY',
  /**
   * 其他
   */
  OTHERS: 'OTHERS'
}


/**
 * 判斷客戶端運(yùn)行環(huán)境 這里只判斷微信和瀏覽器h5
 */
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 當(dāng)前頁面url
 * @param {*} options 分享信息
 * @param {*} apiType 調(diào)用api類型
 */
export const handleWXSDKCall = (_href, apiType, options) => {
  return new Promise((resolve, reject)=>{
    // 通過后臺(tái)接口獲取配置信息
    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.js
import { getUserAgent, handlerLoadScript } from '@/module/utils'
import { handleWXSDKCall } from '@/module/utils/wechat/wxJsApiSdk'
import UA from '@/module/enums/userAgent'
import TMap from '@/module/utils/tMap'

/**
 * 對(duì)外暴露的獲取位置方法
 * @return Promise resolve一個(gè) positionData 對(duì)象 lat-緯度 lng-經(jīng)度
 */
const getLocation = () => {
  return new Promise((resolve, reject) => {
    console.log('進(jìn)入全局獲取用戶位置方法')
    const storageData = uni.getStorageSync('positionData')
    const userAgent = getUserAgent()
    if (storageData) {
      resolve(storageData)
    } else {
      // 根據(jù)環(huán)境判斷 如果在微信內(nèi)使用微信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. 頁面調(diào)用

3.1 綁定方法到 Vue 原型上

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

3.2 在頁面組件中調(diào)用

onShow() {
  // 獲取位置信息后請(qǐng)求后臺(tái)接口
  this.$getLocation()
    .then(res => {
      console.warn('首頁獲取位置成功', res)
      this.latitude = res.lat
      this.longitude = res.lng
      // 這里根據(jù)獲取到的經(jīng)緯度請(qǐng)求后臺(tái)接口...
    })
    .catch(err => {
      console.error('首頁獲取位置失敗', err)
      // 錯(cuò)誤處理
    })
}

總結(jié)

遇到的坑以及需要注意的點(diǎn):

使用微信sdk獲取位置信息需要按順序完成以下步驟:

  • 異步加載微信sdk
  • 通過接口獲取配置信息,配置微信sdk
  • 在wx.ready回調(diào)中調(diào)用方法

必須嚴(yán)格按順序完成以上的三個(gè)步驟,否則是無法調(diào)用微信sdk的功能的。

總之,通過這篇文章,可以解決 H5 定位 99% 以上的應(yīng)用場(chǎng)景。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:盤錦 綏化 阿壩 金昌 聊城 赤峰 中山 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Html5定位終極解決方案》,本文關(guān)鍵詞  Html5,定位,終極,解決方案,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Html5定位終極解決方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于Html5定位終極解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    成人美女黄网站| 国产精品午夜久久| 欧美 亚洲 另类 激情 另类| 精品国产亚洲一区二区三区在线| 九色精品免费永久在线| chinesemodel无套啪啪| 亚洲影视一区| 精品久久蜜桃| 成人av午夜电影| 亚洲综合一二三区| 天天躁日日躁狠狠躁欧美| 在线观看毛片av| 日本在线不卡一区二区| 免费在线看黄网站| 久久精品日韩一区二区三区| julia中文字幕久久亚洲蜜臀| 国产精品自产拍在线观看| 国产精品视频九色porn| 精品露脸国产偷人在视频| 亚洲电影欧美电影有声小说| 欧洲一区在线电影| 欧美香蕉爽爽人人爽| 中文字幕在线一二| 亚洲天堂男人网| 国内精品久久久久久久久久久| 9999精品免费视频| 日韩av片电影专区| 91在线最新| 欧美性生活大片视频| 欧美日韩三级一区二区| 欧美在线性爱视频| 黄网站app在线观看大全免费视频| 日韩av中文在线| 久久狠狠久久综合桃花| 中文字幕一区二区三区乱码不卡| 亚洲另类激情图| 日韩成人毛片视频| 毛片网站免费观看| 日本成人免费视频| 欧美激情在线狂野欧美精品| 日韩成人免费在线| 日韩最新中文字幕电影免费看| 宅男在线观看免费高清网站| 欧美日本一区二区| 国产视频在线观看一区二区三区| 亚洲综合国产激情另类一区| 国语对白一区二区| 欧美日韩精品一区| 日本理论中文字幕| 触手亚洲一区二区三区| 国产精品黄视频| 精品国产电影一区二区| www.久久99| 图片区小说区亚洲| 中文字幕在线看视频国产欧美在线看完整| 国产精品久久三区| 毛片毛片毛片毛片| 欧美男男gaytwinkfreevideos| 中文字幕在线看精品乱码| 91动漫免费网站| 国产精品久久久久久久app| 一区二区视频网| 亚洲一区在线播放| 九色蝌蚪在线观看| 2020中文字幕在线播放| 亚洲午夜激情网站| 欧美极品美女视频网站在线观看免费| 欧美伊人影院| 中国免费黄色片| 亚洲精品高清视频| 国产精品久久久一区麻豆最新章节| 成人国产电影在线观看| 日韩不卡视频一区二区| 在线播放黄色网址| 日本熟妇色xxxxx日本免费看| 成人黄页毛片网站| 这里有精品可以观看| 五十路中文字幕| 欧美在线性爱视频| 男女交配网站| 国产情侣一区在线| 成人性生交大片免费网站| 欧美剧在线免费观看网站| 免费网站看v片在线a| 免费看av毛片| 日韩av电影在线观看| 天天操天天操天天操天天| 国产欧美视频在线观看| 成人国产亚洲欧美成人综合网| 欧美日韩精品欧美日韩精品| 久久综合国产精品| 性久久久久久久久久久久久久| 福利小视频在线观看| 亚洲av成人精品毛片| 日韩av在线一区二区| 国产精品欧美精品| 爱啪啪综合导航| 波多野结衣中文字幕在线播放| 欧洲视频一区| 日韩欧美亚洲日产国| 2020日本在线视频中文字幕| 一二三四视频在线社区中文字幕2| 亚洲国产精品激情在线观看| 国产精品免费一区| 亚洲综合色丁香婷婷六月图片| 床上的激情91.| 精品一区二区三区在线观看l| 欧美大黄免费观看| 中文字幕一区久| 久久久久久久久久美女| 天天射夜夜爽| 黄色激情在线观看| 99在线精品视频免费观看软件| 爆操欧美孕妇| 欧美日韩视频第一区| 成人淫片免费视频95视频| 久久亚洲精品小早川怜子66| 国产精品影视在线观看| 亚洲日本无吗高清不卡| 国产精品白丝jk白祙喷水网站| 色欲色香天天天综合网www| 国产911网站| 久久天天躁狠狠躁夜夜躁| 欧美视频精品在线观看| 国自产精品手机在线观看视频| www.中文字幕.com| 中文字幕亚洲一区二区va在线| 精品国产精品| 三级黄在线观看| 九色网com| 波多野结衣一区二区三区| 在线亚洲精品自拍| 亚洲女人的天堂| 成人三级视频在线观看一区二区| 久久午夜剧场| 天天影视欧美综合在线观看| 都市激情国产精品| 波多野结衣视频一区二区| 久久精品国产成人av| www.亚洲视频.com| 宅男在线一区| 精品久久香蕉国产线看观看亚洲| 欧美视频在线观看免费| 久久久亚洲av波多野结衣| 亚洲精品永久免费视频| 欧美三级黄美女| 精品午夜福利视频| 91视频在线看| 日韩欧美国产骚| 相泽南亚洲一区二区在线播放| 亚洲国产一区二区三区a毛片| 福利在线一区| 中文字幕综合一区| 男女午夜视频在线观看| 久久视频精品在线| 欧美吻胸吃奶大尺度电影| 日本成人精品在线| 激情成人在线视频| 国产乱码精品1区2区3区| 91精品国产99| 美日韩精品免费视频| 5566中文字幕一区二区电影| 亚洲伊人第一页| 亚洲国产aⅴ精品一区二区三区| 全部孕妇毛片丰满孕妇孕交| 黄色毛片av| 久久视频在线视频| 亚洲xxxx3d| 亚洲日本中文字幕| 国产一级性生活| 欧美一区二区精品| 一区二区三区不卡在线观看| 免费成人蒂法| 精品亚洲aⅴ乱码一区二区三区| 亚洲综合网av| 在线观看不卡一区| 碰碰在线视频| 成人拍拍拍免费视频网站| 日韩专区在线视频| 再深点灬舒服灬太大了少妇| 久久久精品动漫| 日本中文字幕免费| 日日夜夜操操操| 午夜国产福利在线| 久草视频在线免费看| 日韩av不卡一区二区| 国产精品一区二区黑丝| 亚洲女人被黑人巨大进入| 久久免费看av| 成全电影大全在线观看| 懂色av一区二区三区| 黄频视频在线观看| 不卡视频在线看| 国产精品久久久久久久午夜| 欧美日韩另类综合| 97国产一区二区精品久久呦| 久久久噜噜噜久久中文字免| 一道本无吗一区| 26uuu成人| 日韩av网站在线播放| 日本黄色小说视频| 日本激情视频一区二区三区| 日韩av专区| 亚洲欧洲日产国码二区| 性色av香蕉一区二区| 国产精品宾馆在线精品酒店| 亚洲乱亚洲乱妇无码| 日韩在线观看高清| www.xxxx精品| 亚洲国产精品自拍| 99视频在线观看视频| 一区二区电影在线观看| 免费在线观看黄色小视频| 欧美丝袜丝交足nylons| 成人羞羞国产免费图片| 国产视频手机在线| 美国毛片一区二区三区| 久久精品国产www456c0m| 三级在线观看免费大全| xfplay5566色资源网站| 日本不卡视频在线播放| 99精品美女视频在线观看热舞| 日韩成人毛片视频| 亚洲视频免费一区| 人人妻人人藻人人爽欧美一区| 911亚洲精选| 在线免费看v片| 国产成人综合一区二区三区| 国产精品麻豆免费版| 在线观看日本中文字幕| 国产不卡123| 色综合天天综合网国产成人综合天| 艳妇乳肉豪妇荡乳av无码福利| 91免费综合在线| 欧美gvvideo网站| 免费看国产精品一二区视频| 国产精品视频网址| 久久99精品国产自在现线| 国产在线1区| 精品国产乱码| 国产一二三区在线观看| 久久久久久久久久久久久久久99| 成人情趣片在线观看免费| 无码国精品一区二区免费蜜桃| 真实国产乱子伦精品一区二区三区| 国产色婷婷亚洲99精品小说| 视频在线观看一区二区| 午夜伦欧美伦电影理论片| 亚洲蜜臀av乱码久久精品蜜桃| 国产精品久久久久久久一区二区| 青青草原国产在线观看| 免费电影一区二区三区| 亚洲精品久久久蜜桃动漫| 中文字幕一区二区三区乱码图片| 福利一区二区三区视频在线观看| 国内精品久久久久| 亚洲最新中文字幕| 一道本在线观看视频| 国产精品夜夜嗨| 欧美一级高清片在线观看| 不卡的av网站| 91丨porny丨首页| 国产黄色激情视频| 亚洲精品自在在线观看| 免费av网址在线| 五月婷婷在线观看| 亚洲欧美日韩第一页| 亚洲精品一区二区三区中文字幕| 在线亚洲自拍| 国产片侵犯亲女视频播放| 免费看av不卡| www日本黄色| 视频在线这里都是精品| 国产在线一区二| 亚洲精品一区二| 国产字幕在线看| 久久国产精品第一页| 国产精品爽爽久久久久久| 久久亚洲精品成人| 亚洲人在线观看视频| 91精品国产综合久久精品性色| 国产又粗又猛又色| 人人妻人人做人人爽| 国产精品午夜一区二区三区| 成人a视频在线| 少妇高潮av久久久久久| 国产精品一国产精品最新章节| 国产精选一区二区三区| 亚洲承认在线| 超碰日本道色综合久久综合| 成人在线观看你懂的| 精品国产欧美日韩不卡在线观看| 日本夜夜草视频网站| 日本年轻的继坶中文字幕| 国产三级伦理片| 国产精品成人无码专区| 精品少妇爆乳无码av无码专区| 91在线精品一区二区三区| 免费看毛片的网址| 午夜精品一区二区三区在线观看| 欧美大香线蕉线伊人久久国产精品| 波多野结衣在线一区二区| 精品国产乱子伦| 亚洲免费观看高清完整版在线观看| 亚洲系列在线观看| 欧美三级午夜理伦三级富婆| 国产一级在线| 蜜桃视频污在线观看| 国产欧美一区二区三区在线| koreanbj精品视频一区| 性欧美精品一区二区三区在线播放| 欧洲亚洲妇女av| 亚洲欧美制服另类日韩| 怡红院亚洲色图| 亚洲精品字幕在线| 亚洲天堂资源在线| 久久影视电视剧免费网站| 亚洲欧美日韩综合aⅴ视频| 亚洲人辣妹窥探嘘嘘| 欧美视频成人| 鲁鲁视频www一区二区| 欧美日韩一区国产| 美女裸体自慰在线观看| 玖玖玖国产精品| 怡红院成永久免费人全部视频| 在线观看完整版免费| 国产欧美一区二区三区视频| 三区四区在线视频|