多个Market共用一个InfoWindow
2013-11-04 14:59
483 查看
最近一个项目是关于GIS(geographical information system )的,学习了一下GoogleMap,过程中碰到不少问题。
首先:GoogleMap API地址: https://developers.google.com/maps/documentation/javascript/tutorial?hl=zh-CN 去里面看下Demo、API,申请一个Key就可以进行GoogleMap的开发了。
今天看一下第一个问题:多个Market共用一个InfoWindow
先看一下最开始的代码:
运行代码,会发现Market都显示出来了,但是click事件却有个问题,就是不管点哪一个Market,InfoWindow都会显示在最后一个Market上面,且显示的内容都是最后一个Market的。
刚好最近正在看《JavaScript高级程序设计(第2版)》,
好象《JavaScript高级程序设计(第3版)》也出来了。
仔细检查代码,我分析的原因是:JavaScript 变量的作用域是在 function 内,for { } 里面定义的变量在 for { } 以外 function 以内都是可以访问的,包括变量 i 。上面代码 for 循环里定义的变量 marker0 每循环一次只是将变量 marker0 指针的重新指向新创建的对象上,而内存栈里面其实只保存了一个变量 marker0 。
以后写 JavaScript 函数时 第一件事应该就是定义该函数要用到的所有变量。
于是,将代码改成为
修改后,再运行代码,发现 bug 依旧。继续修改代码为如下就OK了:
最终,我的代码修改成这样的了
最后借用书里面的例子说一下 JavaScript 里面参数的传递,先看一下的代码,会弹出什么呢?
JavaScript 里面函数的参数都是按值类型进行传递的。引用类型传递的只是一个指针。程序运行到 setName 时,setName 作用域内变量 localPerson 指向的是全局变量 globalPerson 指向的堆中的一个对象,localPerson、globalPerson 指向的是同一个对象,所以执行
会为堆中的对象添加一个 name 的属性,当执行
只是把 localPerson 指向了新建的对象上,此时 localPerson、globalPerson 分别指向各自的对象。
啰啰嗦嗦写了这么多,感觉也没什么,只是希望对碰到同类问题的 guys 有点帮助。
$(".MathJax").remove();
首先:GoogleMap API地址: https://developers.google.com/maps/documentation/javascript/tutorial?hl=zh-CN 去里面看下Demo、API,申请一个Key就可以进行GoogleMap的开发了。
今天看一下第一个问题:多个Market共用一个InfoWindow
先看一下最开始的代码:
var points = [{ Longitude: 110.993487, Latitude: 37.997283 }, { Longitude: 112.769617, Latitude: 38.768677 }, { Longitude: 116.913983, Latitude: 26.944184 }, { Longitude: 102.360533, Latitude: 38.130595 }, { Longitude: 114.552137, Latitude: 35.675677 }, { Longitude: 112.320119, Latitude: 37.371388 }, { Longitude: 101.360533, Latitude: 38.130595 }, { Longitude: 104.552137, Latitude: 35.675677 }, { Longitude: 111.320119, Latitude: 37.371388}]; var map; var markers = []; var infowindow = new google.maps.InfoWindow({ maxWidth: 240 }); function initialize() { markers = []; var myLatlng0 = new google.maps.LatLng(points[0].Latitude, points[0].Longitude); var mapOptions = { zoom: 4, center: myLatlng0, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); for (var i = 0; i < points.length; i++) { var myLatlng = new google.maps.LatLng(points[i].Latitude, points[i].Longitude); var marker0 = new google.maps.Marker({ position: myLatlng, map: map, title: i.toString() }); google.maps.event.addListener(marker0, 'click', function () { infowindow.setContent(marker0.getTitle()); infowindow.open(map, marker0); }); } }
运行代码,会发现Market都显示出来了,但是click事件却有个问题,就是不管点哪一个Market,InfoWindow都会显示在最后一个Market上面,且显示的内容都是最后一个Market的。
刚好最近正在看《JavaScript高级程序设计(第2版)》,
好象《JavaScript高级程序设计(第3版)》也出来了。
仔细检查代码,我分析的原因是:JavaScript 变量的作用域是在 function 内,for { } 里面定义的变量在 for { } 以外 function 以内都是可以访问的,包括变量 i 。上面代码 for 循环里定义的变量 marker0 每循环一次只是将变量 marker0 指针的重新指向新创建的对象上,而内存栈里面其实只保存了一个变量 marker0 。
以后写 JavaScript 函数时 第一件事应该就是定义该函数要用到的所有变量。
于是,将代码改成为
function initialize() { var marker0; markers = []; var myLatlng0 = new google.maps.LatLng(points[0].Latitude, points[0].Longitude); var mapOptions = { zoom: 4, center: myLatlng0, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); for (var i = 0; i < points.length; i++) { myLatlng0 = new google.maps.LatLng(points[i].Latitude, points[i].Longitude); marker0 = new google.maps.Marker({ position: myLatlng0, map: map, title: i.toString() }); google.maps.event.addListener(marker0, 'click', function () { showInfoWindow(marker0); }); } } function showInfoWindow(marker0) { infowindow.setContent(marker0.getTitle()); infowindow.open(map, marker0); }
修改后,再运行代码,发现 bug 依旧。继续修改代码为如下就OK了:
for (var i = 0; i < points.length; i++) { myLatlng0 = new google.maps.LatLng(points[i].Latitude, points[i].Longitude); marker0 = new google.maps.Marker({ position: myLatlng0, map: map, title: i.toString() }); attachEvent(marker0); }
function attachEvent(marker0) { google.maps.event.addListener(marker0, 'click', function () { showInfoWindow(marker0); }); }
最终,我的代码修改成这样的了
function initialize1() { markers = []; var myLatlng0 = new google.maps.LatLng(points[0].Latitude, points[0].Longitude); var mapOptions = { zoom: 4, center: myLatlng0, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); for (var i = 0; i < points.length; i++) { createMarker(i); } } function createMarker(i) { var myLatlng = new google.maps.LatLng(points[i].Latitude, points[i].Longitude); var marker0 = new google.maps.Marker({ position: myLatlng, map: map, title: i.toString() }); google.maps.event.addListener(marker0, 'click', function () { showInfoWindow(marker0); }); }
最后借用书里面的例子说一下 JavaScript 里面参数的传递,先看一下的代码,会弹出什么呢?
function setName(localPerson) { localPerson.name = "g_cheng"; localPerson = new Object(); localPerson.name = "the.Cheng"; } var globalPerson = new Object(); setName(globalPerson); alert(globalPerson.name);
JavaScript 里面函数的参数都是按值类型进行传递的。引用类型传递的只是一个指针。程序运行到 setName 时,setName 作用域内变量 localPerson 指向的是全局变量 globalPerson 指向的堆中的一个对象,localPerson、globalPerson 指向的是同一个对象,所以执行
localPerson.name = "g_cheng";
会为堆中的对象添加一个 name 的属性,当执行
localPerson = new Object(); localPerson.name = "the.Cheng";
只是把 localPerson 指向了新建的对象上,此时 localPerson、globalPerson 分别指向各自的对象。
啰啰嗦嗦写了这么多,感觉也没什么,只是希望对碰到同类问题的 guys 有点帮助。
$(".MathJax").remove();
相关文章推荐
- 多个Market共用一个InfoWindow
- 多网卡下同网段内所有网卡共用一个IP的问题分析
- 多台mac共用一个开发者帐号
- tp pc,m 在共用一个框架的情况下,共用模型
- 多台mac,共用一个开发者账号/导入苹果开发者账号
- REDIS实践之请勿踩多进程共用一个实例连接的坑
- c++多个源文件共用一个全局变量(extern 的用法)
- (Android)百度地图API只能显示一个infowindow的完美解决方案
- 单片机和继电器如何共用一个电源?
- 腾讯开放平台创建应用的坑,安卓和iOS端如何共用同一个Appid?
- 两个UserControl共用一个BMUserControl的功能建
- 如何让hudson的两个job共用一个svn工作目录
- 解决vue多个路由共用一个页面的问题
- laravel 控制器多个方法共用一个路由
- 两个Ms Chart共用一个Series时,Series的资源释放问题
- LaTeX 多个图片共用一个题注的实现--子图形
- 外网主机如何将数据包发送到共用一个公网IP的局域网某特定主机上的
- 生成共用的一个Fragment
- ASP.NET 页面多个button共用一个事件进行增删改查
- 二十八、多态性、动态类型 和 动态绑定(一)多态性:不同的措施 共用 同一个名称