单击另一个标记时关闭infowindow

时间:2012-09-27 12:21:50

标签: javascript google-maps

我有以下代码在点击特定标记并打开窗口时打开infowindow。当点击另一个时,有没有人知道如何关闭以前的信息窗口?。

   google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map1, marker);
        });

7 个答案:

答案 0 :(得分:12)

请确保您只在全局范围内创建一个infoWindow,如下所示:

infoWindow = new google.maps.InfoWindow; //static infoWindow for all your markers
google.maps.event.addDomListener(window, 'load', function() {
   //create your markers here
   google.maps.event.addListener(marker, 'click', function() {
               infoWindow.open(map1, marker); //take care with case-sensitiveness
          });
});

<强>更新

  • 修复Duncan发现的区分大小写。
  • 说明标记点击处理程序必须在标记创建后连接,两者都在页面加载事件中。

答案 1 :(得分:6)

在JS文件中创建一个全局变量,将其命名为lastOpenedInfoWindow或任何你想要的,然后在打开新信息窗口之前关闭它,将“lastOpenedInfoWindow”分配给当前打开的窗口,依此类推

$hashCheck = $this->_db->get('users_session_table', array('user_id', '=', $this->data()->id));              }

答案 2 :(得分:1)

infowindow.close()将关闭一个开放的信息窗口。这取决于你如何创建你的infowindows - 你只有一个infowindow变量来处理所有,或者你是否为每个标记创建多个infowindow对象?在这个阶段没有看到更多代码的情况下,很难更具体。

答案 3 :(得分:0)

为了在单击另一个时关闭前一个infowindow,您需要确保以下代码在函数initialize()循环中。

infoWindow = new google.maps.InfoWindow;

答案 4 :(得分:0)

我也有这个问题,这是我所做的:

function initMap() {
//---------------------map
var options = {
    zoom: 12,
    center: {
        lat: 43.5963020324707,
        lng: 1.4221688508987427
    }
}
var map = new google.maps.Map(document.getElementById('map'), options);    
//--------------- Adresses
let addresses = [
    "23 Quai Lucien Lombard",
    "18 Place Laganne",
    "266 Avenue de Fronton",
    "3 Impasse du Professeur Nougayrol",
    "1 Allées Charles de Fitte",
    "5 Avenue de Casselardit",
    "84 Chemin des Argoulets"
];

// ---------------- globales
let markers = []
let infowindowArray = []

// ---------------- Adresses Géocoder
geocodeAdresses(addresses)
    .then(res=>{

        geocodeAdressesArray = res;         
        return geocodeAdressesArray
    })
    .then(geocodeAdressesArray=>{
    // --------------create markers
        for (let i = 0; i < geocodeAdressesArray.length; i++){  

            let marker = new google.maps.Marker({ 
                'id': geocodeAdressesArray[i].id,
                'adresse': geocodeAdressesArray[i].adresse,
                'position':{
                    'lat':geocodeAdressesArray[i].lat,
                    'lng':geocodeAdressesArray[i].lng
                }
            });
            markers.push(marker)// push globale             
            marker.setMap(map)
    // ---------- create infowindows

            let infowindow = new google.maps.InfoWindow({
                'position' : marker.position,                
                'content': marker.adresse,
            });
            infowindowArray.push(infowindow) // push globale
        }
    // ---------------close infowindows on clic 
        for (let i = 0; i < markers.length; i++) {
            let marker = markers[i];

            marker.addListener( 'click', ()=>{                  

                for (let j = 0; j < infowindowArray.length; j++) { 
                    let infowindow = infowindowArray[j];
                    infowindow.close(map, marker)
                }
                let currentInfowindows = infowindowArray[i]
                currentInfowindows.open(map)               
            })
        }
    })

}

对于我的geocode地址(地址),这是我从google geocode API创建的函数。

我希望它将对您有帮助

答案 5 :(得分:0)

如果您对“this”有任何问题(在我的情况下,我使用的是 Vue.js),您可以直接使用带有箭头函数的 marker 作为回调。请参阅documentation

就我而言,我有(确保创建一个标记、内容并全局实例化 this.mapsInfoWindow,顺便说一句,不需要设置其内容):

...
marker.addListener("click", () => {
    if (this.mapsInfoWindow) {
        this.mapsInfoWindow.close();
    }
    this.mapsInfoWindow.setContent(content);
    this.mapsInfoWindow.open(this.map, marker);
});

答案 6 :(得分:-1)

确保你有一个InfoWindow实例 - 新的google.maps.InfoWindow。因此,每次单击标记时,只会在初始化方法或全局声明的InfoWindow中声明一个实例。

var infoWindow = new google.maps.InfoWindow
确保此infoWindow仅实例化一次。否则,每次单击标记时都会打开多个窗口。

marker.addListener('click', function () {                                
    infoWindow.setContent(infowincontent);
    infoWindow.open(clntLocMap, marker);
});