2011-06-12 109 views
2

我的应用程序绘制从MySQL数据库读取的地图上的一堆标记,我想在每个infowindows中显示一些内容。我的问题是infowindows将只显示我的数据库中最后一项的内容。下面是我的代码,我只是试图显示位置的名称。我试着提醒变量,看看它们是否确实显示了正确的内容,它们是什么。我意识到这是一个JavaScript关闭问题,但我不知道如何去解决这个问题。PHP关闭问题谷歌地图v3

var startLat; 
var startLng; 
var locationName; 

<?php foreach($workstations as $workstation):?> 
    startLat = "<?php echo $workstation['lat']?>"; 
    startLng = "<?php echo $workstation['lng']?>"; 
    locationName = "<?php echo $workstation['name']?>"; 

    var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(startLat, startLng), 
     map: map, 
     icon: "images/purple.png" 
    }); 

    //load all the infowindow content 
    var contentString = [ 
        '<div id="InfoText" style="margin: 0px; padding: 0px; overflow: hidden; border:0px">', 
        '<div class="tabs"><ul><li><a href="#tab1">General</a></li>', 
        '<li><a href="#tab2">General 2</a></li></ul>', 
        '<div id="tab1">', 
        '<b>' + locationName + '</b> - ' + locationName + '<BR>', 
        '<input id="save" type="submit" value="Reserve Today" onclick="saveStation(addMarker)" />', 
        '</div>', 
        '<div id="tab2">', 
        '</div>', 
        '</div>' 
          ].join(''); 

    //alert(contentString); 
    var infowindow = new google.maps.InfoWindow({content: contentString}); 

    new google.maps.event.addListener(marker, 'click', (function(marker) { 
     return function(){ 
      infowindow.open(map, marker); 
      } 
     })(marker)); 
<?php endforeach;?> 

回答

3

是的。这是一个js关闭问题。你有一个变量“标记”,所有地图事件监听器都指向这个变量。 (foreach循环之前)

将这个顶部:试试这个,而不是在你的代码块结束

function addMarkerListener(mark, mp, win) 
{ 
    new google.maps.event.addListener(
      mark, 
      'click', 
      function(){win.open(mp,mark)} 
} 

然后,而非听者补充一点:

addMarkerListener(marker, map, infowindow); 

基本上,你的版本中发生的事情是,js在说:“好吧,我要创建一个函数并让标记变量填充它,明白了。”当实际调用函数时,它说:“我在寻找变量'marker',那个变量是什么?”不幸的是,在此期间这已被重新分配,现在它代表最近的分配。另一方面,这里的版本告诉JavaScript,“我有这些全新的变量,它们只存在于这里,所以不要在其他地方找它们,当其中一个被点击时,显示值与之相关。“当这个项目被点击时,JS说:“嗯......这个变量只被分配在这个上下文中使用,所以我想我会使用它。”

我可以进入变量绑定,并且有一些令人兴奋的Lambda微积分的东西,但这对于这个范围来说有点多。

+0

感谢您的帮助!我给了这个尝试,它的工作。感谢您的解释,非常清楚。 – Albert 2011-06-14 06:56:54

2

你不应该在PHP中做循环。你不仅是输出大量的,重复的Javascript块这样,你还生产这样的:

var infowindow = … 
var infowindow = … 
var infowindow = … 
var infowindow = … 

你改写自己infowindow变量,因此只有最后一个棍子,很明显。

只需在PHP中准备数据,然后使用Javascript循环来处理它。这也应该使范围问题更加明显。在你的情况下,infowindow变量有一个,可以修复如下:

var workstations = <?php echo json_encode($workstations); ?>; 

for (var i = 0; i < workstation.length; i++) { 
    var lat = workstations[i].lat; 
    var lng = workstations[i].lng; 
    var name = workstations[i].name; 

    var marker = … 
    var content = … 
    var infowindow = … 

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