2017-07-02 118 views
0

我观察访问者位置并将当前坐标存储在两个变量latitudelongitude中。当访问者点击地图时,新标记的坐标将被存储在另外两个变量click_latitudeclick_longitude中。全局变量不是全局的 - 仅在函数内

完成此操作后,我想在文本中以.test的范围显示标记的坐标。问题是coordinates_click(其中包含click_latitudeclick_longitude)总是空的!标记的坐标只存储在map.on('click', function(e1) { ... }中的变量中,并且不能在函数外部访问。

为什么以及如何解决这个问题?

if(navigator.geolocation) { 

    // VARIABLES 
    var gps_timeout = 10 * 1000 * 1000; 


    // MAP 
    map = L.map('map', { 
     maxZoom: 17, 
     minZoom: 7 
    }).setView([59.380767, 13.503022], 13); 

    // MAP (copyright) 
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 
     attribution: 'Map data © OpenStreetMap contributors' 
    }).addTo(map); 


    // GPS 
    navigator.geolocation.watchPosition(success, error, { 
     enableHighAccuracy: true, 
     timeout: gps_timeout, 
     maximumAge: 0 
    }); 


    // ADD MARKER 
    map.on('click', function(e1) { 

     // IF 
     if(typeof(marker) === 'undefined') { 
      marker = new L.marker(e1.latlng).addTo(map); 

      var position = marker.getLatLng(); 
      var click_latitude = position.lat.toFixed(6); 
      var click_longitude = position.lng.toFixed(6); 
      map.panTo(new L.LatLng(click_latitude, click_longitude)); 

     // IF 
     } else { 
      marker.setLatLng(e1.latlng); 

      var position = marker.getLatLng(); 
      var click_latitude = position.lat.toFixed(6); 
      var click_longitude = position.lng.toFixed(6); 
      map.panTo(new L.LatLng(click_latitude, click_longitude)); 
     } 

    }); 


// IF 
} else { 
    // error handler 
} 



function success(position) { 

    // VARIABLES 
    latitude = position.coords.latitude.toFixed(6); 
    longitude = position.coords.longitude.toFixed(6); 
    coordinates_current = latitude + ',' + longitude; 
    coordinates_click = window.click_latitude + ',' + window.click_longitude; 


    // IF 
    if(coordinates_click !== '') { 
     $('.test').text(coordinates_click); 
    } 

} 

如果您想尝试,请转至https://erik-edgren.nu/map上面的代码更新为当前代码。请参阅下面的答案。

+0

您可以在函数之外全局声明'click_'变量。然后,从你的函数中删除'var click_'。或者,使用'window.click_ = ...'从函数中访问它们。 – randomir

+0

好的。我在'var gps_timeout = ...'下面加了'click_latitude,click_longitude',并且得到了这个错误信息:'Uncaught ReferenceError:click_latitude未定义' – Erik

+0

在哪一行?你使用什么环境/浏览器?你有没有试过通过'window'访问它们? – randomir

回答

0

因此,您声明click_latitudeclick_longitude您的本地事件功能(图click处理器和success功能)。 var声明总是有一个函数范围。

如果你想几个功能之间共享一个变量,你可以使用一个closure(另见本answer):

$(document).ready(function() { 
    var click_latitude, click_longitude; 
    ... 
    map.on('click', function(e1) { 
     click_latitude = ... 
     click_longitude = ... 
    } 
    ... 
    function success(position) { 
     var coordinates_click = click_latitude + ',' + click_longitude; 
     $('.test').text(coordinates_click); 
    } 
} 

或一个全局变量(的windowobject属性):

$(document).ready(function() { 
    ... 
    map.on('click', function(e1) { 
     window.click_latitude = ... 
     window.click_longitude = ... 
    } 
    ... 
    function success(position) { 
     var coordinates_click = window.click_latitude + ',' + window.click_longitude; 
     $('.test').text(coordinates_click); 
    } 
}