2013-01-15 32 views
5

Tôi có ứng dụng GoogleMaps APIv3 trong đó nhiều InfoWindows có thể mở cùng một lúc. Tôi muốn để có thể mang lại một InfoWindow che khuất đến mặt trước của tất cả các InfoWindows khác nếu bất kỳ phần nào của nó được nhấp vào - tương tự như hành vi của các cửa sổ trong MS Windows OS.Mang thông tin GoogleMapsWindow về phía trước

Tôi đã nghĩ thêm bộ xử lý sự kiện onclick làm tăng chỉ mục z của InfoWindow, nhưng trình xử lý sự kiện dường như không kích hoạt. ZIndex là một biến toàn cầu tiếp tục tăng khi InfoWindows được nhấp vào - hoặc đó là lý thuyết.

Có ai giúp được không? Đây là mã của tôi: -

var ZIndex=1; 
var iw = new google.maps.InfoWindow({ content:contentString }); 
google.maps.event.addListener(iw, 'click', handleInfoWindowClick(iw)); 

function handleInfoWindowClick(infoWindow) { 
    return function() { 
     infoWindow.setZIndex(ZIndex++); 
    } 
} 

Trả lời

5

không có sự kiện nhấp chuột nào cho infoWindow, khó hơn một chút.

  1. bạn sẽ cần phải sử dụng một phần tử (không phải là một chuỗi) như nội dung cho infowindow, bởi vì bạn cần một DOMListener thay vì một người biết lắng nghe cho infowindow-object
  2. khi domready-hỏa hoạn, bạn phải áp dụng nhấp DOMListener đến anchestor này nội dung nút đó xác định infowindow

Đoạn mã dưới đây sẽ làm việc này cho bạn, thêm video này vào trang của bạn:

google.maps.InfoWindowZ=function(opts){ 
      var GM = google.maps, 
       GE = GM.event, 
       iw = new GM.InfoWindow(), 
       ce; 

      if(!GM.InfoWindowZZ){ 
       GM.InfoWindowZZ=Number(GM.Marker.MAX_ZINDEX); 
      } 

      GE.addListener(iw,'content_changed',function(){ 
       if(typeof this.getContent()=='string'){ 
        var n=document.createElement('div'); 
         n.innerHTML=this.getContent(); 
         this.setContent(n); 
         return; 
       } 
       GE.addListener(this,'domready', 
           function(){ 
           var _this=this; 
           _this.setZIndex(++GM.InfoWindowZZ); 
           if(ce){ 
            GM.event.removeListener(ce); 
           } 
           ce=GE.addDomListener(this.getContent().parentNode 
                .parentNode.parentNode,'click', 
                function(){ 
                _this.setZIndex(++GM.InfoWindowZZ); 
           }); 
           }) 
      }); 

      if(opts)iw.setOptions(opts); 
      return iw; 
     } 

Thay vào đó trong số google.maps.InfoWindow() bạn phải gọi ngay bây giờ google.maps.InfoWindowZ()

Nó cũng trả về một InfoWindow chính hãng, nhưng với trình xử lý được đề cập được áp dụng cho nó. Nó cũng tạo ra các nút từ nội dung khi cần thiết.

Demo: http://jsfiddle.net/doktormolle/tRwnE/


phiên bản cập nhật cho visualRefresh (sử dụng mouseover thay vì nhấp chuột) http://jsfiddle.net/doktormolle/uuLBb/

+0

Brilliant! Cảm ơn điều đó thực hiện chính xác những gì tôi cần. Tuy nhiên, có một lỗi nhỏ trên dòng mã: - nếu (ce) { GM.event.removeListener (cc);// điều này nên được ce? Cảm ơn. – dachyon

+0

Có, nó phải là ce, cố định nó trong mã ở trên và trong fiddle. –

+0

Xin chào, tôi đang cố gắng giải pháp này nhưng tôi nhận được 'Uncaught TypeError: Không thể đặt thuộc tính 'InfoWindowZ' của undefined'. –

Các vấn đề liên quan