发现传单地图位置触发非预期侦听器



我有一个小册子地图,其中map.locate()可以用两种方式调用:简易按钮定位按钮,2。使用setTimeout每分钟调用一次。

每个都有自己的locationfound侦听器,或者至少我希望他们有-这就是问题所在:单击easybutton触发control._map.on('locationfound'..)easybutton侦听器,以及getLocation()中的map.on('locationfound'..)侦听器。

对getLocation()的常规调用仅触发map.on('locationfound'..)侦听器。这和范围有关吗?我如何使easybutton仅触发其预期的侦听器,而map.locate()的setTimeout调用仅触发getLocation()中的侦听器?

L.easyButton({
position: easy_position,
states:[
{
stateName: 'unloaded',
icon: 'fa-location-arrow',
title: 'load image',
onClick: function(control){
control.state("loading");
control._map.on('locationfound', function(e){
alert('location found - easybutton');
this.setView(e.latlng,18); // go to current location
control.state('loaded');
setTimeout(function(){
control.state('unloaded');
}, 3000);
});
control._map.on('locationerror', function(){
control.state('error');
setTimeout(function(){
control.state('unloaded');
}, 3000);
});
control._map.locate();
setTimeout(function(){
control.state('unloaded');
}, 10000);  // give it ten seconds to find the location
}
}, {
stateName: 'loading',
icon: 'fa-spinner fa-spin'
}, {
stateName: 'loaded',
icon: 'fa-thumbs-up'
}, {
stateName: 'error',
icon: 'fa-frown-o',
title: 'location not found'
}
]
}).addTo(map);
function updateLocation() {
getLocation(false);
setTimeout(updateLocation, 60000);
}
getLocation = function(goToLocation) {
map.on('locationfound', function(e) {
alert('location found - getLocation()');
var lat = e.latitude;
var lng = e.longitude;
if(goToLocation) {
pan_to(lat,lng,0.5);
}
});
map.on('locationerror', function(e) {
console.log(e);
});
map.locate({
setView: false,
maxZoom: 16
});
}

您可以通过使用map.once()方法来附加您的事件侦听器(在您的常规进程中和在您的按钮中)来缓解您的问题,以便它们在触发一次后被删除:

行为与on(…)相同,除了侦听器只被触发一次然后被删除。

仍然有一些暂时的情况,两个监听器可以同时被触发:如果你的按钮被点击,而你的常规进程已经启动了一个位置,但结果仍然是挂起的,或者相反。

不幸的是,传单没有区分对map.locate()方法的调用。因此@IvanSanchez建议直接使用浏览器API。

当你启动一个位置时,你可以通过管理一个标志/互斥锁来消除这些短暂的情况,而不执行另一个,或者延迟它,以防你的互斥锁被锁定。

最新更新