百度地图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. 2019-11-29-C#-如何写-DEBUG-输出

    title author date CreateTime categories C# 如何写 DEBUG 输出 lindexi 2019-11-29 08:28:35 +0800 2018-2-13 ...

  2. K8s控制器(8)---Deployment

    一.Deployment控制器概念.原理解读 1.1 Deployment概述 # Deployment官方文档 https://kubernetes.io/docs/concepts/workloa ...

  3. 数据分析之重要模块pandas

    1.简介 基于Numpy构建 pandas的出现,让Python语言成为使用最广泛而且强大的数据分析环境之一 pandas的主要功能 - 具备诸多功能的两大数据结构 Series.DataFrame( ...

  4. Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷

    写在开头 最近是和java.util.concurrent.locks包下的同步类干上了,素有 并发根基 之称的concurrent包中全是精品,今天我们继续哈,今天学习的主题要由一个大厂常问的Jav ...

  5. MQTT的使用一

    MQTT:物联网消息传递标准 简介 MQTT是用于物联网(IoT)的OASIS标准消息传递协议.它被设计为一种非常轻量级的发布/订阅消息传送,非常适合以较小的代码占用量和最小的网络带宽连接远程设备.如 ...

  6. ContextCapture-硬件配置推荐

    ContextCapture倾斜摄影的空三计算.三维建模应用.非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间. 硬件常见问题 随着倾斜摄影建模算法成熟,应用越来越广泛,数据量越来越大,需 ...

  7. 远程协助软件哪个好,IT远程支持用什么软件

    软件行业做售后支持,有时候需要远程控制客户电脑以实现远程协助,远程解决客户问题. IT远程支持用什么软件比较好?这个我们可以逐个分析下. 一.QQ远程 一看就不专业,的确也不专业.QQ远程协助可以实现 ...

  8. JDK源码阅读-------自学笔记(三)(java.lang.String String用法和描述浅析)

    一.源码特点 final约束,使得String不能被继承,内部其他也不能被继承 String用来表示字符串,或字符序列,序列即为数组 内建数组private final char value[];但是 ...

  9. ETSI GS MEC 013,UE 位置 API

    目录 文章目录 目录 版本 功能理解 Relation with OMA APIs Relation with OMA API for Zonal Presence Relation with OMA ...

  10. npm 安装 sass 引用

    1.npm install node-sass --save-dev 2.npm install sass-loader --save-dev npm i less-loader  --save-de ...