本帖最后由 zoujiaming 于 2015-01-14 15:43:46 编辑

解决方案 »

  1.   

    没用过这个地图,下面的这setLabel不知道是否支持设置DOM对象,如果支持你需要创建DOM对象,这样才可以添加闭包事件
    customerWinInfo.setLabel(html.join(''));否则你要将map和customerWinInfo变量都设置为widow作用域下的。。你在$里面申明,只在那个匿名函数中能引用到。字符串里面设置的事件是window作用域下的才能访问
      

  2.   

    <!DOCTYPE html> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>天地图-地图API-范例-自定义信息窗口</title> 
    <script type="text/javascript" src="http://api.tianditu.com/js/maps.js"></script> 
    <script type="text/javascript" type="text/javascript">   
         var map,zoom=12;
         var customerWinInfo=null; 
         function onLoad() { 
    //初始化地图对象 
        map=new TMap("mapDiv"); 
        //设置显示地图的中心点和级别 
    map.centerAndZoom(new TLngLat(116.40969,39.94940),zoom); 
    //允许鼠标双击放大地图 
    map.enableHandleMouseScroll(); 
      //模拟的数据
    var json = {
    "stations" : [{
    "Longitude" : 116.404,
    "Latitude" : 39.915,
    "RecorderId": 1
    },{
    "Longitude" : 116.383752,
    "Latitude" : 39.91334,
    "RecorderId": 2
    },{
    "Longitude" : 116.384502,
    "Latitude" : 39.932241,
    "RecorderId": 3
    }
    ]
    };


    //循环添加点
    for (var i = 0; i < json.stations.length; i++) {
    var lnglat = new TLngLat(parseFloat(json.stations[i].Longitude), parseFloat(json.stations[i].Latitude));
    if (i == 0) {
    map.centerAndZoom(lnglat, zoom);
    }
    var er = new TMarker(lnglat);

    //使用闭包的形象注册事件
    (function () {
    //在闭包中保存的局部变量
    var m = er;
    var id = json.stations[i].RecorderId;
    //注册单击事件
    erclick = TEvent.addListener(m, "click", function(){
    onClick(m, id);
    });  
    })();
    map.addOverLay(er);
    }
         }      //关闭信息窗
         function onClose(){ 
             map.removeOverLay(customerWinInfo); 
         } 
         
     //单击点
         function onClick(er, id){ 
             var html=[]; 
             html.push('<div style="background:#CCCC99;height:20px;color:#000;width:135px;">'); 
             html.push('     <span style="width:100px;float:left;margin-left:2px;background:">标题'+id+'</span><span  style="width:30px;float:right;margin-right:2px;" onclick="onClose();">关闭</span>');    
             html.push('</div>'); 
             html.push('<div id="deliver-legend-ctrl" style="background:#fff;border:1px solid #C0C0C0;">'); 
             html.push(' <table cellspacing="0" cellspadding="0" style="width:130px;border:1px solid #ff0000;">'); 
             html.push('     <tr align="center" style="height:10px;">'); 
             html.push('         <td></td>'); 
             html.push('         <td><a herf="javascript:void(0);"></a></td>'); 
             html.push('     </tr>'); 
             html.push('     <tr align="center">'); 
             html.push('         <td>经度:</td>'); 
             html.push('         <td>'+er.getLngLat().getLng()+'</td>'); 
             html.push('     </tr>'); 
             html.push('     <tr align="center">'); 
             html.push('         <td>纬度:</td>'); 
             html.push('         <td>'+er.getLngLat().getLat()+'</td>'); 
             html.push('     </tr>'); 
             html.push('     <tr style="height:10px;">'); 
             html.push('         <td></td>'); 
             html.push('         <td><a herf="javascript:void(0);"></a></td>'); 
             html.push('     </tr>'); 
             html.push(' </table>'); 
             html.push('</div>'); 
     
             var config = { 
    offset:new TPixel(0,0), 
    position:er.getLngLat() 
     }; 
     if(customerWinInfo) {
     onClose();
     }
             customerWinInfo=new TLabel(config); 
             customerWinInfo.setTitle(''); 
             customerWinInfo.setLabel(html.join('')); 
             customerWinInfo.getObject().style.zIndex = 10000; 
             map.addOverLay(customerWinInfo); 
            
         } 
    </script> 
    </head> 
    <body onLoad="onLoad()"> 
    <div id="mapDiv" style="position:absolute;width:600px; height:500px;"></div> 

    </body> 
    </html>
      

  3.   

    上述的例子是始终只有一个infowindow的情况,如果需要多个infowindow的话,需要将每个信息框存储起来,在注册关闭事件的时候指定要关闭的信息窗口就行