2013-01-15 3 views
5

Mam aplikację GoogleMaps APIv3, w której wiele okien InfoWindows może być otwartych jednocześnie. Chciałbym móc przynieść ukrytą informację InfoWindow na wierzchu wszystkich innych okien InfoWindows, jeśli jakakolwiek jej część zostanie kliknięta - podobnie do zachowania systemu Windows w systemie MS Windows.Przynieś GoogleMaps InfoWindow do przodu

Myślałem, że dodam procedurę obsługi zdarzeń onclick, która zwiększa indeks Z InfoWindow, ale procedura obsługi zdarzeń nie wydaje się być uruchamiana. ZIndex jest zmienną globalną, która stale rośnie wraz z kliknięciami InfoWindows - lub taką jest teoria.

Czy ktoś może pomóc? Oto mój kod: -

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

Odpowiedz

5

nie ma click-event dla infoWindow, jest to trochę trudniejsze.

  1. trzeba użyć elementu (nie łańcuch) jak treści dla infowindow, bo trzeba DOMListener zamiast słuchacza do infowindow-Object
  2. gdy domready pożary, należy zastosować Click-DOMListener do anchestor tej zawartości-węzła, który definiuje infowindow

Poniższy kod zrobi to za Ciebie, dodać do swojej strony:

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

Zamiast google.maps.InfoWindow() musisz zadzwonić pod numer: google.maps.InfoWindowZ()

Powoduje to również powrót do oryginalnego okna InfoWindow, ale z aplikacją do niego podanym. W razie potrzeby tworzy także węzeł z treści.

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


Zaktualizowana wersja dla visualRefresh (przy użyciu mouseover zamiast kliknięcie) http://jsfiddle.net/doktormolle/uuLBb/

+0

Brilliant! Dzięki, że robi dokładnie to, czego potrzebowałem. Czy jest jednak mały błąd na linii kodu: - jeśli (ce) { GM.event.removeListener (cc); // to powinno być ce? Dzięki. – dachyon

+0

Tak, powinno to być ce, naprawione w kodzie powyżej i na skrzypcach. –

+0

Witam, próbuję tego rozwiązania, ale otrzymuję komunikat "Uncaught TypeError: Nie można ustawić właściwości" InfoWindowZ "z undefined'. –