javascript - Javascript 中的全局数组范围问题

标签 javascript jquery asp.net-mvc google-maps-api-3 scope

我目前正在处理一个页面,该页面最终会将一系列标记(它们的数据来自 JSON 对象)绘制到 Google map 上。

我似乎无法配置出保持标记数组填充的方法。由于超出了 getJSON 调用的范围,该数组为空。

   var markers = [];
   var map;
   var mapOptions = {
            center: new google.maps.LatLng(0.0, 0.0),
            zoom: 10,
            mapTypeId: google.maps.MapTypeId.ROADMAP
          }
   map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

   $.getJSON("Home/GetLocations", function (data) {
       for (index in data) addMarker(data[index]);

       function addMarker(_data) {
           var marker = new google.maps.Marker({
               position: new google.maps.LatLng(_data.lat, _data.lng),
               map: map,
               title: _data.name
           });
           markers.push(marker);

       }
       //markers = 3 at this point.
   });
   // markers = 0 at this point.

我需要数组仍然被填充的原因是我打算为页面上的每个标记创建一个超链接,以便可以单击它并且 map 缩放到正确的标记。理想情况下,这将是一个带有 javascript 函数调用的超链接,该 javascript 函数将作为参数传递所选超链接的标记索引,允许我去例如

function zoomIn(selectedIndex) {
            map.setCenter(markers[selectedIndex].getPosition());
          }

但此时,markers 数组是空白的,因此不再包含每个标记。

如果有人能给我指出正确的方向,那就太好了。谢谢

最佳答案

getJSON 调用中指定的函数将在 getJSON 完成时调用,这不一定是使用标记数组的代码运行时。我想如果你把对 zoomIn 的调用(或任何需要使用标记的东西)放在 getJSON 调用中指定的函数中,标记将在使用它时被填充。关键是标记数组是异步填充的,所以你需要确保代码执行的顺序。

如果您在调用 getJSON 后立即检查标记数组,请不要这样做。检查使用它的 zoomIn 函数中的标记数组。

关于javascript - Javascript 中的全局数组范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438529/

相关文章:

javascript - json 键中的动态名称

javascript - 如何将 HTML POST 数据转换为 JSON?

jQuery 移动 : Can I "uninitialize" the page?

javascript - Unslider(JS 问题?)在页面刷新时中断

asp.net-mvc - 唯一验证属性不适用于编辑现有元素

asp.net-mvc - Web Api 安全客户端和用户

javascript - 使用 window.print() 时 Iframe 内容被剪切

javascript - 如何最大化/最小化 iFrame?

javascript - 我怎样才能有一个打印方法,使用 JavaScript

asp.net-mvc - ASP.NET MVC 中 htmlAttributes 的匿名类和 IDictionary<string,object> 之间的速度差异