Google Maps: Tự động đóng InfoWindows đang mở?


108

Trên trang web của mình , tôi đang sử dụng Google Maps API v3 để đặt các điểm đánh dấu nhà trên bản đồ.

InfoWindows vẫn mở trừ khi bạn nhấp vào biểu tượng đóng. Có nghĩa là, bạn có thể mở hơn 2 InfoWindows cùng một lúc nếu bạn di chuột qua điểm đánh dấu bản đồ.

Câu hỏi : Tôi làm cách nào để chỉ InfoWindow đang hoạt động hiện tại được mở và tất cả các InfoWindow khác đều bị đóng? Có nghĩa là, không quá 1 InfoWindow sẽ được mở cùng một lúc?


1
Đối với tôi, tốt hơn là chỉ tạo một infowindow và cập nhật nó (đó là nội dung và v.v.), mở và đóng và chuyển tải mọi thứ. Nhưng tôi chắc chắn rằng cách tiếp cận này không phải lúc nào cũng áp dụng được.
andrii

Câu trả lời:


153

Có một hàm close () cho InfoWindows. Chỉ cần theo dõi cửa sổ được mở gần đây nhất và gọi hàm đóng trên cửa sổ đó khi một cửa sổ mới được tạo.

Bản demo này có chức năng mà bạn đang tìm kiếm. Tôi tìm thấy nó trong thư viện demo API V3 của Maps .


4
Đã ủng hộ đề xuất chỉ theo dõi cửa sổ được mở gần đây nhất. Trông giống như không có trí tuệ, nhưng người ta quên những điều ...
Rémi Breton

1
Tôi vừa mới sử dụng cùng một kỹ thuật. Cảm ơn Chris. Nó là cần thiết đối với tôi, vì tôi đang sử dụng một mảng các đối tượng InfoWindow thay vì chỉ một đối tượng xoay vòng và lấy thông tin thích hợp. Mỗi InfoWindow có thông tin cập nhật riêng biệt, vì vậy tôi thấy kỹ thuật này khá hữu ích.
Giao

2
liên kết "bản trình diễn này" bị hỏng
Brendan Whiting

64

giải pháp thay thế cho điều này với việc sử dụng nhiều infowindows: lưu infowindow đã mở trước đó trong một biến và sau đó đóng nó khi cửa sổ mới mở ra

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
Giống như cái này. Đơn giản để hiểu và thực hiện
Aamir Afridi

6
Hãy tha thứ cho sự ngây thơ của tôi, nhưng WTF là cơ sở?
wordsforthewise

Tôi không hiểu tại sao nó không phải là hành vi mặc định trong Google maps V3 ...
Mr Washington

Giải pháp tốt nhất và đơn giản nhất mà tôi đã tìm thấy cho đến nay. cảm ơn bạn!
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
    }
);

Thao tác này sẽ "di chuyển" cửa sổ thông tin xung quanh đến từng điểm đánh dấu được nhấp, có hiệu lực là chính nó sẽ đóng lại, sau đó mở lại (và xoay để vừa với chế độ xem) ở vị trí mới của nó. Nó thay đổi nội dung của nó trước khi mở để mang lại hiệu quả mong muốn. Hoạt động cho n điểm đánh dấu.


1
Lưu ý nhanh: các cuộc gọi lặp lại đến infowindow.open () là đủ; trước tiên không cần đóng cửa sổ.
Eric Nguyễn

3
@Eric, trong khi bạn nói đúng về mặt kỹ thuật, tôi đã nhận thấy một lỗi đôi khi khiến các cửa sổ thông tin hiển thị ở vị trí cuối cùng của chúng. Buộc đóng những trận thua đầu tiên cho biết lỗi.
Joel Mellon

22

Giải pháp của tôi.

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
Điều đó thực sự thanh lịch - chỉ sử dụng một infowindow duy nhất và thay đổi nội dung sẽ tránh phải theo dõi / đóng thông tin trước đó.
Nick F

Giải pháp này thực sự rất thanh lịch và hoạt động như một sự quyến rũ. +1
Sebastian Breit

9

Từ liên kết này http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/ :

Teo: Cách dễ nhất để làm điều này là chỉ có một phiên bản của đối tượng InfoWindow mà bạn sử dụng lại nhiều lần. Theo cách đó, khi bạn nhấp vào một điểm đánh dấu mới, infoWindow sẽ được “di chuyển” từ vị trí hiện tại của nó để trỏ đến điểm đánh dấu mới.

Sử dụng phương thức setContent của nó để tải nó với nội dung chính xác.


Tôi không tin điều này áp dụng vì tôi đang sử dụng API Google Maps v3
Ted

Thêm vào đó, bài viết bạn đã liên kết cũng không giới thiệu nhiều hơn 1 điểm đánh dấu
Ted

Tôi đã sử dụng một infowindow duy nhất theo cùng một kiểu cho một số trang web. Nhấp vào một cái, cái đang mở sẽ tự động đóng lại.
Keith Adler

4
Làm cách nào để bạn kết hợp nhiều dấu với một InfoWindow?
Ted

7

Khai báo một biến cho cửa sổ đang hoạt động

var activeInfoWindow; 

và liên kết mã này trong trình nghe đánh dấu

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

Cảm ơn, Nó thực sự hoạt động khi nhấp vào bất kỳ đâu trên bản đồ.
Varinder Singh Baidwan

Chúc mừng anh bạn, trong số tất cả các đề xuất, điều này phù hợp nhất với tôi và là AF sạch.
Matthew Ellis

4

Có một cách dễ dàng hơn ngoài việc sử dụng hàm close (). nếu bạn tạo một biến với thuộc tính InfoWindow, nó sẽ tự động đóng khi bạn mở một biến khác.

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

Thanx, tôi cần đóng infowindow khi không nhấp vào điểm đánh dấu để chỉ trên bản đồ
VRC

1

Làm thế nào về -

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

    });

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

    });

Sau đó, bạn chỉ cần di chuột qua nó và nó sẽ tự đóng lại.


Đây là một cách giải quyết thú vị nhưng nó không trả lời được câu hỏi và sẽ không hoạt động trên các thiết bị chỉ cảm ứng.
Lee

1

Tôi đã lưu trữ một biến ở trên cùng để theo dõi cửa sổ thông tin nào hiện đang mở, xem bên dưới.

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

[Bộ đếm] đang làm gì ở đây?
Lee

0

Đây là những gì tôi đã sử dụng nếu bạn đang sử dụng nhiều điểm đánh dấu trong vòng lặp for (Django ở đây). Bạn có thể đặt chỉ mục trên mỗi điểm đánh dấu và đặt chỉ mục đó mỗi khi bạn mở cửa sổ. Đóng chỉ mục đã lưu trước đó:

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);
}));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.