百度地图定位控件如何自定义控件的图标

现在有个 vue 的项目, 用到了百度地图的定位组件,但是需要 自定义定位控件的图标,遇到了一些问题

现在自定义了一个百度地图定位控件, 但是定位的时候,图标会换成默认的图标。

目前尝试了以下解决方案:
1、css里面强制定义图标

.BMap_geolocationIcon {
    background-image: url('map_location.png') !important;
 }

这样写,定位的时候不会显示定位加载图标了,不够友好

2、 查看源码,发现 Bmap.Control 类的 initializeremove 方法是语义明确的,其他的 yB、yC语义都不明。 只能监听 tilesloaded 事件,可以解决,以下是基于 ES6 自定义了 百度地图定位控件类, 重写了 initialize 方法, 并监听了百度地图的 tilesloaded 事件

class MyGeoLocationControl extends BMap.GeolocationControl {
    constructor(opt) {
        super(opt);
        this._setting = opt;
        this._geoLocationMarker = null;
    }
    // 重写initialize方法,获取 dom 元素
    initialize (map) {
        this._map = map;
        this._dom = super.initialize(map);
        this._redraw();
        this._addEventListener();
        return this._dom;
    }
    // 定位控件背景图片换成自己的
    _redraw () {
        if (this._dom) {
            let geolocationIconDom = this._dom.getElementsByClassName('BMap_geolocationIcon')[0];
            let _backgroundImage = geolocationIconDom.style['background-image'];
            // 如果定位控件的背景图片被换成了百度的默认图标,则换回来!!!
            if (_backgroundImage.includes('map_location.png')) {
                return true;
            }
            geolocationIconDom.style['background-image'] = "url('map_location.png')";
        }
    }
    // 添加事件监听
    _addEventListener () {
        // fixed: 百度地图, 会把定位控件的图标换成自己的, 这里再换回来!
        this._map.addEventListener('tilesloaded', () => {
            this._redraw();
        })
    }
}

但是感觉两种解决方案都挺野蛮不够优雅,求教更优雅的解决方式。 或者说 有没有 类似 BMap.Overlay 覆盖物 redraw 的方法?

阅读 3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