2010-03-21 46 views
2

有人可以帮助我这个漂亮吗?我不知道我的代码出了什么问题,我想在信息窗口中显示位置地址,但每次显示前一个结果而不是当前结果。例如当我第一次点击一个位置时,它会添加一个标记,但显示的地址是未定义的(这是之前的结果)。然后我点击另一个地方显示第一个地址。谷歌地图信息窗口显示以前的地理结果,而不是当前的结果

我该如何解决这个问题,以显示当前位置标记的地址?请。非常感谢。下面是我的代码..

var map; 
var marker; 
var markersArray = []; 

var infoWindow; 
var buffer; 

var geocoder, regeocoder; 

function initialize() { 

window.onunload = google.maps.Unload; 

// Creating an option object for the map 

    var myOptions = { 
      zoom: 16, 
      center:COUNTRY, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

// Initializing the map 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

// Add onClick event to the map 

    google.maps.event.addListener(map, 'click', function(event) { placeMarker(event.latLng, true); }); 
} 

function placeMarker(location, flag) { 

// Get clicked location <Latitude, Longtitude> 

var clickedLocation = location; 

    if (markersArray) { 
     for (i in markersArray) { 
       markersArray[i].setMap(null); 
     } 
     markersArray.length = 0; 
    } 

    // Create a new marker 

    marker = new google.maps.Marker({ 
     position: clickedLocation, 
      map: map, 
      icon: 'image/blue-dot.png', 
      title: "Select this location", 
      clickable: true 
    }); 

    if (flag == true) { 

     // Start reverse Geocode 

     regeocoder = new google.maps.Geocoder(); 

     if (regeocoder) { 
       regeocoder.geocode({'latLng': clickedLocation, 'region': region}, function(results, status){ 

       if (status == google.maps.GeocoderStatus.OK) { 
       if (results[0]) { buffer = results[0].formatted_address; } 
       } 
      else { } 
       }); 
     } 

    setHiddenValue(buffer); 

    setMarkerInfo(buffer, clickedLocation); 

    } 

    // Attach mouseover event to a marker that will trigger the markerInfo 

    google.maps.event.addListener(marker, 'mouseover', function() { infowindow.open(map,marker); }); 

    // Attach mouseout event to the marker that will delete the markerInfo 

    google.maps.event.addListener(marker, 'mouseout', function() { if (infowindow) infowindow.close(); }); 

    markersArray.push(marker); 

    map.setCenter(clickedLocation); 
} 


function setMarkerInfo(title, textbody) { 

    // Initialize the contentString 

    var contentString = '<div id="content">'+'<div id="siteNotice">'+'</div>'+ 
    '<br/><h3 id="firstHeading" class="firstHeading">' + title + '</h1>'+ 
    '<div id="bodyContent">'+ 
    '<p>Map Coordinates: <br/>' + textbody + '</p>'+ 
    '</div>'+ 
    '</div>'; 

    infowindow = new google.maps.InfoWindow({ content: contentString }); 
    infosArray.push(infowindow); 
} 

function setHiddenValue(data) { 
    var hiddenVal = document.getElementById('getLoc'); 
    if (hiddenVal) { hiddenVal.value = data; } 
} 

function searchMap(info) { 

var address = info; 
var loc; 
var addr; 

    geocoder = new google.maps.Geocoder(); 

    if (geocoder) { 
      geocoder.geocode({'address': address, 'region': region}, function(sresults, sstatus){ 
       if (sstatus == google.maps.GeocoderStatus.OK) { 

        if (sresults[0]) { 

        loc = sresults[0].geometry.location; 

        geocoder.geocode({'latLng': loc}, function(results, status){ 
          if (status == google.maps.GeocoderStatus.OK) { 
          if (results[0]) { addr = results[0].formatted_address; } 
          } 
         else { alert("No Matching Results"); } 
         }); 

       } 

      }else { alert("No Matching Results"); } 

      }); 
    } 

    if (geocoder) { 
      geocoder.geocode({'address': address, 'region': region}, function(sresults, sstatus){ 
       if (sstatus == google.maps.GeocoderStatus.OK) { 

        if (sresults[0]) { 

        loc = sresults[0].geometry.location; 

        geocoder.geocode({'latLng': loc}, function(results, status){ 
          if (status == google.maps.GeocoderStatus.OK) { 
          if (results[0]) { addr = results[0].formatted_address; } 
          } 
         else { alert("No Matching Results"); } 
         }); 

       } 

      }else { alert("No Matching Results"); } 

      }); 
    } 

    setHiddenValue(addr); 

    setMarkerInfo(addr, loc); 

    placeMarker(loc, false); 

} 

回答

1

你的问题被链接到地址信息到达异步,因此您在获得相关格式的地址之前执行的所有代码的事实:

geocoder.geocode({'latLng': loc}, function(results, status){ 
          if (status == google.maps.GeocoderStatus.OK) { 
           if (results[0]) { addr = results[0].formatted_address; } 
          } 
          else { alert("No Matching Results"); } 
       }); 

我建议所有连接成一个组合函数调用:

google.maps.event.addListener(marker, 'mouseover', function() { 

,而不是和:

infowindow.open(map,marker); }); 

你拨打:

new google.maps.InfoWindow({ content: 

,而不是和:

contentString }); 

你拨打:

geocoder.geocode({'latLng': loc}, function(results, status){ 
    if (status == google.maps.GeocoderStatus.OK) { 
     if (results[0]) { addr = results[0].formatted_address; } 
    } else { 
     * alert("No Matching Results"); */ 
    } 
}); 

,并在此得到了格式化结果到CSS样式你的愿望和回报为一个字符串。

这样,无论何时您通过标记,您都会查询相对地址并即时创建infowindow。

希望它有帮助。