Google Maps: Tutup otomatis buka InfoWindows?


108

Di situs saya , saya menggunakan Google Maps API v3 untuk menempatkan penanda rumah di peta.

InfoWindows tetap terbuka kecuali Anda secara eksplisit mengklik ikon tutup. Artinya, Anda dapat membuka 2+ InfoWindows dalam satu waktu jika Anda mengarahkan kursor ke penanda peta.

Pertanyaan : Bagaimana cara membuatnya sehingga hanya InfoWindow aktif saat ini yang terbuka dan semua InfoWindows lainnya ditutup? Artinya, tidak lebih dari 1 InfoWindow akan dibuka dalam satu waktu?


1
Bagi saya, lebih baik membuat satu jendela saja dan memperbaruinya (isinya dan lain-lain), buka dan tutup dan semuanya. Tetapi saya cukup yakin pendekatan ini tidak selalu dapat diterapkan.
andrii

Jawaban:


154

Ada fungsi close () untuk InfoWindows. Catat saja jendela yang terakhir dibuka, dan panggil fungsi tutup di atasnya saat jendela baru dibuat.

Demo ini memiliki fungsionalitas yang Anda cari. Saya menemukannya di galeri demo Maps API V3 .


4
Suara positif untuk saran melacak jendela yang terakhir dibuka saja. Sepertinya tidak punya otak, tetapi orang-orang melupakan hal-hal itu ...
Rémi Breton

1
Saya baru saja menggunakan teknik yang sama persis. Terima kasih Chris. Itu perlu bagi saya, karena saya menggunakan array objek InfoWindow, bukan hanya satu yang memutar dan mengambil info terkait. Setiap InfoWindow memiliki informasi yang diperbarui secara terpisah, jadi menurut saya teknik ini cukup berguna.
InterfaceGuy

2
tautan "demo ini" rusak
Brendan Whiting

Terima kasih banyak! Menggunakan pendekatan ini dan itu bekerja seperti pesona. Anda memperbaiki hari saya. Suara positif.
Alan Espinet

64

solusi alternatif untuk ini dengan menggunakan banyak infowindows: simpan prev membuka jendela infow dalam sebuah variabel dan kemudian tutup ketika jendela baru dibuka

var prev_infowindow =false; 
...
base.attachInfo = function(marker, i){
    var infowindow = new google.maps.InfoWindow({
        content: 'yourmarkerinfocontent'
    });

    google.maps.event.addListener(marker, 'click', function(){
        if( prev_infowindow ) {
           prev_infowindow.close();
        }

        prev_infowindow = infowindow;
        infowindow.open(base.map, marker);
    });
}

3
Seperti yang ini. Sederhana untuk dipahami dan diterapkan
Aamir Afridi

6
Maafkan kenaifan saya, tapi WTF itu dasar?
Demikian juga

Saya tidak mengerti mengapa itu bukan perilaku default di Google maps V3 ...
Tuan Washington

Solusi terbaik dan paling sederhana yang saya temukan sejauh ini. Terima kasih!
Irteza Asad

27
//assuming you have a map called 'map'
var infowindow = new google.maps.InfoWindow();

var latlng1 = new google.maps.LatLng(0,0);
var marker1 = new google.maps.Marker({position:latlng1, map:map});
google.maps.event.addListener(marker1, 'click',
    function(){
        infowindow.close();//hide the infowindow
        infowindow.setContent('Marker #1');//update the content for this marker
        infowindow.open(map, marker1);//"move" the info window to the clicked marker and open it
    }
);
var latlng2 = new google.maps.LatLng(10,10);
var marker2 = new google.maps.Marker({position:latlng2, map:map});
google.maps.event.addListener(marker2, 'click',
    function(){
        infowindow.close();//hide the infowindow
        infowindow.setContent('Marker #2');//update the content for this marker
        infowindow.open(map, marker2);//"move" the info window to the clicked marker and open it
    }
);

Ini akan "memindahkan" jendela info ke setiap penanda yang diklik, pada dasarnya menutup sendiri, lalu membuka kembali (dan menggeser agar sesuai dengan area pandang) di lokasi barunya. Ini mengubah isinya sebelum dibuka untuk memberikan efek yang diinginkan. Bekerja untuk penanda n.


1
Catatan cepat: panggilan berulang ke infowindow.open () sudah cukup; jendela tidak perlu ditutup dulu.
Eric Nguyen

3
@Eric, meskipun secara teknis Anda benar, saya melihat bug yang terkadang menyebabkan jendela info muncul di posisi terakhirnya. Memaksa menutup kekalahan pertama, kata bug.
Joel Mellon

22

Solusi saya.

