谷歌api信息窗口显示在谷歌地图api上的1个标记下

google api infoWindow displaying under 1 marker on google maps api

本文关键字:api 1个 上的 谷歌地图 信息 信息窗 窗口 显示 谷歌      更新时间:2023-09-26

我在添加多个标记并为每个标记显示信息窗口时,遇到了新的谷歌地图api的问题,我所有的标记都在显示,但我的主要问题是信息窗口总是显示在一个地方,我看了所有的标记,但似乎找不到正确的解决方案,我要显示的所有信息都来自数据库,所以我使用xmlhttp.responseText从另一个函数getData获取信息。

我的代码如下

  function showMap(data){     
 //Changing the json respose back to the javascript array
    var LongLat = eval( '(' + data + ')');
   // Creating a new map
    var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(-26.1981, 28.0488),
    zoom: 5,
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

for (var i = 0; i < LongLat.length; i++) {
    latLng = new google.maps.LatLng(LongLat[i][0],LongLat[i][1]); 
    // Creating a marker and putting it on the map
    var marker = new google.maps.Marker({
    position:latLng,
    map: map,
    title: LongLat[i][0]
    });

    var infoWindow = new google.maps.InfoWindow();
    // Attaching a click event to the current marker
    google.maps.event.addListener(marker, "click", function(point){ 
        getData(this.position);
        xmlhttp.onreadystatechange=function()
        {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                infoWindow.setContent(xmlhttp.responseText);
                infoWindow.open(map,marker);
            }
        }               
        });
    }
 }

我的getData函数如下

function getData(d){

//把宾语分为长短p=(d.toString());

c = p.indexOf(',');
e = p.indexOf(')');
lat = p.substring(1,c);
lon = p.substring(c+1,e);
if(d == "results"){
    var htmlCode = t;
}
if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest(); 
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            document.getElementById('results').innerHTML = xmlhttp.responseText;
        }
    }
    if(xmlhttp.readyState==4 && xmlhttp.status==200){
        alert(xmlhttp.responseText);
        return xmlhttp.responseText;
    }
var html = xmlhttp.open("GET","mapmaker.php?lat="+lat+"&lon="+lon,true);
xmlhttp.send();
 }

您的代码几乎很好:)只有几个错误:

将地图、信息窗口作为全局

    var map = null;
    var infoWindow = null;
    function initialize()
    {
        // Fill w/ sample data
        var LongLat = new Array();
        LongLat[0] = new Array(-26.5, 28.5);
        LongLat[1] = new Array(-26.0, 28.0);
        // Creating a new map
        map = new google.maps.Map(document.getElementById("map-canvas"), {
            center: new google.maps.LatLng(-26.1981, 28.0488),
            zoom: 5,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });
        infoWindow = new google.maps.InfoWindow();
        for(var i = 0; i < LongLat.length; i++)
        {
            var latLng = new google.maps.LatLng(LongLat[i][0], LongLat[i][1]);
            AddMarkerToMap(latLng, i);
        }  // END FOR ( LatLng)
    }

将标记创建移动到单独的函数。这将隐藏变量以避免更改

    function AddMarkerToMap(latLng, i)
    {
        var marker = new google.maps.Marker({
            position:latLng,
            map:map
        });
        google.maps.event.addListener(marker, 'click', function()
        {
            infoWindow.setContent("Title: " + i);
            infoWindow.open(map, marker);
        });
    }

我认为最好重用1个infoWindow。看看这个对我有用的片段:

var infowindow = new google.maps.InfoWindow();

function addToMap() {
    for (var i = 0; i < marker_data.length; i++) {
        marker = new google.maps.Marker({
            position: new google.maps.LatLng(marker_data[i].lat, marker_data[i].lng),
            clickable: true,
            id:marker_data[i].id
        });
        google.maps.event.addListener(marker, "click", function() {
            infowindow.close();
            load_content(this, this.id);
        });
        marker.setMap(map);
        /* here we keep track of the markers that we have added to the page */
        markers_on_map.push(marker);
    }
}
function load_content(marker, id){
    $.ajax({
        url: '/map/getMarkerWindow/' + id,
        success: function(data){
            infowindow.setContent(data);
            infowindow.open(map, marker);
        }
    });
}