最近幾年在搞地圖方面的開發,主要是迴圈為座標添加標註並為標註添加彈出資訊視窗,起初My Code如下:
var map = new BMap.Map("Mapcontainer"); var JsonObj = eval(JsonStr); if (JsonObj != null) { for (var i = 0; i < JsonObj.length; i++) { var point = new BMap.Point(JsonObj[i].Visit_GPS_Longitude, JsonObj[i].Visit_GPS_Latitude); // 建立點座標 map.centerAndZoom(point, 13); var marker = new BMap.Marker(point); var opts = { width: 250, // 資訊視窗寬度 height: 100, // 資訊視窗高度 title: '<span style="font-size:15px;color:#0A8021">' + JsonObj[i].CustomerName + '</span>' // 資訊視窗標題 } //marker.setAnimation(BMAP_ANIMATION_BOUNCE); var content = "進店時間 " + JsonObj[i].VisitBeginTime + "<br/>離店時間 " + JsonObj[i].VisitEndTime; var info_Window = new BMap.InfoWindow(content, opts); // 建立資訊視窗對象 marker.addEventListener("click", function () { this.openInfoWindow(info_Window); }); map.addOverlay(marker); } map.addControl(new BMap.NavigationControl());
這樣子確實能添加標註,也彈出資訊視窗,但是問題來了!彈出 的資訊視窗沒有變化,也就是說本來不同的標註上彈出 的資訊視窗應該是不一樣的,可以不知道怎麼回事
彈出的資訊視窗一直是最後的那個資訊視窗!折騰了好久,最後終於解決了,具體的代碼如下:
var map = new BMap.Map("Mapcontainer"); var JsonObj = eval(JsonStr); if (JsonObj != null) { for (var i = 0; i < JsonObj.length; i++) { (function (x) { var point = new BMap.Point(JsonObj[x].Visit_GPS_Longitude, JsonObj[x].Visit_GPS_Latitude); // 建立點座標 map.centerAndZoom(point, 13); var marker = new BMap.Marker(point); var opts = { width: 250, // 資訊視窗寬度 height: 100, // 資訊視窗高度 title: '<span style="font-size:15px;color:#0A8021">' + JsonObj[x].CustomerName + '</span>' // 資訊視窗標題 } //marker.setAnimation(BMAP_ANIMATION_BOUNCE); var content = "進店時間 " + JsonObj[x].VisitBeginTime + "<br/>離店時間 " + JsonObj[x].VisitEndTime; var info_Window = new BMap.InfoWindow(content, opts); // 建立資訊視窗對象 marker.addEventListener("click", function () { this.openInfoWindow(info_Window); }); map.addOverlay(marker); })(i); } map.addControl(new BMap.NavigationControl());
同樣是一個迴圈,但是在迴圈中使用了一個匿名函數,從而造成一個閉包將 i 的值鎖定在裡面,這樣外部的值已經變化,
但是傳到閉包裡面的值已經被保留,也就可以順利拿到應該取到的address[i]的內容了。
這樣雖然解決了問題,但是每添加一個點都會建立一個匿名函數,記憶體流失可能會是潛在隱患。
接下去, 我們就可以自由的在地圖上標註點並顯示對應的資訊了!