模拟点击触发 mapv 的 click 事件

 

实验方法和思路:

在 mapv 顶部覆盖了一个 div.box,点击 box 时获取 event 对象,拷贝一份推送给 mapv 的事件触发层。

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <!-- 百度地图 -->
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=1XjLLEhZhQNUzd93EjU5nOGQ"></script>
    <!-- mapv -->
    <script src="http://mapv.baidu.com/build/mapv.min.js"></script>
    <style>
        html,
        body {
            margin: 0;
            padding: 0;
            height: 100%;
        }

        #app {
            width: 100%;
            height: 100%;
        }

        .box {
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background: -webkit-linear-gradient(top, rgb(203, 235, 219) 0%, rgb(55, 148, 192) 120%);
            opacity: .5;
        }
    </style>
</head>

<body>
    <div id="app"></div>
    <div class='box'></div>
</body>
<script>
    const map = window.map = new BMap.Map("app")

    // 创建地图实例
    const point = new BMap.Point(105.403119, 38.028658)

    // 开启鼠标滚轮缩放
    map.enableScrollWheelZoom(true);

    // 创建点坐标(东莞全貌)
    map.centerAndZoom(new BMap.Point(113.843319, 22.921901), 11)

    // 地图自定义样式
    map.setMapStyle({ styleJson: [{ "featureType": "water", "elementType": "all", "stylers": { "color": "#031628" } }, { "featureType": "land", "elementType": "geometry", "stylers": { "color": "#000102" } }, { "featureType": "highway", "elementType": "geometry.fill", "stylers": { "color": "#000000" } }, { "featureType": "highway", "elementType": "geometry.stroke", "stylers": { "color": "#147a92" } }, { "featureType": "arterial", "elementType": "geometry.fill", "stylers": { "color": "#000000" } }, { "featureType": "arterial", "elementType": "geometry.stroke", "stylers": { "color": "#0b3d51" } }, { "featureType": "local", "elementType": "geometry", "stylers": { "color": "#000000" } }, { "featureType": "railway", "elementType": "geometry.fill", "stylers": { "color": "#000000" } }, { "featureType": "railway", "elementType": "geometry.stroke", "stylers": { "color": "#08304b" } }, { "featureType": "subway", "elementType": "geometry", "stylers": { "lightness": -70 } }, { "featureType": "building", "elementType": "geometry.fill", "stylers": { "color": "#000000" } }, { "featureType": "all", "elementType": "labels.text.fill", "stylers": { "color": "#857f7f" } }, { "featureType": "all", "elementType": "labels.text.stroke", "stylers": { "color": "#000000" } }, { "featureType": "building", "elementType": "geometry", "stylers": { "color": "#022338" } }, { "featureType": "green", "elementType": "geometry", "stylers": { "color": "#062032" } }, { "featureType": "boundary", "elementType": "all", "stylers": { "color": "#465b6c" } }, { "featureType": "manmade", "elementType": "all", "stylers": { "color": "#022338" } }, { "featureType": "label", "elementType": "all", "stylers": { "color": "#022338", "visibility": "off" } }] });

    // 渲染气泡
    var data = [ { geometry: { type: 'Point', coordinates: [113.781803, 23.018795], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.751333, 23.055512], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.671419, 22.829733], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.751333, 22.80255], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.695137, 22.928664], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.722012, 22.991651], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.863613, 23.012407], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.083799, 22.815639], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.019622, 22.976357], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.156073, 22.743368], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.172171, 22.858509], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.953929, 22.927227], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.697865, 23.057108], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.590931, 22.902194], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.794451, 23.114556], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.982863, 23.038418], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.006169, 22.873877], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.053139, 23.077823], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.561772, 23.044478], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.888136, 23.073522], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.655897, 23.110833], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.728911, 23.106046], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.078459, 23.027842], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.930131, 23.009216], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.646123, 23.002296], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.949558, 23.096017], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.177422, 22.978865], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.857692, 23.119342], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.593806, 22.98952], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.869765, 22.922434], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.820775, 22.911782], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [114.092257, 22.930422], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, { geometry: { type: 'Point', coordinates: [113.624851, 23.056576], }, fillStyle: 'rgba(' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', ' + ~~(Math.random() * 255) + ', 0.8)', count: Math.random() * 30 + 5 }, ]
    var dataSet = new mapv.DataSet(data);
    var options = { maxSize: 30, max: 30, minSize: 10, draw: 'bubble' }
    var mapvLayer = new mapv.baiduMapLayer(map, dataSet, options)
    
    // 渲染文本
    var textData = [ { text: '东城', geometry: { type: 'Point', coordinates: [113.781803, 23.018795] } }, { text: '莞城', geometry: { type: 'Point', coordinates: [113.751333, 23.055512] } }, { text: '虎门', geometry: { type: 'Point', coordinates: [113.671419, 22.829733] } }, { text: '长安', geometry: { type: 'Point', coordinates: [113.751333, 22.80255] } }, { text: '厚街', geometry: { type: 'Point', coordinates: [113.695137, 22.928664] } }, { text: '南城', geometry: { type: 'Point', coordinates: [113.722012, 22.991651] } }, { text: '寮步', geometry: { type: 'Point', coordinates: [113.863613, 23.012407] } }, { text: '塘厦', geometry: { type: 'Point', coordinates: [114.083799, 22.815639] } }, { text: '常平', geometry: { type: 'Point', coordinates: [114.019622, 22.976357] } }, { text: '凤岗', geometry: { type: 'Point', coordinates: [114.156073, 22.743368] } }, { text: '清溪', geometry: { type: 'Point', coordinates: [114.172171, 22.858509] } }, { text: '大朗', geometry: { type: 'Point', coordinates: [113.953929, 22.927227] } }, { text: '万江', geometry: { type: 'Point', coordinates: [113.697865, 23.057108] } }, { text: '沙田', geometry: { type: 'Point', coordinates: [113.590931, 22.902194] } }, { text: '石碣', geometry: { type: 'Point', coordinates: [113.794451, 23.114556] } }, { text: '横沥', geometry: { type: 'Point', coordinates: [113.982863, 23.038418] } }, { text: '黄江', geometry: { type: 'Point', coordinates: [114.006169, 22.873877] } }, { text: '企石', geometry: { type: 'Point', coordinates: [114.053139, 23.077823] } }, { text: '麻涌', geometry: { type: 'Point', coordinates: [113.561772, 23.044478] } }, { text: '茶山', geometry: { type: 'Point', coordinates: [113.888136, 23.073522] } }, { text: '中堂', geometry: { type: 'Point', coordinates: [113.655897, 23.110833] } }, { text: '高埗', geometry: { type: 'Point', coordinates: [113.728911, 23.106046] } }, { text: '桥头', geometry: { type: 'Point', coordinates: [114.078459, 23.027842] } }, { text: '东坑', geometry: { type: 'Point', coordinates: [113.930131, 23.009216] } }, { text: '道滘', geometry: { type: 'Point', coordinates: [113.646123, 23.002296] } }, { text: '石排', geometry: { type: 'Point', coordinates: [113.949558, 23.096017] } }, { text: '谢岗', geometry: { type: 'Point', coordinates: [114.177422, 22.978865] } }, { text: '石龙', geometry: { type: 'Point', coordinates: [113.857692, 23.119342] } }, { text: '洪梅', geometry: { type: 'Point', coordinates: [113.593806, 22.98952] } }, { text: '松山湖', geometry: { type: 'Point', coordinates: [113.869765, 22.922434] } }, { text: '大岭山', geometry: { type: 'Point', coordinates: [113.820775, 22.911782] } }, { text: '樟木头', geometry: { type: 'Point', coordinates: [114.092257, 22.930422] } }, { text: '望牛墩', geometry: { type: 'Point', coordinates: [113.624851, 23.056576] } }, ]
    var textDataSet = new mapv.DataSet(textData)
    var textMapvLayer = new mapv.baiduMapLayer(map, textDataSet, {
        draw: 'text', font: '14px Arial', fillStyle: 'white', shadowColor: 'yellow', shadowBlue: 10, zIndex: 11, shadowBlur: 10,
        methods: {
            click(e) {
                if (e) {
                    alert(`模拟点击了文本:【${e.text}】`)
                    console.log(20211112165108, e)
                }
            }
        }
    })

    // 模拟点击函数
    const mockClickMapv = (event, container) => {
        const evmouseclick = document.createEvent('HTMLEvents')
        evmouseclick.initEvent('click', false, true)

        for (const key in event) {
            try {
                evmouseclick[key] = event[key]
                evmousedown[key] = event[key]
                evmouseup[key] = event[key]
            } catch (err) { /* event 对象中部分属性是只读,忽略即可 */ }
        }

        container.dispatchEvent(evmouseclick)
    }

    document.querySelector('.box').addEventListener('click', e => {
        // mapv 容器下的第一个 div 就是事件的触发对象
        const container = document.getElementById('app').firstElementChild
        // 模拟点击底部的 mapv
        mockClickMapv(e, container)
    })
</script>

</html>

 

posted @ 2021-11-12 17:18  贝尔塔猫  阅读(578)  评论(0编辑  收藏  举报