Google maps api 3 通过单击地图关闭谷歌地图中的信息窗口?

Google maps api 3 通过单击地图关闭谷歌地图中的信息窗口?,google-maps-api-3,Google Maps Api 3,我正在制作一个移动网络应用程序 应用程序的一部分会删除几个标记,单击这些标记可以打开信息窗口。让我恼火的是,如果你像在iOS地图应用程序中那样,在不确认的情况下继续使用地图,这些信息不会消失 是否有一种方法可以将其设置为,如果用户单击基础映射,所有打开的信息窗口都将关闭?将侦听器添加到映射的单击事件并关闭其处理程序中的信息框 google.maps.event.addListener(map, "click", function(event) { for (var i = 0; i &l

我正在制作一个移动网络应用程序

应用程序的一部分会删除几个标记,单击这些标记可以打开信息窗口。让我恼火的是,如果你像在iOS地图应用程序中那样,在不确认的情况下继续使用地图,这些信息不会消失


是否有一种方法可以将其设置为,如果用户单击基础映射,所有打开的信息窗口都将关闭?

将侦听器添加到映射的单击事件并关闭其处理程序中的信息框

google.maps.event.addListener(map, "click", function(event) {
    for (var i = 0; i < ibArray.length; i++ ) {  //I assume you have your infoboxes in some array
         ibArray[i].close();
    }
});
google.maps.event.addListener(映射,“单击”,函数(事件){
对于(var i=0;i
我在典型的网站上这样做,但看不出它在移动设备上不起作用的任何原因

google.maps.event.addListener(map, "click", function(event) {
    infowindow.close();
});
这很简单,而且应该也能工作

google.maps.event.addListener(marker, 'click', function() {
    if(!marker.open){
        infoWindow.open(map,marker);
        marker.open = true;
    }
    else{
        infoWindow.close();
        marker.open = false;
    }
    google.maps.event.addListener(map, 'click', function() {
        infoWindow.close();
        marker.open = false;
    });
});

非常有效

我注意到其他答案存在一些问题

马库斯·隆美尔和斯拉维克温的回答:

单击标记后,将触发映射单击事件。因此,当marker click打开窗口时,要映射的click事件的传播将立即再次关闭窗口

用户1724001的回答:

每次单击标记时创建侦听器也不是一个好主意。这会污染记忆

因此,我只想在第一个答案中添加一些附加信息,以停止事件向地图的传播。只有在未单击任何标记的情况下,窗口才会关闭

marker.addListener("click", function(event) {
    // open your window here
    event.stopPropagation(); // this prevents propagation of marker click to map click
});

map.addListener("click", function() {
    // close your window
});

我有更好的解决方案

试试这个:

constinfowindow=new google.maps.infoWindow();
函数init(){
const map=new google.maps.map(document.getElementById('map'){
缩放:6,
中心:新google.maps.LatLng(39.9646,30.8259),
mapTypeId:google.maps.mapTypeId.TERRAIN
});
map.addListener('单击',()=>{
如果(信息窗口){
infoWindow.close();
}
});
const istanbulMark=新的google.maps.Marker({
位置:新google.maps.LatLng(41.0876,28.9288),
地图:地图,
标签:“我爱你。”
});
istanbulMark.addListener('单击',()=>{
infoWindow.setContent(`
嗨,伙计

欢迎来到İstanbul

`) 信息窗口。打开(地图、istanbulMark); }); const ankaraMark=new google.maps.Marker({ 位置:新google.maps.LatLng(39.9162,32.8437), 地图:地图, 标签:“A” }); ankaraMark.addListener('单击',()=>{ infoWindow.setContent(` 嗨,伙计
欢迎来到安卡拉

`) 信息窗口。打开(地图、ankaraMark); }); } google.maps.event.addDomListener(窗口'load',init)
html,body,#map{
身高:100%;
边际:0px;
填充:0px
}

文件

这应该是公认的答案!工作起来很有魅力!是的,我同意上面的评论。值得一提的是,此代码需要位于marker事件侦听器函数
google.maps.event.addListener(marker,'click',function()中){
,因为我花了一些时间试图让它工作,却不知道它应该在那里。谢谢。@tinyCoder不一定。可能是
infowindow
变量是代码中标记单击处理程序的本地变量,但这不是给定的。还有map.addListener(“单击”),函数(事件){…工作此答案不是最佳解决方案,请查看Marcus Rommel的答案。您不需要创建多个信息窗口,而是创建一个,然后根据您单击的标记填充它,因此您不需要使用某些循环来关闭它们。有一种更简单的解决方案。这是唯一适用于我的答案,但“信息窗口”i除外现在是“infoWindow”。每次打开标记时,这个答案都会绑定一个侦听器。添加一些console.log(),您将看到它被越来越多地激发…这不再有效。
marker.addListener(“单击”
不再获得
事件
参数。也不再需要
停止播放
,默认情况下,google maps会这样做。实际上,Marcus Rommel解决方案确实有效。他在“地图”中添加了一个侦听器以关闭信息窗口。打开信息窗口的侦听器位于“标记”上。