在传单中更新标记

fib*_*ibi 3 javascript jquery leaflet

我在传单中的标记有问题。我的代码是这样的:

var updateMarker = function(lat, lng) {
    if($('.leaflet-marker-icon').length)
        marker.setLatLng([lat, lng]);
    else
        var marker = L.marker([lat, lng]).addTo(map);
    return false;
};
var updateMarkerByInputs = function() {
    return updateMarker( $('#latInput').val() , $('#lngInput').val());
}
$('#latInput').on('input', updateMarkerByInputs);
$('#lngInput').on('input', updateMarkerByInputs);

map.on('click', function(e) {
    $('#latInput').val(e.latlng.lat);
    $('#lngInput').val(e.latlng.lng);
    updateMarker(e.latlng.lat, e.latlng.lng);
});
Run Code Online (Sandbox Code Playgroud)

如您所见,在第一次单击时将添加一个标记,在接下来的单击中应对其进行更新。但是我在第二次单击时收到此错误:

TypeError: i is undefined
    ..."_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:funct...
leaflet.js (line 6, col 603)
Run Code Online (Sandbox Code Playgroud)

我怎么了

And*_*cia 5

您正在函数中marker本地定义变量updateMarker,因此一旦函数返回,引用将丢失。

在函数外定义它:

var marker;

var updateMarker = function(lat, lng) {
    if($('.leaflet-marker-icon').length)
        marker.setLatLng([lat, lng]);
    else
        marker = L.marker([lat, lng]).addTo(map);
    return false;
};
Run Code Online (Sandbox Code Playgroud)

这样,您无需使用jQuery检查DOM即可确定标记是否已定义,您可以直接检查标记变量:

var marker;

var updateMarker = function(lat, lng) {
    if (marker) {
        marker.setLatLng([lat, lng]);
    } else {
        marker = L.marker([lat, lng]).addTo(map);
    }
    return false;
};
Run Code Online (Sandbox Code Playgroud)

(为提高可读性,我建议您在if语句中始终使用方括号。)