Google maps api 3 GMAPSAPIV3-多标记和;信息窗

Google maps api 3 GMAPSAPIV3-多标记和;信息窗,google-maps-api-3,google-maps-markers,infowindow,Google Maps Api 3,Google Maps Markers,Infowindow,我知道,这是一个反复出现的问题,但是。。。我的多个标记有一个大问题:它们都有相同的标题和相同的信息窗口内容 我在很多网站上搜索过,但我没有找到代码中的问题所在。 我希望你能帮助我(我肯定是这样的!) 这是我的代码: <script type="text/javascript"> var map; var geocoder; $(document).ready(function() {

我知道,这是一个反复出现的问题,但是。。。我的多个标记有一个大问题:它们都有相同的标题和相同的信息窗口内容

我在很多网站上搜索过,但我没有找到代码中的问题所在。 我希望你能帮助我(我肯定是这样的!)

这是我的代码:

<script type="text/javascript">
            var map;
            var geocoder;
            $(document).ready(function() {
                initializeMap();
            });


            function initializeMap() {

                var people = [{"userid":"47","lastname":"lastname1","firstname":"firstname1","address":"SomeAddress","phone1":"00000000000","phone2":"","email":"me@me.com"},{"userid":"42","lastname":"lastname2","firstname":"firstname2","address":"SomeAddress2","phone1":"0","phone2":"0","email":"me@me.com"}]; 


                var center = new google.maps.LatLng(40.667, -73.833); 

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

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

                for (i = 0; i < people.length; i++) {
                    var p = people[i];



                    geocoder.geocode( { 'address': p["address"]}, function(results, status) {
                        if (status == google.maps.GeocoderStatus.OK) {
                            map.setCenter(results[0].geometry.location);
                            var marker = new google.maps.Marker({
                                map:map,
                                draggable:false,
                                animation: google.maps.Animation.DROP,
                                title:p["lastname"] + " " + p["firstname"],
                                position: results[0].geometry.location
                            });


                            var myWindowOptions = {
                                content:
                                    '<h3>'+p["lastname"] + " " + p["firstname"]+'</h3>'+
                                    '<p>'+p["address"]
                            };

                            var myInfoWindow = new google.maps.InfoWindow(myWindowOptions);

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

 </script>
<script type="text/javascript">
            var map;
            var geocoder;
            $(document).ready(function() {
                initializeMap();
            });


            function initializeMap() {

                var people = [{"userid":"47","lastname":"lastname1","firstname":"firstname1","address":"SomeAddress","phone1":"00000000000","phone2":"","email":"me@me.com"},{"userid":"42","lastname":"lastname2","firstname":"firstname2","address":"SomeAddress2","phone1":"0","phone2":"0","email":"me@me.com"}]; 


                var center = new google.maps.LatLng(50.833, 25.000); 

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

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



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

                var marker, i;

                for (i = 0; i < people.length; i++) {  
                    alert(people[i]['address']);
                    geocoder.geocode( { 'address': people[i]["address"]}, function(results, status) {

                        marker = new google.maps.Marker({
                            position: results[0].geometry.location,
                            map: map
                        });

                        google.maps.event.addListener(marker, 'click', (function(marker, i) {
                            return function() {
                                infowindow.setContent('<h3>'+people[i]["lastname"] + " " + people[i]["firstname"]+'</h3>');
                                infowindow.open(map, marker);
                            }
                        })(marker, i));
                    });
                }

            }
</script>

var映射;
var地理编码器;
$(文档).ready(函数(){
初始化映射();
});
函数初始化映射(){
var people=[{“userid”:“47”,“lastname”:“lastname1”,“firstname”:“firstname1”,“address”:“SomeAddress”,“phone1”:“00000000000”,“phone2”:“email”:me@me.com},{“userid”:“42”,“lastname”:“lastname2”,“firstname”:“firstname2”,“address”:“SomeAddress2”,“phone1”:“0”,“phone2”:“0”,“email”:me@me.com"}]; 
var center=newgoogle.maps.LatLng(40.667,-73.833);
变量myOptions={
缩放:8,
中心:中心,,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
geocoder=新的google.maps.geocoder();
对于(i=0;i
我真的希望有人能告诉我我的错误,谢谢你的帮助


不,我真的不明白, 这应该是我在代码中没有看到的:

<script type="text/javascript">
            var map;
            var geocoder;
            $(document).ready(function() {
                initializeMap();
            });


            function initializeMap() {

                var people = [{"userid":"47","lastname":"lastname1","firstname":"firstname1","address":"SomeAddress","phone1":"00000000000","phone2":"","email":"me@me.com"},{"userid":"42","lastname":"lastname2","firstname":"firstname2","address":"SomeAddress2","phone1":"0","phone2":"0","email":"me@me.com"}]; 


                var center = new google.maps.LatLng(40.667, -73.833); 

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

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

                for (i = 0; i < people.length; i++) {
                    var p = people[i];



                    geocoder.geocode( { 'address': p["address"]}, function(results, status) {
                        if (status == google.maps.GeocoderStatus.OK) {
                            map.setCenter(results[0].geometry.location);
                            var marker = new google.maps.Marker({
                                map:map,
                                draggable:false,
                                animation: google.maps.Animation.DROP,
                                title:p["lastname"] + " " + p["firstname"],
                                position: results[0].geometry.location
                            });


                            var myWindowOptions = {
                                content:
                                    '<h3>'+p["lastname"] + " " + p["firstname"]+'</h3>'+
                                    '<p>'+p["address"]
                            };

                            var myInfoWindow = new google.maps.InfoWindow(myWindowOptions);

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

 </script>
<script type="text/javascript">
            var map;
            var geocoder;
            $(document).ready(function() {
                initializeMap();
            });


            function initializeMap() {

                var people = [{"userid":"47","lastname":"lastname1","firstname":"firstname1","address":"SomeAddress","phone1":"00000000000","phone2":"","email":"me@me.com"},{"userid":"42","lastname":"lastname2","firstname":"firstname2","address":"SomeAddress2","phone1":"0","phone2":"0","email":"me@me.com"}]; 


                var center = new google.maps.LatLng(50.833, 25.000); 

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

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



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

                var marker, i;

                for (i = 0; i < people.length; i++) {  
                    alert(people[i]['address']);
                    geocoder.geocode( { 'address': people[i]["address"]}, function(results, status) {

                        marker = new google.maps.Marker({
                            position: results[0].geometry.location,
                            map: map
                        });

                        google.maps.event.addListener(marker, 'click', (function(marker, i) {
                            return function() {
                                infowindow.setContent('<h3>'+people[i]["lastname"] + " " + people[i]["firstname"]+'</h3>');
                                infowindow.open(map, marker);
                            }
                        })(marker, i));
                    });
                }

            }
</script>

var映射;
var地理编码器;
$(文档).ready(函数(){
初始化映射();
});
函数初始化映射(){
var people=[{“userid”:“47”,“lastname”:“lastname1”,“firstname”:“firstname1”,“address”:“SomeAddress”,“phone1”:“00000000000”,“phone2”:“email”:me@me.com},{“userid”:“42”,“lastname”:“lastname2”,“firstname”:“firstname2”,“address”:“SomeAddress2”,“phone1”:“0”,“phone2”:“0”,“email”:me@me.com"}]; 
var center=new google.maps.LatLng(50.83325000);
变量myOptions={
缩放:8,
中心:中心,,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
geocoder=新的google.maps.geocoder();
var infowindow=new google.maps.infowindow();
var标记,i;
对于(i=0;i

谢谢您的帮助!!:)

您必须存储对所有标记和所有信息窗口的引用。这是主要思想。以下是我以前找到并使用的链接之一

这是一个众所周知的问题。有很多关于它的信息。请尝试搜索


我希望它能帮上忙。

我也打了这一个,但我刚刚用完了它(一个相当混蛋的东西,imho)

这里的主要问题是异步geocoder.geocode()函数:您编写代码的内联回调在任意时间执行(google回答您的请求所需的时间),它与for循环无关

因此,您的i计数器变量通常会包含最后一个可能的值,因为执行For的短周期比http请求到达服务器并返回要快得多

主要的解决方案是将这两者结合起来

用这个

正如Ruslan Polutsygan所指出的。 对我来说,真正的诀窍是将任何迭代操作保留在geocoder回调之外。因此,这是“核心”:

function geocodeSite(site) {
  geocoder = new google.maps.Geocoder();
  geocoder.geocode( { 'address': site.place + ', IT'}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      site.position = results[0].geometry.location;
      addMarker(site);
    } else {
      alert("Geocode was not successful for the following reason: " + status);
    }
  });
}

function addMarker(site) {
  marker = new google.maps.Marker({
      map: map,
      position: site.position,
      animation: google.maps.Animation.DROP,
      title: site.name
  });
  google.maps.event.addListener(marker, 'click', function () {
    infoWindow.setContent(site.name);
    infoWindow.open(map, this);
  });
}
我就是这样使用它的:

<script type='text/javascript'>
  var data = <?php print $geodata?>;
  for (var i = 0; i < witaly_data.length; i++) {
    geocodeSite(data[i]);
  }
</script>

var数据=;
对于(变量i=0;i
其中数据是我在服务器端生成的json变量,它由一个名称组成