2013-01-15 38 views
5

Ho un'applicazione API di GoogleMaps in cui più finestre Info possono essere aperte in qualsiasi momento. Mi piacerebbe essere in grado di portare un InfoWindow oscurato nella parte anteriore di tutti gli altri InfoWindows se ne viene fatta una parte, simile al comportamento di Windows nel sistema operativo MS Windows.Porta GoogleMaps InfoWindow in primo piano

Avevo pensato di aggiungere un gestore di eventi onclick che aumenti lo z-index di InfoWindow, ma il gestore di eventi non sembra essere attivato. ZIndex è una variabile globale che continua ad aumentare quando si fa clic su InfoWindows, o comunque questa è la teoria.

Qualcuno può aiutare? Ecco il mio codice: -

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

risposta

5

non c'è click-evento per un infowindow, è un po 'più difficile.

  1. è necessario utilizzare un elemento (non una stringa) come contenuti per l'infowindow, perché avete bisogno di un DOMListener invece un listener per l'infowindow-oggetto
  2. quando domready fuochi, è necessario applicare il click-DOMListener alla avo di questo contenuto nodo che definisce l'infowindow

il codice seguente farà questo per voi, aggiungere questo alla tua pagina:

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

Invece di google.maps.InfoWindow() è necessario chiamare ora google.maps.InfoWindowZ()

Restituisce anche una vera finestra di informazioni, ma con il listener menzionato applicato ad esso. Crea anche il nodo dal contenuto quando necessario.

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


versione aggiornata per visualRefresh (usando mouseover invece di click) http://jsfiddle.net/doktormolle/uuLBb/

+0

Brilliant! Grazie, fa esattamente quello di cui avevo bisogno. Tuttavia, c'è un piccolo bug sulla riga di codice: - if (ce) { GM.event.removeListener (cc); // questo dovrebbe essere ce? Grazie. – dachyon

+0

Sì, dovrebbe essere ce, risolto nel codice sopra e nel violino. –

+0

Ciao, sto provando questa soluzione ma sto ottenendo 'Uncaught TypeError: Impossibile impostare la proprietà 'InfoWindowZ' di undefined'. –