百度地图API循环添加信息窗口,会出现所有消息只显示在第一个窗口的位置的问题.并且信息内容相同

解决方法1

转载自

https://blog.csdn.net/zz_mm/article/details/7600901

function initBaiDuMap(d) {
var markers = [];
for (var i = 0; i < d.length; ++i) {
if (null == d[i].LBSInfo || '' == d[i].LBSInfo)
continue;
(function (x) {
var lbsInfo = JSON.parse(d[x].LBSInfo);
var gcPoint = wgs84togcj02(parseFloat(lbsInfo.lon), parseFloat(lbsInfo.lat));
var bPoint = gcj02tobd09(gcPoint[0], gcPoint[1]);
var targetPoint = new BMapGL.Point(bPoint[0], bPoint[1]);
var markerTarget = new BMapGL.Marker(targetPoint);
map.addOverlay(markerTarget);
//基站返回的半径有误差,*2.5
var circle = new BMapGL.Circle(targetPoint, lbsInfo.radius * 2.5, {
strokeColor: 'blue',
strokeWeight: 1,
strokeOpacity: 0,
fillColor: 'blue',
fillOpacity: 0.1
});
map.addOverlay(circle);
markers.push(markerTarget); var msg_info = "编号:" + d[x].MachineSN + '<br/>' + '名称:' + d[x].MachineName + '<br/>更新时间:' + d[x].LastConnectTime;
var opts = {
width: 240, // 信息窗口宽度
height: 100, // 信息窗口高度
title: 'LTE设备编号:' + d[x].DevLTE_SN, // 信息窗口标题
message: '设备信息'
};
var infoWindow = new BMapGL.InfoWindow(msg_info, opts); // 创建信息窗口对象 markerTarget.addEventListener("click", function () {
map.openInfoWindow(infoWindow, targetPoint); //开启信息窗口
});
})(i);
} var centerPoint = new BMapGL.Point(121.46158672149517, 31.322417370168107);
map.centerAndZoom(centerPoint, 7); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
//map.setHeading(60); //设置地图旋转角度
//map.setTilt(0); //设置地图的倾斜角度
}

同样是一个循环,但是在循环中使用了一个匿名函数,从而造成一个闭包将 i 的值锁定在里面,这样外部的值已经变化,

但是传到闭包里面的值已经被保留,也就可以顺利拿到应该取到的address[i]的内容了。
这样虽然解决了问题,但是每添加一个点都会创建一个匿名函数,内存泄漏可能会是潜在隐患。
接下去, 我们就可以自由的在地图上标注点并显示对应的信息了!

方法2 推荐

把var换成let

function initBaiDuMap(d) {
var markers = [];
for (var i = 0; i < d.length; ++i) {
if (null == d[i].LBSInfo || '' == d[i].LBSInfo)
continue;
if (null == d[i].LBSInfo || '' == d[i].LBSInfo)
continue;
var lbsInfo = JSON.parse(d[i].LBSInfo);
var gcPoint = wgs84togcj02(parseFloat(lbsInfo.lon), parseFloat(lbsInfo.lat));
var bPoint = gcj02tobd09(gcPoint[0], gcPoint[1]);
let targetPoint = new BMapGL.Point(bPoint[0], bPoint[1]);
let markerTarget = new BMapGL.Marker(targetPoint);
map.addOverlay(markerTarget);
//基站返回的半径有误差,*2.5
var circle = new BMapGL.Circle(targetPoint, lbsInfo.radius * 2.5, {
strokeColor: 'blue',
strokeWeight: 1,
strokeOpacity: 0,
fillColor: 'blue',
fillOpacity: 0.1
});
map.addOverlay(circle);
markers.push(markerTarget); let msg_info = "编号:" + d[i].MachineSN + '<br/>' + '名称:' + d[i].MachineName + '<br/>更新时间:' + d[i].LastConnectTime;
let opts = {
width: 240, // 信息窗口宽度
height: 100, // 信息窗口高度
title: 'LTE设备编号:' + d[i].DevLTE_SN, // 信息窗口标题
message: '设备信息'
};
let infoWindow = new BMapGL.InfoWindow(msg_info, opts); // 创建信息窗口对象 markerTarget.addEventListener("click", function () {
map.openInfoWindow(infoWindow, targetPoint); //开启信息窗口
});
} var centerPoint = new BMapGL.Point(121.4617, 32.32247);
map.centerAndZoom(centerPoint, 7); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
//map.setHeading(60); //设置地图旋转角度
//map.setTilt(0); //设置地图的倾斜角度
}

var跟let区别

1 var是函数作用域,let是块作用域。

在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for循环以外也是可以访问的

而let由于是块作用域,所以如果在块作用域内定义的变量,比如说在for循环内,在其外面是不可被访问的,所以for循环推荐用let

2、let不能在定义之前访问该变量,但是var可以。

let必须先声明,在使用。而var先使用后声明也行,只不过直接使用但没有定义的时候,其值是undefined。var有一个变量提升的过程,当整个函数作用域被创建的时候,实际上var定义的变量都会被创建,并且如果此时没有初始化的话,则默认为初始化一个undefined

3、let不能被重新定义,但是var是可以的

