39

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

应用程序的一部分会掉落几个标记,单击这些标记可以打开信息窗口。让我恼火的是,如果您继续使用地图而不承认它们,这些不会消失,就像在 iOS 地图应用程序中一样。

有没有办法设置它,如果用户点击底层地图,所有打开的信息窗口都会关闭?

4

5 回答 5

61

尝试这个:

google.maps.event.addListener(map, "click", function(event) {
    infowindow.close();
});

这很简单,应该也可以。

于 2015-03-13T09:26:24.210 回答
45

将监听器添加到地图的单击事件并在其处理程序中关闭信息框

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();
    }
});

我在典型的网站上这样做,但看不出它在移动设备上不起作用的任何原因

于 2012-04-05T06:38:41.373 回答
9
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;
    });
});

完美运行

于 2015-08-21T15:15:00.730 回答
1

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

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

单击标记时,会触发地图单击事件。所以当标记点击打开窗口时,点击事件传播到地图会立即再次关闭窗口。

user1724001的回答:

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

因此,我只想在第一个答案中添加一些附加信息,以阻止事件传播到地图。只有在没有点击任何标记的情况下,Windows 才会关闭。

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
});
于 2018-11-20T03:29:05.657 回答
0

我对所有 senario 都有更好的解决方案。

试试这个:JSFiddle

const infoWindow = new google.maps.InfoWindow();

function init() {
    const map = new google.maps.Map(document.getElementById('map'), {
        zoom: 6,
        center: new google.maps.LatLng(39.9646, 30.8259),
        mapTypeId: google.maps.MapTypeId.TERRAIN
    });

    map.addListener('click', () => {
        if (infoWindow) {
            infoWindow.close();
        }
    });

    const istanbulMark = new google.maps.Marker({
        position: new google.maps.LatLng(41.0876, 28.9288),
        map: map,
        label: 'I'
    });

    istanbulMark.addListener('click', () => {
        infoWindow.setContent(`
            <h1>Hi mate</h1>
            <hr>
            <p>Welcome to İstanbul!</p>
          `)
        infoWindow.open(map, istanbulMark);
    });

    const ankaraMark = new google.maps.Marker({
        position: new google.maps.LatLng(39.9162, 32.8437),
        map: map,
        label: 'A'
    });

    ankaraMark.addListener('click', () => {
        infoWindow.setContent(`
            <h1>Hi mate</h1>
            <hr>
            <p>Welcome to Ankara!</p>
          `)
        infoWindow.open(map, ankaraMark);
    });
}

google.maps.event.addDomListener(window, 'load', init);
 html, body, #map {
      height: 100%;
      margin: 0px;
      padding: 0px
  }
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true">
  </script>
</head>
<body>
  <div id="map"></div>
</body>
</html>

于 2020-09-10T17:19:07.543 回答