2017-07-02 119 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); 
    } 
}