Google지도 : InfoWindows를 자동으로 닫으시겠습니까?


108

내 사이트 에서 Google Maps API v3를 사용하여지도에 집 마커를 배치하고 있습니다.

닫기 아이콘을 명시 적으로 클릭하지 않는 한 InfoWindows는 열려 있습니다. 즉,지도 표시 위로 마우스를 가져 가면 한 번에 2 개 이상의 InfoWindows를 열 수 있습니다.

질문 : 현재 활성화 된 InfoWindow 만 열리고 다른 모든 InfoWindows는 닫히도록하려면 어떻게해야합니까? 한 번에 하나 이상의 InfoWindow가 열리지 않습니까?


1
저에 관해서는 그냥 만드는 것이 좋습니다 하나 , 정보창을과 (그것의 내용 등)를 업데이트 개폐와 eveything. 그러나 저는이 접근 방식이 항상 적용 가능한 것은 아니라고 확신합니다.
andrii

답변:


154

close ()를 정보창을위한 기능. 마지막으로 열린 창을 추적하고 새 창이 생성되면 닫기 기능을 호출하십시오.

이 데모 에는 원하는 기능이 있습니다. Maps API V3 데모 갤러리 에서 찾았습니다 .


4
마지막으로 열린 창만 추적하라는 제안에 찬성했습니다. 생각할 필요도없는 것 같은데,하지만 사람들은 ... 그 일을 잊지
레미 브르타뉴어에게

1
방금 똑같은 기술을 사용했습니다. 고마워 크리스. 나는 순환하고 관련 정보를 얻는 하나가 아닌 InfoWindow 객체의 배열을 사용하고 있기 때문에 필요했습니다. 각 InfoWindow에는 개별적으로 업데이트되는 정보가 있으므로이 기술이 매우 유용하다는 것을 알았습니다.
InterfaceGuy

2
은 "데모"링크가 깨진
브렌단 화이팅을

대단히 감사합니다! 이 접근 방식을 사용했고 매력처럼 작동했습니다. 당신은 내 하루를 정했습니다. 찬성.
Alan Espinet

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 2014-04-08

6
내 순진함을 용서하지만 WTF는 기본입니까?
wordsforthewise

이 ... 구글 맵 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
정말 우아합니다. 단일 정보 창만 사용하고 콘텐츠를 변경하면 이전 창을 추적 / 닫을 필요가 없습니다.
Nick F

이 솔루션은 실제로 매우 우아하고 매력처럼 작동합니다. +1
Sebastian Breit 2016 년

9

이 링크에서 http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/ :

Teo :이 작업을 수행하는 가장 쉬운 방법은 반복해서 재사용하는 InfoWindow 개체의 인스턴스를 하나만 갖는 것입니다. 이렇게하면 새 마커를 클릭하면 infoWindow가 현재있는 위치에서 새 마커를 가리 키도록 "이동"됩니다.

setContent 메소드를 사용하여 올바른 컨텐츠로로드하십시오.


Google Maps v3 API를 사용하고 있기 때문에 이것이 적용되지 않는다고 생각합니다
Ted

또한 링크 한 기사도 하나 이상의 마커를 시연하지 않습니다
Ted

여러 사이트에 대해 동일한 방식으로 단일 정보 창을 사용했습니다. 하나를 클릭하면 열린 것이 자동으로 닫힙니다.
Keith Adler

4
여러 마크를 하나의 InfoWindow에 어떻게 연결합니까?
Ted

7

활성 창에 대한 변수 선언

var activeInfoWindow; 

이 코드를 마커 리스너에 바인딩합니다.

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

감사합니다.지도의 아무 곳이나 클릭 할 때 정말 효과적입니다.
Varinder Singh Baidwan

건배 친구, 모든 제안 중에서 이것은 나에게 가장 적합했으며 깨끗한 AF입니다.
Matthew Ellis

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

    });

그런 다음 마우스를 가져 가면 자동으로 닫힙니다.


이것은 흥미로운 해결 방법이지만 질문에 대답하지 않으며 터치 전용 장치에서는 작동하지 않습니다.
Lee

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

여기서 [카운터]는 무엇을하고 있습니까?
Lee

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.