var map;
var infowindow = new google.maps.InfoWindow();
...
function createMarker(...) {
var marker = new google.maps.Marker({
     ...,
     descrip: infowindowHtmlContent  
});
google.maps.event.addListener(marker, 'click', function() {
    infowindow.setOptions({
        content: this.descrip,
        maxWidth:300
    });
    infowindow.open(map, marker);
});

3
Itu benar-benar elegan - hanya dengan menggunakan satu jendela masuk dan mengubah konten menghindari keharusan untuk melacak / menutup yang sebelumnya.
Nick F

Solusi ini memang sangat elegan dan bekerja seperti pesona. +1
Sebastian Breit

9

Dari tautan ini http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/ :

Teo: Cara termudah untuk melakukannya adalah dengan hanya memiliki satu objek InfoWindow yang Anda gunakan berulang kali. Dengan begitu, saat Anda mengklik penanda baru, infoWindow "dipindahkan" dari tempatnya saat ini, untuk menunjuk ke penanda baru.

Gunakan metode setContent untuk memuatnya dengan konten yang benar.


Saya tidak percaya ini berlaku karena saya menggunakan Google Maps v3 API
Ted

Plus, artikel yang Anda tautkan juga tidak mendemonstrasikan lebih dari 1 penanda
Ted

Saya telah menggunakan satu jendela info dengan cara yang sama untuk beberapa situs. Klik satu, yang terbuka menutup secara otomatis.
Keith Adler

4
Bagaimana Anda mengasosiasikan beberapa tanda dengan satu InfoWindow?
Ted

7

Deklarasikan variabel untuk jendela aktif

var activeInfoWindow; 

dan ikat kode ini di pemroses penanda

 marker.addListener('click', function () {
    if (activeInfoWindow) { activeInfoWindow.close();}
    infowindow.open(map, marker);
    activeInfoWindow = infowindow;
});

Terima kasih, Ini benar-benar berfungsi saat mengklik di mana saja di peta.
Varinder Singh Baidwan

Salam kawan, dari semua saran, ini bekerja paling baik untuk saya dan AF bersih.
Matthew Ellis

4

Ada cara yang lebih mudah selain menggunakan fungsi close (). jika Anda membuat variabel dengan properti InfoWindow, ia menutup secara otomatis saat Anda membuka yang lain.

var info_window;
var map;
var chicago = new google.maps.LatLng(33.84659, -84.35686);

function initialize() {
    var mapOptions = {
        center: chicago,
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    info_window = new google.maps.InfoWindow({
        content: 'loading'
    )};

createLocationOnMap('Location Name 1', new google.maps.LatLng(33.84659, -84.35686), '<p><strong>Location Name 1</strong><br/>Address 1</p>');
createLocationOnMap('Location Name 2', new google.maps.LatLng(33.84625, -84.36212), '<p><strong>Location Name 1</strong><br/>Address 2</p>');

}

function createLocationOnMap(titulo, posicao, conteudo) {            
    var m = new google.maps.Marker({
        map: map,
        animation: google.maps.Animation.DROP,
        title: titulo,
        position: posicao,
        html: conteudo
    });            

    google.maps.event.addListener(m, 'click', function () {                
        info_window.setContent(this.html);
        info_window.open(map, this);
    });
}

1
var map;
var infowindow;
...
function createMarker(...) {
    var marker = new google.maps.Marker({...});
    google.maps.event.addListener(marker, 'click', function() {
        ...
        if (infowindow) {
            infowindow.close();
        };
        infowindow = new google.maps.InfoWindow({
            content: contentString,
            maxWidth: 300
        });
        infowindow.open(map, marker);
    }
...
function initialize() {
    ...
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    ...
    google.maps.event.addListener(map, 'click', function(event) {
        if (infowindow) {
            infowindow.close();
        };
        ...
    }
}

Terima kasih, saya perlu menutup jendela masuk ketika tidak mengklik penanda jadi hanya di peta
VRC

1

Bagaimana tentang -

google.maps.event.addListener(yourMarker, 'mouseover', function () {
        yourInfoWindow.open(yourMap, yourMarker);

    });

google.maps.event.addListener(yourMarker, 'mouseout', function () {
        yourInfoWindow.open(yourMap, yourMarker);

    });

Kemudian Anda bisa mengarahkan kursor ke atasnya dan itu akan menutup sendiri.


Ini adalah solusi yang menarik tetapi tidak menjawab pertanyaan dan tidak akan berfungsi pada perangkat sentuh saja.
Lee

1

Saya menyimpan variabel di bagian atas untuk melacak jendela info mana yang saat ini terbuka, lihat di bawah.

var currentInfoWin = null;
google.maps.event.addListener(markers[counter], 'click', function() {      
    if (currentInfoWin !== null) {
        currentInfoWin.close(map, this); 
    }
    this.infoWin.open(map, this); 
    currentInfoWin = this.infoWin;  
}); 

Apa yang [counter] lakukan di sini?
Lee

0

Inilah yang saya gunakan jika Anda menggunakan banyak penanda dalam perulangan for (Django di sini). Anda dapat menyetel indeks pada setiap penanda dan menyetel indeks itu setiap kali Anda membuka jendela. Menutup indeks yang disimpan sebelumnya:

markers = Array();
infoWindows = Array();
var prev_infowindow =false;
{% for obj in objects %}
var contentString = 'your content'
var infowindow = new google.maps.InfoWindow({
            content: contentString,
          });
var marker = new google.maps.Marker({
               position: {lat: {{ obj.lat }}, lng: {{ obj.lon }}},
               map: map,
               title: '{{ obj.name }}',
               infoWindowIndex : {{ forloop.counter0 }}
          });
google.maps.event.addListener(marker, 'click',
            function(event)
            {
           if( prev_infowindow ) {
               infoWindows[prev_infowindow].close();
                }
                prev_infowindow = this.infoWindowIndex;
                infoWindows[this.infoWindowIndex].open(map, this);
            }
        );

        infoWindows.push(infowindow);
        markers.push(marker);

      {% endfor %}

-1
var contentString = "Location: " + results[1].formatted_address;    
google.maps.event.addListener(marker,'click', (function(){ 
    infowindow.close();
    infowindow = new google.maps.InfoWindow({
        content: contentString
    });
    infowindow.open(map, marker);
}));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.