Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google Maps API v3将事件绑定到多个地图_Javascript_Google Maps_Google Maps Api 3_Addeventlistener - Fatal编程技术网

Javascript Google Maps API v3将事件绑定到多个地图

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: (为了更清楚地了解

我有一个页面,上面有两个谷歌地图,使用v3api。目前,它们各有一个管脚,每个管脚的lat和long设置相同,尽管其中一个贴图将在以后添加其他管脚(当我可以让它工作时!),但贴图是通过对象循环生成的,因此,如果需要,可以简单地添加其他贴图

我试图做的是将
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来演示这个想法:

谢谢你的回答:)