2012-03-14 18 views
8

Me estoy poniendo muy frustrado y espero que alguien aquí pueda ayudar. Tengo una aplicación de mapas donde hay varios marcadores en los mapas con información de Windows cuyo contenido se actualiza regularmente. Mi solución ha sido colocar los divs que entrarán en la ventana de información en el DOM en un contenedor oculto que puede ser actualizado por mi código de actualización en segundo plano. Luego utilizo una sola infoWindow y acaba de establecer el contenido al elemento DOM mediante consulta:Google Maps infowindow.setContent como un elemento DOM con jQuery parece que solo funciona una vez?

google.maps.event.addListener(marker, 'click', function(){ 
    infoWindow.setContent($(#"+id+"-window-content)[0]); 
    infoWindow.open(map, marker); 
} 

La cosa funciona muy bien ... una vez. Entonces no se abrirá nuevamente para ese fabricante. Me he dado cuenta de que si abro la ventana en un marcador (Marcador A), y luego lo cierro, y luego lo abro en otro fabricante (Marcador B), y luego regreso al Marcador A, la ventana aparecerá junto al Marcador A , pero con el contenido de Marker B.

¿Por qué mi secuencia de comandos no establece el contenido en el elemento DOM una segunda vez ... Es casi como si el selector jQuery está eliminando el elemento del DOM.

Saludos,

whiteatom


Hola de nuevo,

resulta que pueden haber respondido a mi propia pregunta cuando estaba tratando de explicar aquí.

Pasar un elemento DOM a la función setContent() parece eliminarlo del DOM y ponerlo en la ventana de información, por lo que la próxima vez que intente capturarlo, ya no estará allí. Mi solución fue agregar un clon() a la llamada jQuery y parece funcionar ahora.

google.maps.event.addListener(marker, 'click', function(){ 
    infoWindow.setContent($(#"+id+"-window-content).clone()[0]); 
    infoWindow.open(map, marker); 
} 

¿Alguien puede confirmar que esto es el comportamiento del setContent cuando se le pasa un elemento DOM? ¿Es esta la mejor manera de manejar esto?

Saludos,

whiteatom

Respuesta

6

Cuando cambia matriz de un elemento en el DOM, se ha desplazado el elemento, no se copian.

Así que podría suponer esta línea ...

infoWindow.setContent($(#"+id+"-window-content)[0]); 

eliminaría el elemento "# id-ventana de contenido" de su emplazamiento inicial.

Cuando se cierra la ventana de información, se descarta el elemento DOM en ella.

Así que cuando haces clic por segunda vez en un marcador, el elemento ya no existe.

Intenta clonar el elemento o suministrar una cadena HTML a la ventana de información.

Esperanza esto ayuda

+0

sí :) esto es exactamente lo que estaba viendo. Estoy clonando ahora. ¡Gracias! – whiteatom

+0

¡Me alegra que lo hayas solucionado! Happy mapping :) –

2

de hecho se hizo más complicado porque tenía pestañas (con jQuery Tools) en las ventanas de información y un clon (incluso con profunda copia de eventos y datos - clon (true, true)) dejase' Parece que quiero cargarlos ... las pestañas estaban muertas en la ventana de información.

Así que ..Estoy moviendo el div como estaba inicialmente y luego se mueve de nuevo hacia atrás antes de agregar el nuevo contenido infoWindow:

google.maps.event.addListener(marker, 'click', function(){ 
    infoWindow.close(); 
    if(typeof infoWindow.content == "object") 
     $("#info-window-container").append(infoWindow.getContent()); 
    infoWindow.setContent($(#"+id+"-window-content)[0]); 
    infoWindow.open(map, marker); 
} 

creo que esto también tiene la ventaja de permitir que mi script de actualización para actualizar sólo el # "+ ID + "div--window contenido y que incluso actualizar el infoWindow mientras abiertas :)

Gracias por su ayuda ...

+0

¡Gracias por compartir la solución final en base a mi respuesta! –

+0

Wow gracias, no esperaba que la llamada 'getContent()' después de 'infoWindow.close()' funcionaría. Esperaba que las cosas se eliminaran del DOM después de cerrar(). ¡Pero aparentemente funciona! – lulalala

+0

Sí ... la ventana de información contiene su contenido hasta que lo destruya o establezca nuevo contenido, suponiendo que se ha producido un error de prueba y error. – whiteatom

Cuestiones relacionadas