010:vue+leaflet鼠标点击事件click和dblclick,并解决两者冲突问题

本文由高级前端工程师大剑师兰特撰写,介绍如何在Vue与Leaflet结合的项目中处理marker的click和dblclick事件冲突。通过设置定时器在单击事件中延迟执行,避免了双击时触发两次单击事件的问题。提供了详细的示例源代码和配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

查看本专栏目录 - 本文是第 010个示例

一、示例效果图

二、示例简介

本示例演示如何在vue+leaflet中给marker添加鼠标事件,这里用到了click和dblclick。 在双击marker时,会执行两次单击函数和一次双击函数,这就是冲突,解决办法是添加一个定时器,在单击事件函数里通过定时器控制延迟执行。单击事件函数和双击事件函数里都先清除定时器。

直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果

好的,根据您的要求,我可以提供一个大致的实现思路代码示例供您参考: 1. 在表格中选择某一行数据时,获取对应的marker对象,将其设置为选中状态。 ```javascript // 表格选中某一行时触发的方法 handleRowClick(row) { // 通过表格中的数据找到对应的marker对象 let marker = this.markers.find(item => item.id === row.id) // 设置marker为选中状态 marker.selected = true // 将地图中心点移动到该marker位置 this.map.setView(marker.getLatLng()) } ``` 2. 在双击表格某一行时,将对应的marker切换为编辑模式,将其图标替换为可拖动的图标。 ```javascript // 表格双击某一行时触发的方法 handleRowDblclick(row) { // 通过表格中的数据找到对应的marker对象 let marker = this.markers.find(item => item.id === row.id) // 设置marker为编辑模式 marker.editing = true // 替换marker图标为可拖动的图标 marker.setIcon(new L.Icon({ iconUrl: 'draggable_icon.png', iconSize: [32, 32] })) } ``` 3. 监听marker的拖动事件,将拖动后的经纬度传回给表格展示。 ```javascript // 监听marker的拖动事件 marker.on('dragend', e => { // 获取拖动后的经纬度 let latlng = e.target.getLatLng() // 更新对应行的数据 let index = this.tableData.findIndex(item => item.id === marker.id) this.tableData[index].latitude = latlng.lat this.tableData[index].longitude = latlng.lng }) ``` 完整代码示例: ```javascript <template> <div> <el-table :data="tableData" @row-click="handleRowClick" @row-dblclick="handleRowDblclick"> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column prop="latitude" label="纬度"></el-table-column> <el-table-column prop="longitude" label="经度"></el-table-column> </el-table> <div id="map"></div> </div> </template> <script> import L from 'leaflet' export default { data() { return { tableData: [ { id: 1, name: 'marker1', latitude: 39.9042, longitude: 116.4074 }, { id: 2, name: 'marker2', latitude: 31.2304, longitude: 121.4737 }, { id: 3, name: 'marker3', latitude: 22.3964, longitude: 114.1095 }, ], map: null, markers: [] } }, mounted() { // 初始化地图 this.map = L.map('map').setView([39.9042, 116.4074], 10) L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors', maxZoom: 18 }).addTo(this.map) // 根据表格数据添加marker this.tableData.forEach(item => { let marker = L.marker([item.latitude, item.longitude]).addTo(this.map) marker.id = item.id marker.selected = false marker.editing = false this.markers.push(marker) }) }, methods: { // 表格选中某一行时触发的方法 handleRowClick(row) { // 通过表格中的数据找到对应的marker对象 let marker = this.markers.find(item => item.id === row.id) // 设置marker为选中状态 marker.selected = true // 将地图中心点移动到该marker位置 this.map.setView(marker.getLatLng()) }, // 表格双击某一行时触发的方法 handleRowDblclick(row) { // 通过表格中的数据找到对应的marker对象 let marker = this.markers.find(item => item.id === row.id) // 设置marker为编辑模式 marker.editing = true // 替换marker图标为可拖动的图标 marker.setIcon(new L.Icon({ iconUrl: 'draggable_icon.png', iconSize: [32, 32] })) } }, created() { // 监听marker的拖动事件 this.markers.forEach(marker => { marker.on('dragend', e => { // 获取拖动后的经纬度 let latlng = e.target.getLatLng() // 更新对应行的数据 let index = this.tableData.findIndex(item => item.id === marker.id) this.tableData[index].latitude = latlng.lat this.tableData[index].longitude = latlng.lng }) }) } } </script> <style> #map { height: 500px; } </style> ``` 需要注意的是,以上代码示例中使用了LeafletOpenStreetMap,需要在项目中安装这两个依赖包,具体安装方法可以参考官方文档。另外,marker的图标可以根据实际需求进行更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值