You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leaflet地图多标记问题:仅最后一个标记鼠标悬停显示弹窗

Leaflet标记悬停弹窗问题解决

问题根源在于你把鼠标事件绑定的代码写在了循环外面。由于var声明的变量是函数作用域,循环结束后marker变量只会指向最后一个创建的标记,所以只有最后一个标记能触发悬停弹窗效果。

只需要把事件绑定的代码移到循环内部,让每个标记在创建时就绑定对应的悬停事件即可:

var markers = [    
    [ 9.39069271, 45.92184121, "Grignetta (2177 metri)" ],
    [ 9.14496, 46.12351, "Pizzo di Gino" ],
    [ 9.14714813, 46.00030059, "Cima di Lenno (1698 metri)" ],    
];

//Marker Icon
var spot = L.icon({
    iconUrl: '../_asset/icons/spot.svg',
    iconSize:     [18, 18], // size of the icon
});
         
//Loop through the markers array
for (var i=0; i<markers.length; i++) {
    var lon = markers[i][0];
    var lat = markers[i][1];
    var popupText = markers[i][2];
            
    var markerLocation = new L.LatLng(lat, lon);
    var marker = new L.Marker(markerLocation, {icon: spot});
    leafletmap.addLayer(marker);
         
    marker.bindPopup(popupText);
    // 为当前标记绑定悬停事件
    marker.on('mouseover', function (e) {
        this.openPopup();
    });
    marker.on('mouseout', function (e) {
        this.closePopup();
    });
};

另外也可以用let替代var来声明marker,这样每个循环迭代都会生成独立的marker变量,此时事件绑定代码放在循环外面也能生效,但把绑定逻辑放在循环内更直观,也避免了作用域相关的坑。

内容的提问来源于stack exchange,提问作者Haldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:04