Javascript Google Maps API v3将事件绑定到多个地图
我有一个页面,上面有两个谷歌地图,使用v3api。目前,它们各有一个管脚,每个管脚的lat和long设置相同,尽管其中一个贴图将在以后添加其他管脚(当我可以让它工作时!),但贴图是通过对象循环生成的,因此,如果需要,可以简单地添加其他贴图 我试图做的是将Javascript Google Maps API v3将事件绑定到多个地图,javascript,google-maps,google-maps-api-3,addeventlistener,Javascript,Google Maps,Google Maps Api 3,Addeventlistener,我有一个页面,上面有两个谷歌地图,使用v3api。目前,它们各有一个管脚,每个管脚的lat和long设置相同,尽管其中一个贴图将在以后添加其他管脚(当我可以让它工作时!),但贴图是通过对象循环生成的,因此,如果需要,可以简单地添加其他贴图 我试图做的是将bounds\u changed事件绑定到两个映射,在运行map.fitbunds()后运行map.setZoom()。但是,该事件仅绑定到要设置的最后一个贴图,因此不会重置第一个贴图上的缩放 链接到复制问题的JSFIDLE: (为了更清楚地了解
bounds\u changed
事件绑定到两个映射,在运行map.fitbunds()
后运行map.setZoom()
。但是,该事件仅绑定到要设置的最后一个贴图,因此不会重置第一个贴图上的缩放
链接到复制问题的JSFIDLE:
(为了更清楚地了解事件绑定到什么,请将事件更改为侦听单击
而不是bounds\u changed
,然后尝试单击第一个地图并观察第二个地图上的缩放级别更改)
非常感谢您的帮助 根据这个答案创建了这个
除了需要添加的函数外,map变量应该是一个数组,这样每个map都有一个实例
map[i]=新的google.maps.map($(maps[i].mapement)[0],opts);
如果您需要任何代码的解释,请询问,但我认为在添加的帖子中有足够的关于javascript闭包的信息 除非保留对所有映射的引用,否则无法将侦听器添加到多个映射,当前仅保留对上次创建的映射的引用
// use function closure to associate the map with its bounds listener
addBoundsListener(map, opts, bounds);
map.fitBounds(bounds);
}
function addBoundsListener(map, opts, bounds) {
// If no center option has been specified, center the map to
// contain all pins and reset the zoom
var listener = new google.maps.event.addListenerOnce(map, "bounds_changed", function () {
if (!opts.center) {
map.setZoom(opts.zoom);
}
});
}
代码段:
var映射={
“财产定位”:{
“mapElement”:“#map1”,
“选择”:{
“缩放”:10,
“街景控制”:错误
},
“别针”:[{
“标题”:“测试1”,
“lat”:“52.1975331616”,
“长”:“0.9771180153”
}]
},
“本地区域”:{
“mapElement”:“#map2”,
“选择”:{
“缩放”:14,
“街景控制”:错误
},
“别针”:[{
“标题”:“测试2”,
“lat”:“52.1975331616”,
“长”:“0.9771180153”
}]
}
};
//合理违约
var默认值={
缩放:9,
mapTypeId:google.maps.mapTypeId.ROADMAP,
德拉格布尔:是的
};
用于(映射中的变量i){
//扩展选项
var opts=$.extend(true,默认值,映射[i].options),
标记,
地图,
bounds=新的google.maps.LatLngBounds();
//创建地图
map=new google.maps.map($(maps[i].mapement)[0],opts);
//创建所有管脚
对于(var p=0;p
问题在于,
map
变量在循环的每次迭代中都被重新定义,因此当事件侦听器回调运行时,它将在第二个google.maps.map
对象上运行。最简单的解决方案是使用闭包在每次迭代中捕获map
变量的值,如下所示:
(function (map) {
var listener = new google.maps.event.addListenerOnce(map, "bounds_changed", function () {
if (!opts.center) {
map.setZoom(opts.zoom);
};
});
}) (map);
我用你的JSFiddle来演示这个想法:谢谢你的回答:)