背景:
因为公司的GIS项目都是基于Leaflet搭建的。最近有同事在开发项目的时候问我leaflet中有什么方法可以来实现点击tooltip实现触发事件功能。最开始听到这个问题时候,第一时间想着像给marker直接加on(‘click’,function())的逻辑实现。但是加了之后发现发现click触发的方法虽然添加到了tooltip中,但是并没办法实现能完成点击触发该方法的功能,经过思考以及查阅相关文档资料成功解决了这个问题。所以记录一下。并且作为一名刚转行的菜鸟,抱着学习的态度想知道自己思路存在的问题,所以发出来希望得到大佬们的知点。
一、考虑实现的思路
拿到marker的tooltip的html元素,然后给元素添加事件监听器的方法
//1.new一个带有坐标的marker并添加到地图中
const marker = this.L.marker([39.909186, 116.397411]).addTo(this.map);
//2.给marker绑定一个bindTooltip
marker.bindTooltip("hello", {
direction: "right",
permanent: true,
offset:[0,-5],
opacity: 0.9,
className:'toolclick',
});
marker.bindPopup('1111111')
//实现tooltip点击触发事件的方法
this.fireTooltip(marker);
fireTooltip(target){
//拿到marker的tooltip实例对象
let mytooltip = target.getTooltip()
//获取到tooltip的html元素
let myel = mytooltip._container
//给div元素加上事件监听器
myel.addEventListener('click',this.tooltipfuc)
},
tooltipfuc(){
console.log('...........')
}
注意 运行代码以后,发现并没有实现控制台的打印,主要是因为tooltip并没有鼠标可点击功能。这是因为,lealet的tooltip的css样式中把pointer-events设置成了none,所以需要给tooltip重新加上pointer-events。
.toolclick{
cursor: pointer;
pointer-events: auto !important;
}
这样就可以实现点击tooltip触发功能的逻辑。
实现的思路二
还有一种方法,可以直接给tooltip实例中的_container.onclick赋值的方法形式实现点击事件触发。这样就可以实现功能
mytooltip._container.onclick = ()=>{ console.log('333333333') }
二者区别
方法一是使用js的addEventListener()方法给DOM元素加上事件监听机制,通过console.log打印的tooltip时候并不会打印出addEventListener监听的click事件的函数,而使用方法二,因为是直接给tooltip..container.onclick加上函数(相当相当于给tooltip下的..container数据中的名为onclick的data赋值方法),所以再console.log打印tooltip时候会打印出click事件的方法函数。
扩展
tooltip的options中有一个interactive,这个方法是给tooltip加入交互事件,但是添加之后发现会触发popup。不光会触发tooltip的click事件,同时也会触发popup。并且如果没有给tooltip添加事件监听器,tooltip也不会实现鼠标单击触发函数的功能。
最后
经验不足希望大佬能多指出错误并多指点。