私のサイトでは、Google Maps API v3を使用して、家のマーカーを地図に配置しています。
閉じるアイコンを明示的にクリックしない限り、情報ウィンドウは開いたままになります。つまり、マップマーカーにカーソルを合わせると、一度に2つ以上の情報ウィンドウを開くことができます。
質問:現在アクティブなInfoWindowのみが開かれ、他のすべてのInfoWindowが閉じられるようにするにはどうすればよいですか?つまり、一度に開くことができるInfoWindowは1つだけですか?
私のサイトでは、Google Maps API v3を使用して、家のマーカーを地図に配置しています。
閉じるアイコンを明示的にクリックしない限り、情報ウィンドウは開いたままになります。つまり、マップマーカーにカーソルを合わせると、一度に2つ以上の情報ウィンドウを開くことができます。
質問:現在アクティブなInfoWindowのみが開かれ、他のすべてのInfoWindowが閉じられるようにするにはどうすればよいですか?つまり、一度に開くことができるInfoWindowは1つだけですか?
回答:
InfoWindowsにはclose()関数があります。最後に開いたウィンドウを追跡し、新しいウィンドウが作成されたら、そのウィンドウに対してclose関数を呼び出します。
このデモには、探している機能が含まれています。Maps API V3デモギャラリーで見つけました。
多くの情報ウィンドウを使用したこのための代替ソリューション:前に開いた情報ウィンドウを変数に保存し、新しいウィンドウが開いたら閉じます
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);
});
}
//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個のマーカーで機能します。
私の解決策。
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);
});
このリンクからhttp://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/:
Teo:これを行う最も簡単な方法は、何度も再利用するInfoWindowオブジェクトのインスタンスを1つだけ持つことです。そうすることで、新しいマーカーをクリックすると、infoWindowが現在の位置から「移動」して、新しいマーカーをポイントします。
そのsetContentメソッドを使用して、正しいコンテンツをロードします。
アクティブウィンドウの変数を宣言する
var activeInfoWindow;
このコードをマーカーリスナーにバインドします
marker.addListener('click', function () {
if (activeInfoWindow) { activeInfoWindow.close();}
infowindow.open(map, marker);
activeInfoWindow = infowindow;
});
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);
});
}
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();
};
...
}
}
どのように-
google.maps.event.addListener(yourMarker, 'mouseover', function () {
yourInfoWindow.open(yourMap, yourMarker);
});
google.maps.event.addListener(yourMarker, 'mouseout', function () {
yourInfoWindow.open(yourMap, yourMarker);
});
次に、その上にマウスを置くと、自動的に閉じます。
現在開いている情報ウィンドウを追跡するために、変数を上部に格納しました。以下を参照してください。
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;
});
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 %}