【问题标题】:Javascript shows only last markersJavascript 仅显示最后一个标记
【发布时间】:2012-11-29 19:35:47
【问题描述】:

以下代码从 /home.json URL 中获取一些 JSON 数据,其中包含 6 个用户的 5 个微博。但是,只显示最后 4 个标记(甚至没有显示第 5 个!!)。我花了 2 天时间来找到这个错误,但不幸的是我真的不明白为什么这不起作用。如果有人可以帮助我,我将不胜感激!

我已经通过警报测试了所有 lon/Lat 变量!他们都有适当的数据。地图应该没问题,因为显示了最后 4 个!很可能问题出在我的闭包定义上,但我真的无法理解我做错了什么......

var GMAPS = window.GMAPS || {};
GMAPS.mainMap = function() {
  var map;
  var infowindow = new google.maps.InfoWindow();
  var jsonObject = {};

  function addMarkers() {
    var xhr = new XMLHttpRequest();
    xhr.open( "GET", "/home.json", true );
    xhr.onreadystatechange = function () {
      if ( xhr.readyState == 4 && xhr.status == 200 ) {
        jsonObject = JSON.parse( xhr.responseText );
        for (var i=0; i<jsonObject.length; i++) {
          for (var j=0; j<jsonObject[i].microposts.length; j++) {
            (function(Name, Title, Content, Latitude, Longitude) {
              return function() {
                //alert(Name + "\n" + Title + "\n" + Content + "\n" + Latitude + "\n" + Longitude + "\n");  //<-- this works!
                var position = new google.maps.LatLng(Latitude, Longitude);
                var contentString = "<h4>" + Name.bold() + "</h4>" + "<br />" + Title.bold()
                                + "<br />" + Content;

                var marker = new google.maps.Marker({
                  position: position,
                  title: Title,
                  map: map
                });
                google.maps.event.addListener(marker, 'click', (function(marker, contentString) { 
                    return function() { 
                      infowindow.setContent(contentString); 
                      infowindow.open(map, marker); 
                    } 
                })(marker, contentString));
              };
            })(jsonObject[i].name, jsonObject[i].microposts[j].title,
               jsonObject[i].microposts[j].content,
               jsonObject[i].microposts[j].lat,
               jsonObject[i].microposts[j].lon)();
          }
        }
      }
    };
    xhr.send(null);
  }

  function createMap() {
    map = new google.maps.Map(document.getElementById('main_map'), {
      zoom: 10,
      panControl: true,
      zoomControl: true,
      zoomControlOptions: {
        style: google.maps.ZoomControlStyle.SMALL
      },
      mapTypeControl: true,
      scaleControl: true,
      streetViewControl: true,
      overviewMapControl: true,
      scrollwheel: false,
      center: new google.maps.LatLng(37.975327,23.728701),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
  }


  function initAddress() {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(showPosition);
    }
    else {
      var position = new google.maps.LatLng(0, 0);
      map.setCenter(position);
    }
  }

  function showPosition(position) {
    var position = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
    map.setCenter(position);
  }

  return {

    initMap : function() {
      createMap();
      initAddress();
      addMarkers();
    }
  };
}();

document.addEventListener("DOMContentLoaded", GMAPS.mainMap.initMap, false);

【问题讨论】:

    标签: javascript function variables closures anonymous


    【解决方案1】:

    ** 注意:您的 IIFE 末尾有一组不必要的额外括号。

    在您的 IIFE 之前(在最里面的 for 循环内),尝试添加:

    var jObj = jsonObject[i], mPost = jObj.microposts[j];
    

    然后将 IIFE 的参数替换为:

    (function(Name, Title, Content, Latitude, Longitude) {
                  return function() {
                    //alert(Name + "\n" + Title + "\n" + Content + "\n" + Latitude + "\n" + Longitude + "\n");  //<-- this works!
                    var position = new google.maps.LatLng(Latitude, Longitude);
                    var contentString = "<h4>" + Name.bold() + "</h4>" + "<br />" + Title.bold()
                                    + "<br />" + Content;
    
                    var marker = new google.maps.Marker({
                      position: position,
                      title: Title,
                      map: map
                    });
                    google.maps.event.addListener(marker, 'click', (function(marker, contentString) { 
                        return function() { 
                          infowindow.setContent(contentString); 
                          infowindow.open(map, marker); 
                        } 
                    })(marker, contentString));
                  };
                })(jObj.name, mPost.title, mPost.content, mPost.lat, mPost.lon);
    

    【讨论】:

    • 感谢乔的回答。我有额外的括号来调用我的内部匿名函数。如果我删除它们,则不会显示任何标记。不幸的是,您的解决方案不起作用(没有显示标记)。同样,如果我添加额外的括号,则仅显示最后 4 个标记。也许您可以向我解释我做错了什么以及您的建议基于哪种逻辑?也许这会帮助我解决我的问题:-)
    • 如果你在某个地方我可以看到这段代码执行......使用实际数据会更容易。
    • 其实,你可以在这里复制/粘贴jsonObject吗?
    • 再次感谢您的关注!我已经粘贴了html代码here和json数据here。我希望这些帮助。但是,如果您想要其他东西,请告诉我!
    • 谢谢...现在正在查看。我已经发布了另一个答案(为了清楚起见)。
    【解决方案2】:

    以下代码应该可以工作。我还是不明白你为什么要多出一组括号。

    xhr.onreadystatechange = function() {
      var i = 0, j = 0;
      if ( xhr.readyState == 4 && xhr.status == 200 ) {
        jsonObject = JSON.parse( xhr.responseText );
        for (var ilen = jsonObject.length; i < ilen;) {
          for (var jObj = jsonObject[i++], jlen = jObj.microposts.length; j < jlen;) {
            var mPost = jObj.microposts[j++];
            (function(Name, Title, Content, Latitude, Longitude) {
              return function() {
                //alert(Name + "\n" + Title + "\n" + Content + "\n" + Latitude + "\n" + Longitude + "\n");  //<-- this works!
                var position = new google.maps.LatLng(Latitude, Longitude);
                var contentString = "<h4>" + Name.bold() + "</h4>" + "<br />" + Title.bold()
                                + "<br />" + Content;
    
                var marker = new google.maps.Marker({
                  position: position,
                  title: Title,
                  map: map
                });
                google.maps.event.addListener(marker, 'click', (function(marker, contentString) { 
                    return function() { 
                      infowindow.setContent(contentString); 
                      infowindow.open(map, marker); 
                    } 
                })(marker, contentString));
              };
            })(
              jObj.name, mPost.title, mPost.content, mPost.lat, mPost.lon
            );
          }
        }
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2012-11-07
      相关资源
      最近更新 更多