API Google Maps v3 thông báo sự kiện đóng / gọi lại?


76

Tôi muốn theo dõi bất kỳ và tất cả các thông tin đang mở trên giao diện Google Maps của tôi (tôi lưu trữ tên của chúng trong một mảng), nhưng tôi không thể tìm ra cách xóa chúng khỏi mảng của mình khi chúng bị đóng qua dấu "x "ở góc trên bên phải của mỗi mục.

Có loại cuộc gọi lại nào mà tôi có thể lắng nghe không? Hoặc có thể tôi có thể làm một cái gì đó như thế addListener("close", infowindow1, etcnào?

Câu trả lời:


13

Giải pháp nhất quán duy nhất mà tôi đã tìm thấy ở đây là giữ lại một con trỏ đến infoWindowvà kiểm tra .getMap()phương thức của nó bất cứ khi nào bạn cần xác thực xem nó đã bị đóng hay chưa.

Lý do cho điều này là việc nhấp vào một phần tử khác có thể khiến infoWindow bị loại bỏ vì các lý do khác ... mà không closeclickkích hoạt sự kiện.

var infoWindow = new google.maps.InfoWindow({ content: 'Something to put here.' });
infoWindow.open(map, infoWindow);

setInterval(function ()
{
    console.log("infoWindow is bound to map: "+(infoWindow.getMap() ? true : false));

}, 1000);

... Nếu bạn chỉ quan tâm đến việc infoWindowđóng cửa bằng cách sử dụng nút "X" hay không, thì việc giám sát closeclicklà tốt. Tuy nhiên, có những lý do khác khiến nó có thể bị hoặc đã bị đóng cửa.


câu trả lời này sẽ có nhiều ủng hộ hơn. Nó cho biết thêm chi tiết và giải thích nó rõ ràng và ngắn gọn
bermick

172

có một sự kiện cho cuộc gọi thông closeclicktin có thể giúp bạn

var currentMark;
var infoWindow = new google.maps.InfoWindow({
            content: 'im an info windows'
        });
google.maps.event.addListener(marker, 'click', function () {
          infoWindow.open(map, this);
          currentMark = this;

});
google.maps.event.addListener(infoWindow,'closeclick',function(){
   currentMark.setMap(null); //removes the marker
   // then, remove the infowindows name from the array
});

3
Lưu ý rằng điều này không kích hoạt khi một điểm đánh dấu khác gần đó được nhấp vào và điểm đánh dấu đó tự động đóng lại ... chẳng hạn như khi cuộn diễn ra để đảm bảo cửa sổ thông tin nằm trong giới hạn hiển thị của bản đồ.
Ben Guild

1

Đơn giản hóa và mở rộng giải pháp được ủng hộ nhiều nhất , bạn có thể tạo điểm đánh dấu trong quá trình xử lý sự kiện nhấp chuột vào điểm đánh dấu, cho phép bạn đóng gói việc loại bỏ nó do closeclicksự kiện của biểu tượng x cùng một lúc.

Đây là một ví dụ bao gồm việc tránh tạo cửa sổ thông tin trùng lặp bằng cách thêm hasInfoWindowtrạng thái boolean trên các điểm đánh dấu.

  newMarker.addListener('click', function () {
    // If a marker does not yet have an info window, create and show it
    if (newMarker['hasInfoWindow'] !== true) {
      newInfoWindow = new google.maps.InfoWindow({content: infoContent}); 
      mapSet['infoWindowsObj'].push(newInfoWindow);
      newMarker['hasInfoWindow'] = true;
      newInfoWindow.open(mapSet, newMarker);

      // If info window is dismissed individually, fully remove object
      google.maps.event.addListener(newInfoWindow, 'closeclick', function () {
        newInfoWindow.setMap(null);
        newMarker['hasInfoWindow'] = false;
        mapSet['infoWindowsObj'].filter(arrayItem => arrayItem !== newInfoWindow);
      });
    }
  });

Sau đó, nếu bạn muốn xóa tất cả các cửa sổ thông tin đang mở do sự kiện nhấp chuột trên bản đồ, bạn có thể lặp lại nội dung của mapSet['infoWindowsObj']để xóa hoàn toàn từng cửa sổ.

Tôi tin rằng hành vi này cho phép bạn sử dụng infowindow trong hầu hết các trường hợp mà không cần phải thực hiện lại toàn bộ theo google ví dụ bật lên tùy chỉnh .


0

Thử cái này:

var closeBtn = $('.gm-style-iw').next();
closeBtn.click(function(){
    //other things you want to do when close btn is click
    that.infowindow.close();
});

Tôi ghi đè chức năng nhấp chuột này vì nút nhấp chuột sẽ không hoạt động trong safari sau khi tôi thay đổi css / vị trí của nó.

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.