Google Maps APIv3で開いているInfoWindowを1つだけにします


85

Googleマップで開く必要があるインフォウィンドウは1つだけです。新しいInfoWindowsを開く前に、他のすべてのInfoWindowsを閉じる必要があります。

誰かがこれを行う方法を教えてもらえますか?


何を試しましたか?
IgniteCoders 2016年

回答:


151

InfoWindowオブジェクトを1つだけ作成し、そのオブジェクトへの参照を保持し、すべてのマーカーに再利用する必要があります。Google Maps APIドキュメントからの引用

(Googleマップでの動作のように)一度に1つの情報ウィンドウのみを表示する場合は、1つの情報ウィンドウを作成するだけで済み、マップイベント(ユーザーのクリックなど)時に別の場所またはマーカーに再割り当てできます。

したがって、InfoWindowマップを初期化した直後にオブジェクトを作成し、clickマーカーのイベントハンドラーを次のように処理することをお勧めします。あなたがというマーカーを持っているとしましょうsomeMarker

google.maps.event.addListener(someMarker, 'click', function() {
   infowindow.setContent('Hello World');
   infowindow.open(map, this);
});

次に、メソッドInfoWindowを呼び出さなくても、新しいマーカーをクリックすると、が自動的に閉じますclose()


私もこれを行いますが、infoWindowが次のマーカーで開くのに+1秒かかるのは正常ですか?まったく開かないこともあります。私はまったく同じコードを使用しています
MJB 2012

ダニエル、素晴らしいアイデア!その前は手動で同期しようとしていましたが、奇妙なjavascriptエラーが表示されます(main.jsの "c is null"など(123が範囲外43)など)。
ビクター

30

スコープ外に情報ウィンドウを作成して、共有できるようにします。

簡単な例を次に示します。

var markers = [AnArrayOfMarkers];
var infowindow = new google.maps.InfoWindow();

for (var i = 0, marker; marker = markers[i]; i++) {
  google.maps.event.addListener(marker, 'click', function(e) {
    infowindow.setContent('Marker position: ' + this.getPosition());
    infowindow.open(map, this);
  });
}

ありがとうございました。「これ」を使用すると、私の問題のほとんどが解決しました。setContent内でカスタムコンテンツを使用する方法をまだ理解していません。たとえば、マーカーループで、「i」変数を使用してcontentHtml変数を作成し、それをデータベースオブジェクトにリンクします。そのcontentHtml変数をリスナーに渡すにはどうすればよいですか?
ライアン

私の場合、ウィンドウはinfowindow.open(map、this);で「this」を使用した場合にのみ開きます。「マーカー」の代わりに。ソリューションを共有してくれてありがとう。
2012年

私もこれを行いますが、infoWindowが次のマーカーで開くのに+1秒かかるのは正常ですか?まったく開かないこともあります。私はまったく同じコードを使用しています
MJB 2012

14

私は同じ問題を抱えていましたが、最良の答えはそれを完全には解決しませんでした。私がforステートメントでしなければならなかったことは、現在のマーカーに関連するこれを使用することでした。多分これは誰かを助けます。

for(var i = 0; i < markers.length; i++){
    name = markers[i].getAttribute("name");
    address = markers[i].getAttribute("address");        
    point = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));                                     
    contentString = '<div style="font-family: Lucida Grande, Arial, sans-serif;>'+'<div><b>'+ name +'</b></div>'+'<div>'+ address +'</div>';                    
    marker = new google.maps.Marker({                       
        map: map,
        position: point,
        title: name+" "+address,
        buborek: contentString 
    });                                     
    google.maps.event.addListener(marker, 'click', function(){
        infowindow.setContent(this.buborek); 
        infowindow.open(map,this); 
    });                                                         
    marker.setMap(map);                 
}

2
contentStringを渡す方法は、私にとって役に立ちました、thx。
2012年

4

少し遅れましたが、makeninfowindowによってグローバル変数を開くことができたinfowindowは1つだけでした。

var infowindow = new google.maps.InfoWindow({});

その後、リスナーの内部

infowindow.close();
infowindow = new google.maps.InfoWindow({   
    content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered                           
});

infowindow.open(map, this);

1
私にとっては素晴らしい作品です:)
lumos 2015

4

globarvar selectedInfoWindow;を宣言し、それを使用して開いた情報ウィンドウを保持します。

