google maps v3的PHP javascript关闭问题

问题描述

|| 我的应用程序在从MySQL数据库读取的地图上绘制了一堆标记,我想在每个信息窗口中显示一些内容。我的问题是信息窗口将仅显示数据库中最后一个条目的内容。下面是我的代码,在这里我只是尝试显示位置的名称。我尝试警告变量以查看它们是否确实显示了正确的内容。我意识到这是一个JavaScript关闭问题,但我不知道该如何解决。
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>\'
                           ].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;?>
    

解决方法

        是。这是一个js关闭问题。您有一个变量“ marker”,所有地图事件监听器都指向该变量。尝试以下方法: 将其放在顶部(在foreach循环之前):
function addMarkerListener( mark,mp,win )
{
    new google.maps.event.addListener(
          mark,\'click\',function(){win.open(mp,mark)}
}
然后,而不是在代码块末尾添加侦听器:
addMarkerListener( marker,map,infowindow );
基本上,您的版本中发生的事情是js在说,“好吧,我要创建一个函数,并让它的marker变量填充它。得到它。”当需要实际调用该函数时,它说:“我正在寻找变量“'marker \”,该变量中有什么?”。不幸的是,与此同时它已被重新分配,现在它代表最新的分配。 另一方面,这里的版本告诉JavaScript,“我拥有这些全新的变量,它们仅存在于此处,因此不要在其他任何地方查找它们。单击其中一个,然后显示与\“。单击该项目时,JS表示,\”嗯...此变量仅分配给在此上下文中使用,所以我想我会使用它。\“ 我可以进行变量绑定,其中涉及到一些令人兴奋的Lambda Calculus东西,但这对于这个范围来说有点过多。     ,        您不应该在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,function () {
            infowindow.open(map,marker);
        });
    })(marker,infowindow);
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...