Googleマップ:開いているInfoWindowsを自動的に閉じますか?


108

私のサイトでは、Google Maps API v3を使用して、家のマーカーを地図に配置しています。

閉じるアイコンを明示的にクリックしない限り、情報ウィンドウは開いたままになります。つまり、マップマーカーにカーソルを合わせると、一度に2つ以上の情報ウィンドウを開くことができます。

質問:現在アクティブなInfoWindowのみが開かれ、他のすべてのInfoWindowが閉じられるようにするにはどうすればよいですか?つまり、一度に開くことができるInfoWindowは1つだけですか?


1
私に関しては、情報ウィンドウを1つだけ作成し、それを更新して(コンテンツなど)、開閉して、すべてを行うのが良いでしょう。しかし、私はこのアプローチが常に適用できるとは限らないと確信しています。
andrii

回答:


153

InfoWindowsにはclose()関数があります。最後に開いたウィンドウを追跡し、新しいウィンドウが作成されたら、そのウィンドウに対してclose関数を呼び出します。

このデモには、探している機能が含まれています。Maps API V3デモギャラリーで見つけました。


4
最後に開いたウィンドウのみを追跡するという提案に賛成。当たり前のように見えますが、人々はそれらのことを忘れています...
レミブルトン2012

1
まったく同じテクニックを使用しました。クリス、ありがとう。必要な情報を取得して取得するのではなく、InfoWindowオブジェクトの配列を使用しているためです。各InfoWindowには独自の更新情報があるため、この手法は非常に便利です。
InterfaceGuy

2
「このデモ」のリンクが壊れている
ブレンダンホワイティング

64

多くの情報ウィンドウを使用したこのための代替ソリューション:前に開いた情報ウィンドウを変数に保存し、新しいウィンドウが開いたら閉じます

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
このように。理解と実装が簡単
Aamir Afridi 14

6
私の世間知らずを許しますが、WTFはベースですか?
wordsforthewise

それがGoogleマップV3のデフォルトの動作ではない理由がわかりません...
ワシントン氏

これまでに見つけた最善かつ最も簡単なソリューション。ありがとうございました!
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
    }
);

これにより、情報ウィンドウがクリックされた各マーカーに「移動」し、実際にはそれ自体が閉じてから、新しい場所で再び開きます(およびビューポートに合わせてパンします)。開く前に内容を変更して、目的の効果を与えます。n個のマーカーで機能します。


1
クイックノート:infowindow.open()を繰り返し呼び出すだけで十分です。最初にウィンドウを閉じる必要はありません。
Eric Nguyen

3
@Eric、技術的には正しいですが、情報ウィンドウが最後の位置に表示されることがあるバグに気づきました。強制的に最初にクローズすると、バグは敗北した。
Joel Mellon、

22

私の解決策。

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
これは非常にエレガントです。単一の情報ウィンドウを使用してコンテンツを変更するだけで、前の情報ウィンドウを追跡したり閉じたりする必要がなくなります。
ニックF

このソリューションは非常にエレガントで、魅力のように機能します。+1
セバスチャンブライト

9

このリンクからhttp://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/

Teo:これを行う最も簡単な方法は、何度も再利用するInfoWindowオブジェクトのインスタンスを1つだけ持つことです。そうすることで、新しいマーカーをクリックすると、infoWindowが現在の位置から「移動」して、新しいマーカーをポイントします。

そのsetContentメソッドを使用して、正しいコンテンツをロードします。


私はGoogle Maps v3 APIを使用しているため、これが当てはまるとは思いません
Ted

さらに、リンクした記事も1つのマーカーしかデモしません
Ted

複数のサイトで同じ方法で単一の情報ウィンドウを使用しました。1つをクリックすると、開いているものが自動的に閉じます。
キースアドラー

4
複数のマークを1つのInfoWindowに関連付けるにはどうすればよいですか?
2010

7

アクティブウィンドウの変数を宣言する

var activeInfoWindow; 

このコードをマーカーリスナーにバインドします

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

おかげで、マップ上のどこかをクリックしたときに本当に機能します。
Varinder Singh Baidwan、

乾杯おい、すべての提案のうち、これは私にとって最もうまくいき、きれいなAFです。
マシューエリス

4

close()関数を使用する以外に、もっと簡単な方法があります。InfoWindowプロパティを使用して変数を作成すると、別の変数を開いたときに自動的に閉じます。

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

おかげで、マーカーをクリックしなかったときに情報ウィンドウを閉じる必要があったので、マップ上で
VRC

1

どのように-

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

    });

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

    });

次に、その上にマウスを置くと、自動的に閉じます。


これは興味深い回避策ですが、質問には答えず、タッチ専用デバイスでは機能しません。
リー

1

現在開いている情報ウィンドウを追跡するために、変数を上部に格納しました。以下を参照してください。

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

ここで[カウンター]は何をしていますか?
リー

0

forループ(Djangoはこちら)で多くのマーカーを使用している場合は、次のように使用します。各マーカーにインデックスを設定し、ウィンドウを開くたびにそのインデックスを設定できます。以前に保存したインデックスを閉じる:

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);
}));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.