谷歌地图中的JavaScript全局变量

JavaScript global variable in Google Maps

本文关键字:全局变量 JavaScript 谷歌地图      更新时间:2023-09-26

我正在制作一个网络应用程序,让人们可以在谷歌地图上看到公交车的位置。我在JavaScript中的全局变量方面遇到了一些问题。window.variable对我不起作用,在所有函数之外定义变量也不起作用。这是我完整的客户端代码:

<!DOCTYPE html>
<html>
  <head>
    <title>Geolocation</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <style>
      html, body, #map-canvas {
        height: 100%;
        margin: 0px;
        padding: 0px
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script>
// Note: This example requires that you consent to location sharing when
// prompted by your browser. If you see a blank space instead of the map, this
// is probably because you have denied permission for location sharing.
var old = [];
function getLocation()
{
  $.get( "http://54.86.161.214/EC_bus_app/get_location.php", function( data ) {
    old=[];
    var buses = data;
    var number_of_buses = buses.slice(0,1);
    buses = buses.slice(2);
    buses = buses.slice(0,-1);
    var bus_coordinates_and_numbers = buses.split(/[ ]+/);
    var length_of_array = bus_coordinates_and_numbers.length;
  // Turn a single dimensional array into a multi-dimensional array
    for (var index = 0; index < bus_coordinates_and_numbers.length; index+= 3)
        old.push( bus_coordinates_and_numbers.slice(index, index + 3) );
    console.log(old);
    //initialize(old);
  });
}
setInterval(getLocation, 10000);
var map;
function initialize() {
  var mapOptions = {
    zoom: 18
  };
  map = new google.maps.Map(document.getElementById('map-canvas'),
      mapOptions);
var image = "icon_97.png";
  for (i=0;i<old.length; i = i + 1){
    var x = old[i][0];
    var y = old[i][1];
    var myLatlng = new google.maps.LatLng(x,y);
    var busMarker = new google.maps.Marker({
        position: myLatlng,
        map: map,
        icon: image,
        title: old[i][2]
    });
  }
  // Try HTML5 geolocation
  if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
      var pos = new google.maps.LatLng(position.coords.latitude,
                                       position.coords.longitude);
      var infowindow = new google.maps.InfoWindow({
        map: map,
        position: pos,
        content: 'Your location'
      });
      map.setCenter(pos);
    }, function() {
      handleNoGeolocation(true);
    });
  } else {
    // Browser doesn't support Geolocation
    handleNoGeolocation(false);
  }
}
function handleNoGeolocation(errorFlag) {
  if (errorFlag) {
    var content = 'Error: The Geolocation service failed.';
  } else {
    var content = 'Error: Your browser doesn''t support geolocation.';
  }
  var options = {
    map: map,
    position: new google.maps.LatLng(60, 105),
    content: content
  };
  var infowindow = new google.maps.InfoWindow(options);
  map.setCenter(options.position);
}
google.maps.event.addDomListener(window, 'load', initialize);
    </script>
  </head>
  <body>
    <div id="map-canvas"></div>
  </body>
</html>

所讨论的变量是old。我可以使用initialize(old);将它从get location函数中传递给initialize函数。但是,正如您所看到的,我使用的是计时器,initialize(old);会导致整个地图一次又一次地重新加载,而我只希望位置标记一次又一遍地加载。

通过在initialize()中移动getLocation()解决了问题。但@geocodezip在评论中所说的话也完全回答了我的问题。

问题不在于全局变量。它具有异步功能。您需要初始化映射,然后请求数据(异步请求),在映射上制作标记,然后定期更新它们。