解决百度地图中点击标记点的label会穿透到地图上改变当前标记点的位置问题

项目中有这样一个需求:点击地图添加标记点和label提示框,点击提示框中的按钮可以触发一个点击事件 (如图一),并可在地图上重新选点标记。(上个点会被清除)
在这个过程中遇到了一个问题是点击label会穿透到地图上改变当前标记点的位置。期间尝试过阻止冒泡这种方法,虽然有效果,但是关掉‘’创建摆摊‘’点击事件触发的弹框后,重新选点会发生需要点击两次地图才能重新添加标记的bug。
图一:
在这里插入图片描述

解决方案
找了好久的办法,发现可以这样解决。不需要阻止冒泡,只需要在地图监听事件中加上一个判断,代码如下:

//地址解析
      let geocoder = new BMap.Geocoder();
      //添加点击事件监听
      map.addEventListener('click', function(e) {
        //如果是地图点击事件就进行以下操作(就是if这一行的判断)
        if (e.overlay == null) {
          console.log('触发地图点击');
          let allOverlay = that.map.getOverlays();
          //清除上次点圈
          for (let i = 0; i < allOverlay.length - 1; i++) {
            if (
              allOverlay[i].toString() == '[object Marker]' ||
              allOverlay[i].toString() == '[object Circle]'
            ) {
              that.map.removeOverlay(allOverlay[i]);
            }
          }
          //获取点所在街道地址
          geocoder.getLocation(e.point, function(rs) {
            let addComp = rs.addressComponents;
            that.form.address =
              addComp.province +
              addComp.city +
              addComp.district +
              addComp.street +
              addComp.streetNumber;
            that.form.addrPoint.lat = e.point.lat;
            that.form.addrPoint.lng = e.point.lng;
            let label = new BMap.Label(
              `<div style="font-weight:bold">当前选中位置:</div><div>${
                that.form.address
              }</div><button οnclick="createActive()" style="cursor:point;margin-top:4px">创建摆摊</button>`,
              { offset: new BMap.Size(20, -70) },
            );
            label.setStyle({
              color: '#000',
              padding: '10px',
              fontFamily: '微软雅黑',
              border: 'none',
              borderRadius: '4px',
              background: '#fff',
              boxShadow: '0 0 5px #333',
            });
            marker.setLabel(label);
          });
          let point = new BMap.Point(e.point.lng, e.point.lat);
          //绘制点
          let marker = new BMap.Marker(point);
          that.a = marker;
          map.addOverlay(marker);
          //绘制圈
          let circle = new BMap.Circle(
            new BMap.Point(e.point.lng, e.point.lat),
            that.value,
            {
              strokeColor: 'red',
              strokeWeight: 2,
              strokeOpacity: 0.5,
            },
          );
          map.addOverlay(circle);
          window.createActive = function() {
            that.dialogVisible = true;
          };
        }
      });

添加这一行之后,再点击label就不会触发地图的点击事件了。这句话的意思是如果你点击的不是地图中的覆盖物就会执行if中的代码。

你可以在高德地图的Marker对象添加鼠标事件监听器,来实现鼠标移入显示label详细信息的功能。具体的实现步骤如下: 1. 创建Marker对象时,设置label属性为一个AMap.Text对象,用于显示详细信息。 ```javascript var marker = new AMap.Marker({ position: [lng, lat], label: { content: '详细信息', offset: new AMap.Pixel(0, -20) // 设置label偏移量,使其显示在Marker上方 } }); ``` 2. 给Marker对象添加mouseover和mouseout事件监听器,在鼠标移入和移出时显示或隐藏label。 ```javascript marker.on('mouseover', function (e) { marker.setLabel({ content: '详细信息', offset: new AMap.Pixel(0, -20), visible: true // 显示label }); }); marker.on('mouseout', function (e) { marker.setLabel({ visible: false // 隐藏label }); }); ``` 完整的代码示例: ```javascript var map = new AMap.Map('container', { zoom: 13, center: [116.397428, 39.90923] }); var markers = [ {lnglat: [116.405285, 39.904989], info: '北京市'}, {lnglat: [121.472644, 31.231706], info: '上海市'}, {lnglat: [113.280637, 23.125178], info: '广州市'}, {lnglat: [114.066112, 22.548515], info: '深圳市'} ]; for (var i = 0; i < markers.length; i++) { var marker = new AMap.Marker({ position: markers[i].lnglat, label: { content: markers[i].info, offset: new AMap.Pixel(0, -20) } }); marker.on('mouseover', function (e) { marker.setLabel({ content: e.target.getExtData().info, offset: new AMap.Pixel(0, -20), visible: true }); }); marker.on('mouseout', function (e) { marker.setLabel({ visible: false }); }); marker.setExtData(markers[i]); // 将详细信息存储在Marker对象的扩展数据 marker.setMap(map); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值