1

我对范围是什么有所了解,我是 javascript 新手,并且在我的代码中已经完全停止了。这是我使用的代码。

function initialize() {
      var mapOptions = {
        center: new google.maps.LatLng(37.775057,-122.419624),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      var map = new google.maps.Map(document.getElementById("map-canvas"),
          mapOptions);
      }
google.maps.event.addDomListener(window, 'load', initialize);
function clicked(id) {
  $.ajax({
    type: "GET",
    url: 'response.php',
    data: {id: id},
    success: function (lats) {
      var obj = $.parseJSON(lats);
      var line = [];
      for (var i = obj.length - 1; i >= 0; i--) {
        line.push(new google.maps.LatLng(obj[i].latitude, obj[i].longitude));
      };
      var polyPath = new google.maps.Polyline({
    path: line,
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 2
  });
      polyPath.setMap(map);
      console.log(polyPath);
    }
  });
  return false;
}

不用说它的谷歌地图。问题是由于范围的原因,javascript 无法访问绘制折线所需的 map 变量。高度赞赏帮助!

4

4 回答 4

2

因为map是在函数内部声明的initializeclicked所以不能访问它你需要在初始化之外声明它

var map = null;
function initialize() {
      var mapOptions = {
        center: new google.maps.LatLng(37.775057,-122.419624),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      map = new google.maps.Map(document.getElementById("map-canvas"),
          mapOptions);
    }
google.maps.event.addDomListener(window, 'load', initialize);
function clicked(id) {
  $.ajax({
    type: "GET",
    url: 'response.php',
    data: {id: id},
    success: function (lats) {
      var obj = $.parseJSON(lats);
      var line = [];
      for (var i = obj.length - 1; i >= 0; i--) {
        line.push(new google.maps.LatLng(obj[i].latitude, obj[i].longitude));
      };
      var polyPath = new google.maps.Polyline({
    path: line,
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 2
  });
      polyPath.setMap(map);
      console.log(polyPath);
    }
  });
  return false;
}

现在clicked可以访问它,因为它在initialize范围之外

于 2013-05-03T09:43:26.227 回答
1

您可以移动map到全局范围。

var map;
function initialize() {
    ...
    map = ....;
}

如果您担心污染全局范围,可以将两者放在一个函数中以保留命名空间:

(function() {
     var map;
     function initialize() {
         ...
         map = ....;
     }
     ...(everything else) ...
})();
于 2013-05-03T09:44:25.043 回答
0

如果您指的是从initialize函数中获取 map 变量,那么您需要执行以下操作。

var map;
function initialize() {
    var mapOptions = {
        center: new google.maps.LatLng(37.775057,-122.419624),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map-canvas"),
        mapOptions);
}
google.maps.event.addDomListener(window, 'load', initialize);
function clicked(id) {
    $.ajax({
        type: "GET",
        url: 'response.php',
        data: {id: id},
        success: function (lats) {
            var obj = $.parseJSON(lats);
            var line = [];
            for (var i = obj.length - 1; i >= 0; i--) {
                line.push(new google.maps.LatLng(obj[i].latitude, obj[i].longitude));
            };
            var polyPath = new google.maps.Polyline({
                path: line,
                strokeColor: "#FF0000",
                strokeOpacity: 1.0,
                strokeWeight: 2
            });
            polyPath.setMap(map);
            console.log(polyPath);
        }
    });
    return false;
}

我所做的是map在初始化函数之外声明。在这种情况下,它将具有您以后可以调用的所有 Javascript 代码的全局范围。初始化函数将能够为您设置它,并且 AJAX 调用将能够读取它。

map在初始化函数之外声明的另一种方法是使用window.map它将其分配为窗口对象的映射属性。由于 window 对象是全局的,因此可以在任何地方访问,您只需要在window.map任何地方调用即可对其进行读写。

于 2013-05-03T09:43:53.397 回答
0

一个快速但不推荐的解决方案是删除var地图前面的,使其成为全局变量。

于 2013-05-03T09:44:21.980 回答