var infoWindow = new google.maps.InfoWindow({
    content: content
});

// Open the infowindow on marker click
google.maps.event.addListener(marker, "click", function() {
    //Check if there some info window selected and if is opened then close it
    if (selectedInfoWindow != null && selectedInfoWindow.getMap() != null) {
        selectedInfoWindow.close();
        //If the clicked window is the selected window, deselect it and return
        if (selectedInfoWindow == infoWindow) {
            selectedInfoWindow = null;
            return;
        }
    }
    //If arrive here, that mean you should open the new info window 
    //because is different from the selected
    selectedInfoWindow = infoWindow;
    selectedInfoWindow.open(map, marker);
});

0

新しいマーカーでクリックイベントを処理するときは、以前のインフォウィンドウオブジェクト追跡し、そのオブジェクトcloseメソッドを呼び出す必要があります

注意:共有情報ウィンドウオブジェクトでcloseを呼び出す必要はありません。別のマーカーでopenを呼び出すと、元のオブジェクトが自動的に閉じられます。詳細については、ダニエルの回答を参照してください。


これは古い答えであり、v3 APIは当時はあいまいでした...しかしclose()、単一のInfoWindowオブジェクトが使用されている場合、実際にはメソッドを呼び出す必要はありません。open()同じオブジェクトでメソッドが再度呼び出されると、自動的に閉じます。
Daniel Vassallo 2010

@ daniel-vassalloメモをありがとう:)私はそれに応じてあなたの答えに賛成しました、それは私が思う最も有用です。
RedBlueThing 2010

0

基本的に、1つの関数への参照を保持する1つの関数が必要ですnew InfoBox()=> onclickイベントを委任します。マーカーを(ループで)作成している間、bindInfoBox(xhr, map, marker);

// @param(project): xhr : data for infoBox template
// @param(map): object : google.maps.map
// @param(marker): object : google.maps.marker
bindInfoBox: (function () {
    var options = $.extend({}, cfg.infoBoxOptions, { pixelOffset: new google.maps.Size(-450, -30) }),
        infoBox = new window.InfoBox(options);

    return function (project, map, marker) {
        var tpl = renderTemplate(project, cfg.infoBoxTpl); // similar to Mustache, Handlebars

        google.maps.event.addListener(marker, 'click', function () {
            infoBox.setContent(tpl);
            infoBox.open(map, marker);
        });
    };
}())

var infoBox非同期で割り当てられ、メモリに保持されます。呼び出すたびにbindInfoBox()、代わりにreturn関数が呼び出されます。infoBoxOptions一度だけ合格するのにも重宝します!

私の例でmapは、タブイベントによって初期化が遅れるため、にパラメータを追加する必要がありました。

InfoBoxOptions


0

これは、再利用するために1つのinfoWindowだけを作成する必要がないソリューションです。多くのinfoWindowsを作成し続けることができます。必要なのは、closeAllInfoWindows関数を作成し、新しいinfowindowを開く前にそれを呼び出すことだけです。したがって、コードを保持するには、次のことを行う必要があります。

  1. すべてのinfoWindowsを格納するグローバル配列を作成します

    var infoWindows = [];
    
  2. infoWindow = new ..の直後に、新しい各infoWindowを配列に格納します。

    infoWindows.push(infoWindow);
    
  3. closeAllInfoWindows関数を作成します

    function closeAllInfoWindows() {
        for (var i=0;i<infoWindows.length;i++) {
            infoWindows[i].close();
        }
    }
    
  4. コードで、infoWindowを開く直前にcloseAllInfoWindows()を呼び出します。

よろしく、


-1

このように解決しました:

function window(content){
    google.maps.event.addListener(marker,'click', (function(){
        infowindow.close();
        infowindow = new google.maps.InfoWindow({
            content: content
        });
        infowindow.open(map, this);
    }))
}
window(contentHtml);

-4

Googleマップでは、1つの情報ウィンドウのみを開くことができます。したがって、新しいウィンドウを開くと、もう一方のウィンドウは自動的に閉じます。


2
それは正しくありません、私は私の地図上で最大20の情報ウィンドウを開くことができます。それはv3ところでです。
レオ

さて、訂正してくれてありがとう。私はそれがバージョン3に変更されていた知らなかった
キンモPuputtiを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.