百度地图API 循环添加信息窗口问题
百度地图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 循环添加信息窗口问题的更多相关文章
- 百度地图API 批量添加 带检索功能的信息窗口
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 百度地图API 循环向 marker 添加 click事件
使用百度地图API,循环向marker添加InfoWindow时,所有的marker点击弹出的inforwindow为最后一个添加的infowindow,百度后,使用js闭包解决此问题,直接贴代码: ...
- 谷歌地图 API 开发之信息窗口
信息窗口 简介 InfoWindow 在地图上方给定位置的弹出窗口中显示内容(通常为文本或图像).信息窗口具有一个内容区域和一个锥形柄.柄顶部与地图上的某指定位置相连. 通常,您会将信息窗口附加到标记 ...
- 调用百度地图api隐藏版权信息
调用百度地图API隐藏右下角版权信息 商用的话建议不要隐藏,避免侵权. 隐藏前: 隐藏后: .BMap_cpyCtrl { display: none; } .anchorBL { display: ...
- Python调用百度地图API实现批量经纬度转换为实际省市地点(api调用,json解析,excel读取与写入)
1.获取秘钥 调用百度地图API实现得申请百度账号或者登陆百度账号,然后申请自己的ak秘钥.链接如下:http://lbsyun.baidu.com/apiconsole/key?applicatio ...
- 百度地图API显示多个标注点并添加百度样式检索窗口
原作者博客地址:http://blog.csdn.net/a497785609/article/details/24009031 在此基础上进行了修改: 1.添加闭包,将i传入内部 2.添加地图和卫星 ...
- 百度地图api窗口信息自定义
百度地图加载完后,完全可以用dom方法操作,比较常用的就是点击mark的弹窗,利用jQuery可以很快的创建弹窗,需要注意的就是地图都是异步加载,所以绑定时间要用 jQuery 事件 - delega ...
- 【百度地图API】建立全国银行位置查询系统(五)——如何更改百度地图的信息窗口内容?
原文:[百度地图API]建立全国银行位置查询系统(五)--如何更改百度地图的信息窗口内容? 摘要: 酷讯.搜房.去哪儿网等大型房产.旅游酒店网站,用的是百度的数据库,却显示了自定义的信息窗口内容,这是 ...
- 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决
当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合A ...
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
随机推荐
- [FAQ] ErrorException of l5-swagger:generate, Required @OA\Info() not found
l5-swagger 除了要添加 @OA\Get() 针对方法的注释之外,每个 Controller 还需要一个概述信息,如下: /** * @OA\Info( * title="Auth ...
- dotnet Multi-platform App UI 多平台应用 UI 框架简介
现在可以使用 .NET 构建一切应用.富有生产力的 .NET 是当前数百万的开发者选择这个平台的理由.在 .NET 5 微软统一了整个 .NET 平台,将 .NET Core 和 Mono 以及基于 ...
- net core下链路追踪skywalking安装和简单使用
当我们用很多服务时,各个服务间的调用关系是怎么样的?各个服务单调用的顺序\时间性能怎么样?服务出错了,到底是哪个服务引起的?这些问题我们用什么方案解决呢,以前的方式是各个系统自己单独做日志,出了问题从 ...
- VP NOI2023
一个月前的事情捏,因为今天刚好在摸鱼就想起来写写. Day 1 开题,先总的过一遍,好像比较传统. T1 基本上是一眼题了,简单容斥一下就可以解决.很快开始写,写好过了小样例.但是这个时候还没有大样例 ...
- 【Oracle】Oracle数据库多实例安装
需求:因为需要从RAC的多实例迁移至单虚拟机的多实例.因此,简要概述一下,如何安装数据库的多实例. 不管是Oracle 11g还是10g的多实例,其基本思路都是一致的. 1.调用dbca 在root账 ...
- 谷歌 hackbar 不能使用的问题
谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中 点击详情,点 ...
- 01. go-admin的下载与启动
目录 一.介绍 二.新建空文件夹 三.获取后台源码并启动 1.下载编译go代码 2.配置命令到goland IDE ,debug启动 四.获取前端ui源码并启动 1.下载编译go代码 2.启动项目 * ...
- 【源码研读】MLIR Dialect 分层设计
以「疑问 - 求解」的形式来组织调研,此处记录整个过程. 1. MLIR 中的 Dialect 是「分层」设计的么? 先问是不是,再谈为什么.从 LLVM 社区 可以看出,至少在做 Codegen 时 ...
- 4G EPS 的架构模型
目录 文章目录 目录 前文列表 EPS 的架构 EPS 的架构模型 E-UTRAN UE eNodeB EPC MME(移动性管理) SGW(本地移动性锚点) PGW(业务锚点) HSS(用户认证及鉴 ...
- 比Selenium更优秀的playwright介绍与未来展望
Playwright是微软开发的,专门为满足端到端测试需求而创建的.Playwright支持包括Chromium.WebKit和Firefox在内的所有现代渲染引擎.在Windows.Linux和ma ...