调用百度地图API输入提示示例下拉列表一直被触发问题

简介:

先看图

然后点确定,居然下拉框又被触发了,而且在添加页面各种输入框只要一输入文字就会触发地图下拉框展示,很恶心的一个bug,不知道有没有人遇到过。

从百度api贴 的代码,自己有根据需求修改过,大致一样

  return document.getElementById(id)
      }
      var ac = new BMap.Autocomplete( // 建立一个自动完成的对象
        {
          'input': 'suggestId',
          'location': map
        }
      )
      ac.addEventListener('onhighlight', function(e) { // 鼠标放在下拉列表上的事件
        var str = ''
        var _value = e.fromitem.value
        var value = ''
        if (e.fromitem.index > -1) {
          value = _value.province + _value.city + _value.district + _value.street + _value.business
        }
        str = 'FromItem<br />index = ' + e.fromitem.index + '<br />value = ' + value
        value = ''
        if (e.toitem.index > -1) {
          _value = e.toitem.value
          value = _value.province + _value.city + _value.district + _value.street + _value.business
        }
        str += '<br />ToItem<br />index = ' + e.toitem.index + ' <br />value = ' + value
        G('searchResultPanel').innerHTML = str
      })
      var myValue
      ac.addEventListener('onconfirm', function(e) { // 鼠标点击下拉列表后的事件
        var _value = e.item.value
        myValue = _value.province + _value.city + _value.district + _value.street + _value.business
        G('searchResultPanel').innerHTML = 'onconfirm<br />index = ' + e.item.index + '<br />myValue = ' + myValue
        setPlace()
      })
      function setPlace() {
        map.clearOverlays() // 清除地图上所有覆盖物
        function myFun() {
          var pp = local.getResults().getPoi(0).point // 获取第一个智能搜索的结果
          map.centerAndZoom(pp, 18)
          map.addOverlay(new BMap.Marker(pp)) // 添加标注
          console.log(pp)
          console.log('获取位置具体地址经纬度', 'lng' + pp.lng + 'lat' + pp.lat)
          addLng = pp.lng
          addLat = pp.lat
          // 经纬度赋值到页面
          var jing_du = document.getElementById('jing_du')
          var wei_du = document.getElementById('wei_du')
          jing_du.innerHTML = addLng + ','
          wei_du.innerHTML = addLat
        }
        var local = new BMap.LocalSearch(map, { // 智能搜索
          onSearchComplete: myFun
        })
        local.search(myValue)
        console.log('获取位置具体地址', myValue)
      }

虽然能实现需求,但这个触发的弹框真的很无奈,后面经过同事提醒,结合类参考http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html#a7b0,

然后自己写了个搜索框,我是采用的vue+elementUI,具体代码如下:

html

<el-form-item label="详细地址">
      <div id="r-result">
        <el-autocomplete
        width="100%"
          size="small"
          popper-class="my-autocomplete"
          v-model="shopaddress"
          :fetch-suggestions="querySearch"
          placeholder="请输入内容"
          :trigger-on-focus="false"
          @select="handleSelect">
          <template slot-scope="{ item }">
            <div class="name">{{ item.address}}</div>
            <span class="addr">{{ item.address }}</span>
          </template>
        </el-autocomplete>
      </div>
      <template v-if="ruleForm.longitude && ruleForm.latitude">
        <div>
          <span id="jing_du">
            {{ruleForm.longitude}}
          </span>
          <span id="wei_du">
            {{ruleForm.latitude}}
          </span>
        </div>
      </template>
      <div id="l-map"></div>
</el-form-item>

script