百度地图API 循环添加信息窗口问题的更多相关文章

  1. 百度地图API 批量添加 带检索功能的信息窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 百度地图API 循环向 marker 添加 click事件

    使用百度地图API,循环向marker添加InfoWindow时,所有的marker点击弹出的inforwindow为最后一个添加的infowindow,百度后,使用js闭包解决此问题,直接贴代码: ...

  3. 谷歌地图 API 开发之信息窗口

    信息窗口 简介 InfoWindow 在地图上方给定位置的弹出窗口中显示内容(通常为文本或图像).信息窗口具有一个内容区域和一个锥形柄.柄顶部与地图上的某指定位置相连. 通常,您会将信息窗口附加到标记 ...

  4. 调用百度地图api隐藏版权信息

    调用百度地图API隐藏右下角版权信息 商用的话建议不要隐藏,避免侵权. 隐藏前: 隐藏后: .BMap_cpyCtrl { display: none; } .anchorBL { display: ...

  5. Python调用百度地图API实现批量经纬度转换为实际省市地点(api调用,json解析,excel读取与写入)

    1.获取秘钥 调用百度地图API实现得申请百度账号或者登陆百度账号,然后申请自己的ak秘钥.链接如下:http://lbsyun.baidu.com/apiconsole/key?applicatio ...

  6. 百度地图API显示多个标注点并添加百度样式检索窗口

    原作者博客地址:http://blog.csdn.net/a497785609/article/details/24009031 在此基础上进行了修改: 1.添加闭包,将i传入内部 2.添加地图和卫星 ...

  7. 百度地图api窗口信息自定义

    百度地图加载完后,完全可以用dom方法操作,比较常用的就是点击mark的弹窗,利用jQuery可以很快的创建弹窗,需要注意的就是地图都是异步加载,所以绑定时间要用 jQuery 事件 - delega ...

  8. 【百度地图API】建立全国银行位置查询系统(五)——如何更改百度地图的信息窗口内容?

    原文:[百度地图API]建立全国银行位置查询系统(五)--如何更改百度地图的信息窗口内容? 摘要: 酷讯.搜房.去哪儿网等大型房产.旅游酒店网站,用的是百度的数据库,却显示了自定义的信息窗口内容,这是 ...

  9. 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决

    当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合A ...

  10. 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

    原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...

随机推荐

  1. [FAQ] FinalCutPro 添加转场提示“片段边缘之外没有足够的额外媒体可用来创建转场”

    可以把前镜头素材的结尾和后镜头素材的开始减去一部分即可添加转场了. 怎么剪?时间线中有个播放线,快捷键 i 表示选中开始点,快捷键 o 表示选中结束点,使用 delete 键删除选取的部分即可. &g ...

  2. OpenTK 垂直同步对刷新率的影响

    本文将和大家介绍 Vsync 垂直同步的开启对 OpenTK 应用的刷新率的影响 在上一篇博客 OpenTK 入门 初始化窗口 告诉了大家如何初始化 OpenTK 承载 OpenGL 的窗口的应用,在 ...

  3. WPF 自定义控件入门 Focusable 与焦点

    自定义控件时,如果自定义的控件需要用来接收键盘消息或者是输入法的输入内容,那就需要关注到控件的焦点 默认情况下的自定义控件是没有带可获取焦点的功能的,例如编写一个继承 FrameworkElement ...

  4. dotnet 教你写一个可以搞炸本机所有 WCF 应用的程序方法

    作为团队里面挖掘机出身的我,怎么能不多挖一些坑好将小伙伴们都埋进去呢.本文来告诉大家一个有趣且简单的方法,此方法可以将本机的 WCF 玩坏,不敢说真的搞炸本机所有 WCF 应用,但搞炸大部分基于 WC ...

  5. 前端之JavaScript基础学习

    一.JS代码引入以及基本代码规范 # 1.js代码书写格式 <script> ....js的代码 </script> #2.script标签写在页面那个位置 1)页面的head ...

  6. 利用MOS管构成基本的数字逻辑门

    欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 非门原理图中 ...

  7. VMware虚拟机安装Centos-7.9

    VMware虚拟机安装Centos-7.9 创作不易,点赞关注一下吧 1.安装VMware Workstation Pro 大家根据自己的实际情况安装合适版本的VMware Workstation P ...

  8. Halo博客搭建小记

    准备工作 阿里云服务器,操作系统为CentOS 7.9.2009 x86_64(Py3.7.9) 宝塔面板 Nginx 1.24.0(用于反向代理) 已备案的域名 ssl证书(https访问) 参考官 ...

  9. 01. Linux 如何安装rvm和ruby

    参考: https://blog.csdn.net/qq_35641923/article/details/86493822 https://www.runoob.com/ruby/ruby-inst ...

  10. SQL Server 数据库分析操作程序时SQL语句等待或执行时间较长(死锁)

    大型程序,总会遇到程序操作端卡顿或者直接遇到死锁,死锁是数据库设计的缺陷,虽不能完全避免死锁的出现,但一旦出现死锁我们要进行及时分析死锁语句,找出原因,进行SQL语句或程序的优化,避免再次出现同样的问 ...