export default {
  name: 'shopManage_add',
  data() {
    return {
      listLoading: true,
      ruleForm: {
        address: '',
        longitude: '', // 经度
        latitude: '', // 纬度
      },
      map: null,
      local: null,
      localList: [], // 搜索地址列表
      shopaddress: '', // 详细地址
      loading: false,
      restaurants: []
    }
  },
  watch: {
    shopaddress(val) {
      this.local.search(val)
    }
  },
  mounted() {
    this.map = new BMap.Map('l-map')
    // 修改状态
    this.baiduMap()
    if (this.$route.query.operation === 'edit') {
      this.isEdit = true
      this.toGetList()
    } else {
      this.isEdit = false
    }
    this.togetAddressProvinces()
  },
  methods: {
    querySearch(queryString, cb) {
      var restaurants = this.restaurants
      var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants
      // 调用 callback 返回建议列表的数据
      cb(results)
    },
    createFilter(queryString) {
      return (restaurant) => {
        return restaurant
      }
    },
    handleSelect(item) {
      this.map.clearOverlays() // 清除地图上所有覆盖物
      this.shopaddress = item.address
      this.ruleForm.longitude = item.point.lng
      this.ruleForm.latitude = item.point.lat
      this.ruleForm.address = item.address
      const pp = item.point // 获取第一个智能搜索的结果
      this.map.centerAndZoom(pp, 15)
      this.map.addOverlay(new BMap.Marker(pp)) // 添加标注
    },
    baiduMap() {
      // 百度地图API功能
      // this.map = new BMap.Map('l-map')
      var _this = this
      var point = new BMap.Point(addLng, addLat)
      _this.map.centerAndZoom(point, 12) // 初始化地图,设置城市和地图级别。
      _this.map.addControl(new BMap.ScaleControl({ anchor: BMAPANCHORTOPLEFT }))
      _this.map.addControl(new BMap.NavigationControl())
      if (_this.$route.query.operation === 'edit') {
        var marker = new BMap.Marker(point) // 创建标注
        _this.map.addOverlay(marker)
      } else {
        var geolocation = new BMap.Geolocation()
        // 根据IP定位当前经纬度
        geolocation.getCurrentPosition(function(r) {
          if (this.getStatus() === BMAPSTATUSSUCCESS) { // BMAP_STATUS_SUCCESS	检索成功。对应数值“0”。
            var mk = new BMap.Marker(r.point)
            _this.map.addOverlay(mk)
            _this.map.panTo(r.point)
            // alert('您的位置:'+r.point.lng+','+r.point.lat);
          }
        }, {
          enableHighAccuracy: true
        })
      }
      this.local = new BMap.LocalSearch(this.map, {
        onSearchComplete: (res) => {
          if (this.local.getStatus() === BMAPSTATUSSUCCESS) {
            this.restaurants = []
            for (let i = 0; i < res.getCurrentNumPois(); i++) {
              this.restaurants.push(res.getPoi(i))
            }
            console.log('restaurants', this.restaurants) // 搜索触发的地址列表
          }
        }
      })
      // map.enableScrollWheelZoom(true) // 开启鼠标滚轮缩放
    }
  },
  components: {
  }
}

嗯,问题解决!

相关文章
|
11月前
|
监控 供应链 API
速卖通商品 API,开发者示例
速卖通商品API是速卖通开放平台为开发者提供的接口,支持获取商品详情、订单管理等功能。具备多语言、多货币支持,适用于全球电商场景。可应用于商品分析、价格监控、竞品对比和库存管理等业务。文档提供Python调用示例,便于快速集成使用。
|
11月前
|
JSON API 数据格式
洋码头商品 API 示例指南(Python 实现)
洋码头是国内知名跨境电商平台,提供商品搜索、详情、分类等API接口。本文详解了使用Python调用这些API的流程与代码示例,涵盖签名生成、请求处理及常见问题解决方案,适用于构建选品工具、价格监控等跨境电商应用。
|
11月前
|
缓存 JSON API
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
1616 1
|
8月前
|
缓存 数据可视化 定位技术
快递鸟快递API技术指南:获取物流轨迹信息与轨迹地图的解决方案
在当今电商竞争激烈的环境中,物流体验已成为提升用户满意度的关键因素。研究表明,超过 75% 的消费者会因物流信息不透明而放弃下单。
1831 1
|
11月前
|
测试技术 API 开发者
淘宝关键词搜索商品列表API接入指南(含Python示例)
淘宝关键词搜索商品列表API是淘宝开放平台的核心接口,支持通过关键词检索商品,适用于比价、选品、市场分析等场景。接口提供丰富的筛选与排序功能,返回结构化数据,含商品ID、标题、价格、销量等信息。开发者可使用Python调用,需注意频率限制与错误处理,建议先在沙箱环境测试。
|
11月前
|
缓存 JSON API
淘宝关键词搜索 API 接口详解与示例
淘宝关键词搜索API(taobao.items.search)助力开发者高效获取商品数据,支持分页、筛选与排序。本文详解接口调用流程、签名机制及Python实现,涵盖权限申请、代码示例与常见问题解决方案,助你快速构建电商应用。
|
11月前
|
JSON API 开发者
唯品会商品API,开发者示例
唯品会商品API支持获取商品详情、价格及库存信息,适用于开发者集成商品数据。通过如`vip.item_get`等接口,可使用Python等语言调用,实现商品信息查询与列表筛选。实际使用需申请官方授权或通过第三方平台接入,并遵守相关调用规则。
|
11月前
|
JSON API 开发者
一号店商品 API 示例指南(Python 实现)
本教程介绍如何使用 Python 调用一号店商品 API,涵盖商品搜索、详情、分类等接口的调用方法。内容包括注册认证、签名生成、代码实现及常见问题解决方案,并提供完整示例代码,帮助开发者快速接入一号店开放平台,构建电商工具与数据分析应用。
|
11月前
|
JSON API PHP
10多万语录随机一言API接口详解及调用示例
随机一言API可输出心灵鸡汤、至理名言等内容,适用于评论系统、签名生成等场景。完全免费,支持GET/POST请求。需注册获取专属ID和KEY,返回JSON格式数据,并提供PHP、Python调用示例。注意密钥安全与频率限制,内容版权归接口盒子所有。应用于每日推送、心情日记等多种场景。
1201 0
|
11月前
|
JSON API 开发者
淘宝店铺所有商品 API 接口开发者示例
本文介绍了通过淘宝开放平台API获取店铺商品信息的完整实现方案,涵盖接口选择、权限申请、Python代码示例及数据解析等内容,适用于电商开发中的商品同步、分析与管理场景。