Alex Franco

Blog de Alex Franco, aquí podrás encontrar temas de tecnología, desarrollo web y móvil, Python, Django, Mongo, DBs y… otros temas más
Home  /  Codigo  /  Mostrar sólo un InfoWindow y cerrarlo automáticamente GMaps API v3

Mostrar sólo un InfoWindow y cerrarlo automáticamente GMaps API v3

Alex Franco API, GMaps, InfoWindow, Marcadores, Marker, Trucos 22 Comments

Si no tienes mucha experiencia o tienes dudas con respecto a algo que usemos en este post, puedes consultar los demás ejemplos que se han realizado anteriormente aquí.

En algunas ocasiones existe la necesidad de tener varios marcadores dentro de un mapa, cada uno de ellos con un Listener que está a la espera de que en cuanto hagamos ‘click’ en ellos, despliegue una InfoWindow que le hayamos asignado, pero, existe una desventaja (o ventaja depende del punto de vista) en la API v3 de GMaps, en comparación a la API v2 de GMaps, ésta es que al tener cada marcador con una ventana de información asignada, al momento de hacer click en un marcador se abre, pero si hacemos click en cualquier otro lugar del mapa (que no sea la ‘X’) no se cierra.

Lo que vamos a realizar es un cierre “automático”, esto quiere decir que al tener una InfoWindow abierta y hacer click en cualquier otro lado del mapa, se cierre en automático la ventana abierta en ese momento, de esta manera, siempre quedaría solamente una o ninguna InfoWindow en el mapa, librándonos de tener que estar cerrando manualmente cada una de las ventanas que aparezcan.

Ver Demo Single InfoWindow

En la v2 de la API de GMaps se hacía así:

// Listener para generar y gestionar el InfoWindow
// marker es un objeto tipo Marker
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml("mensaje que quisieras que apareciera");
	});

Con eso era suficiente para que apareciera y desapareciera cuando perdiera el ‘foco‘, ahora para la v3 de la API de GMaps se crearon funciones para abrir (.open()) y cerrar (.close()) la InfoWindow, esto significo tener que especificar un evento para la apertura o cierre de la ventana. Esto no es problema, aunque la situación principal radica cuando tienes muchos marcadores, hacer esto para cada uno de ellos.

Solo es un poco de usar y re-usar funciones para facilitarnos la vida. Vamos a crear 2 variables globales una para el mapa y otra para una única instancia del InfoWindow, no es necesario crear más, con ella podremos crear tantas ventanas como nosotros queramos, por el momento no se les asignará el tipo de objeto, así que quedarán como null.

	var map = null;
	var infoWindow = null;

Vamos a crear dos funciones que son las que van a hacer el ejercicio de abrir y cerrar la ventana, para el ejercicio se requerirá que se declaren como sigue. La función para cerrar no recibirá ningún parámetro, simplemente ejecutará el proceso de cerrar del objeto InfoWindow. La función para abrir, recibirá 2 parámetros, el primero tendrá que ser un objeto tipo Marker y el segundo un String (cadena de caracteres); el marcador previamente debe ser creado con los parámetros mínimos para su uso, es decir su posición y en qué mapa se dibujará; el string será para asignarle el contenido específico del marcador en cuestión, igual si así lo deseas, puedes agregar contenido general.

	function closeInfoWindow() {
		infoWindow.close();
	}

	function openInfoWindow(marker, content) {
		var markerLatLng = marker.getPosition();
		infoWindow.setContent([
			'<div style="text-align:center;">',
			'Las coordenadas del <b>',
			content,
			'</b> son:<br/>',
			markerLatLng.lat(),
			', ',
			markerLatLng.lng(),
			'<br/><br/>Arr&aacute;strame y haz click para actualizar la posici&oacute;n.',
			'<br/>O puedes hacer click en cualquier otro lado para cerrarme.',
			'</div>'
		].join(''));
		infoWindow.open(map, marker);
	}

Antes de llegar al código completo, vamos a tener en cuenta una pequeña instrucción, un listener que se le va a agregar al mapa, que es el que va a hacer que al momento de hacer click en cualquier parte del mapa que no sea la el infoWindow, lo cierre, independientemente de cuál sea el que esté abierto.

		google.maps.event.addListener(map, 'click', function(){
			closeInfoWindow();
		});

Finalmente la función que se encargará de echar todo a andar, crear los marcadores y asignarles su Listener, indicar el objeto correspondiente a las variables del Map y del InfoWindow, todo este código ya lo hemos visto, así que todo el código quedaría así

var map = null;
	var infoWindow = null;

	function closeInfoWindow() {
		infoWindow.close();
	}

	function openInfoWindow(marker, content) {
		var markerLatLng = marker.getPosition();
		infoWindow.setContent([
			'<div style="text-align:center;">',
			'Las coordenadas del <b>',
			content,
			'</b> son:<br/>',
			markerLatLng.lat(),
			', ',
			markerLatLng.lng(),
			'<br/><br/>Arr&aacute;strame y haz click para actualizar la posici&oacute;n.',
			'<br/>O puedes hacer click en cualquier otro lado para cerrarme.',
			'</div>'
		].join(''));
		infoWindow.open(map, marker);
	}

	function initialize() {
		var myLatlng = new google.maps.LatLng(20.68017,-101.35437);
		var myOptions = {
		  zoom: 13,
		  center: myLatlng,
		  mapTypeId: google.maps.MapTypeId.ROADMAP
		}

		map = new google.maps.Map($("#map_canvas").get(0), myOptions);

		infoWindow = new google.maps.InfoWindow();

		google.maps.event.addListener(map, 'click', function(){
			closeInfoWindow();
		});

		var marker1 = new google.maps.Marker({
		    position: myLatlng,
		    draggable: true,
		    map: map
		});

		google.maps.event.addListener(marker1, 'click', function(){
			openInfoWindow(marker1, "Marcador 1");
		});

		var marker2 = new google.maps.Marker({
			map: map,
			position: new google.maps.LatLng(20.66057, -101.37325),
			draggable: true
		});

		google.maps.event.addListener(marker2, 'click', function() {
			openInfoWindow(marker2, "Marcador 2");
		});

		var marker3 = new google.maps.Marker({
			map: map,
			position: new google.maps.LatLng(20.67133, -101.32999),
			draggable: true
		});

		google.maps.event.addListener(marker3, 'click', function() {
			openInfoWindow(marker3, "Marcador 3");
		});
	}

	$(document).ready(function() {
	    initialize();
	});

Ver Demo Single InfoWindow

Listo, ahora puedes traspolar este método a algo más dinámico como la consulta de APIs con Geolocalización por ejemplo… prueba, disfruta y practica… si tienes dudas, ya sabes dónde preguntarme :-D.

Enjoy this Life!!

Relacionado

About Author

Alex Franco

 IT

Previous Article Marcador arrastrable y cómo obtener su Lat/Lng GMaps API v3
Next Article YouTube Instant

Related Posts

  • Enviar correo personalizado automáticamente cuando respondan un Formulario de Google

    Enviar correo personalizado automáticamente cuando respondan un Formulario de Google

  • Django + AllAuth + Google OAuth 2.0

    Django + AllAuth + Google OAuth 2.0

  • Agregar número consecutivo y enviar correo al contestar Formulario de Google Drive

22 Comments

  1. Mariela Reply
    2011-01-21 at 11:13 pm

    Tienen algún DEMO de InfoWindow con pestañas en GMaps API v3 ???

    • Alex Franco Reply
      2011-01-26 at 6:34 am

      @mariela Las pestañas tienes que hacerlas tú, para eso puedes usar jQuery, dentro del infowindow puedes poner lo que quieras, como si fuera otra página, saludos!!

  2. Nancy Isabel Reply
    2011-01-28 at 12:32 am

    Hola, oye, tengo una duda, estoy usando yo la versión map_flex_1_20.swc, es esta la versión 3 del API?? lo que pasa que cuando pongo google.maps.InfoWindow() me dice que “google” no lo encuentra, por lo tanto el objeto InfoWindow no lo encuentra y lo único que tengo disponible es un InfoWindowOptions() mediante com.google.maps.InfoWindowOptions()

    Porfas, dime que estoy haciendo mal o como lo puedo hacer
    =) muchas gracias

    • Nancy Isabel Reply
      2011-01-28 at 12:42 am

      Creo que ya vi mi error, tu manejas JS y yo flex :p y creo son versiones diferentes

      • Alex Franco
        2011-01-28 at 2:35 am

        @Nancy Así es, creo que fue un pequeño detalle que se me pasó colocar en el título, de ser así debes usar la API de Flash (si es Flex de Adobe verdad??) te dejo la liga API para Flash, aunque estuve leyendo un poco y la manera de llamar el infowindow es la misma, solamente que no hay que crear el objeto.

  3. ramon Reply
    2011-02-15 at 1:18 pm

    Gracias men.
    Pues solo habia encontrado ejemplos para la api v2.
    Buen tutorial.

  4. david Reply
    2011-04-11 at 6:10 pm

    Hola, tengo un problema, se puede crear un array de “markers” y un array de “infowindows”, cada uno con su zIndex que lo referencie, o para cada marker tengo que tener una variable ya declarada unica y exclusiva de ese marker? no se si me explico.

    El tema esta en que quiero posicionar en un mapa 10 markers k me llegan en este formato:

    var sitios = [[‘El Taberno’,39.4714655, -0.34773289,1, ‘Plaza del cedro’, ‘1’],[‘TestGroupPublic’,39.4794655, -0.34503289,2, ‘FALTA ESTO’, ”],]

    Entonces, mi funcion recorre este array y debe mostrar un marcador por cada uno. el problema es que hago un ‘for’, recorro todos los valores, y para cada valor me creo un nuevo infowindow con su texto, y un nuevo marker con sus atributos… pero al acabar el bucle, me pone en todos los marcadores, el ultimo infowindow que se ha creado.

    Si se te ocurre algo, seria de gran ayuda.

    un saludo y gracias.

  5. david Reply
    2011-04-11 at 7:43 pm

    Me corrijo, si se puede crear un array de markers.
    Os paso el codigo:

    function setMarkers(locations)
    {
    var marker = [];
    var infoR = [];

    for (var i = 0; i < locations.length; i++)
    {
    var beach = locations[i];
    var contenidoInfo = "LO QUE SEA”;

    infoR[i] = new google.maps.InfoWindow({
    content: contenidoInfo });

    marker[i] = new google.maps.Marker({
    position: myLatLng,
    map: map,
    title: beach[0],
    zIndex: beach[3]
    });

    markersArray.push(marker[i]);

    //esto NO lo hace bien.(No saca la ventana)
    google.maps.event.addListener(marker[i], ‘click’, function() {
    infoR[i].open(map, marker[i]);
    });
    }

    Ahora, no saca ningun infoWindow.

    Alguna solucion? Creo que esta todo el codigo…el formato de los datos que le llegan a la funcion, esta en el post de arriba.

    Gracias

    • Alex Franco Reply
      2011-04-11 at 9:08 pm

      @david primero, no es necesario crear un arreglo de infowindows, con una sola instancia es suficiente, prueba haciéndolo así, además, en esta parte:

      google.maps.event.addListener(marker[i], ‘click’, function() {
      infoR[i].open(map, marker[i]);
      });

      En la función .open debe ser algo como infowindow.open(MapaDondeSeMostrara, “Contenido del infowindow”); ya que lo de marker[i] haces referencia a un objeto y no a un contenido. Espero sea eso, pruébalo y ya nos cuentas que tal te fue! Saludos…

      • david
        2011-04-14 at 5:16 pm

        ok, eso es cierto. ahora tengo el problema que no me muestra ningun infowindow en los markers que posiciono en el mapa.

        CODE:

        for (var i = 0; i < locations.length; i++)
        {
        var beach = locations[i];
        var myLatLng = new google.maps.LatLng(beach[1], beach[2]);//lat, long
        var image = new google.maps.MarkerImage('./images/iconos/'+beach[3]+'.png',
        new google.maps.Size(30, 32),
        new google.maps.Point(0,0),
        new google.maps.Point(0, 38));

        var contenidoInfo = "”+beach[0] +””+beach[4]+”-“+beach[5]+””;

        infoR = new google.maps.InfoWindow({ content: contenidoInfo });

        marker[i] = new google.maps.Marker({
        position: myLatLng,
        map: map,
        icon: image,
        title: beach[0],
        zIndex: beach[3]
        });

        markersArray.push(marker[i]);

        google.maps.event.addListener(marker[i], ‘click’, function() {
        infoR.open(map, content);
        });
        }//cierre del FOR

        el fallo esta en la ultima instruccion del addListener()…seguro…

        Gracias, un saludo

      • g0nx
        2012-12-17 at 7:08 am

        Habéis conseguido solucionar esto. Yo tengo el mismo problema y utilizando el método expuesto por David, solo me muestra el último infowindow creado.

        En cuanto a tu respuesta Alex, creo que no es posible pasarle el contenido del infowindow a la función open, ya que esta espera un objeto map y un objeto marker.

        Alguna otra idea?

        Muchas gracias y un saludo

      • Alex Franco
        2013-04-16 at 2:43 pm

        Oops! disculpen la tardanza pero cierto… el infowindow.open recibe un mapa y un marcador, para asignar un contenido es infowindow.setContent(“contenido”), esto debe ser inmediatamente antes de llamar el infowindow.open(map, marker[i])

        Disculpen mi error =P

  6. Keiner Reply
    2012-02-16 at 12:53 pm

    Hey men gracias por tu post me sirvió para resolver un problema giganteeee que tenia con mi mapa en mi web… si quieres ver como quedó el resultado ve a http://www.sincelejo.isgreat.org/_Geo/_Places/Advertise/Sincelejo/otro.php

    • Alex Franco Reply
      2012-02-16 at 4:05 pm

      @Keiner uhhh nice, pero, algo no anda bien, porque al hacer click en cualquier otro lado, no se cierran los infowindow =S

  7. Chilo Reply
    2012-03-27 at 10:56 am

    Estimado amigo,,estoy trabajando con Php Mysql y el Api v3, no me funciona el cierre del infowindows.
    Tienes algún ejemplo, recojo los puntos de una consulta de mi base de datos.

    Muchas gracias!

    • Alex Franco Reply
      2012-03-27 at 11:14 am

      @Chilo Ahmmm pues este es el ejemplo, simplemente sustituyes los marcadores fijos por los que te traes de tu BD, puedes usar AJAX o hacer una llamada antes de cargar la página para traerte la información.

  8. Chilo Reply
    2012-03-28 at 8:02 am

    Gracias Alex, los puntos me los muestra muy bien, simplemente tengo problemas con el cierre, algo debo tener mal.
    Lo veré, de todas formas te felicito por el muy buen ejemplo, muchas gracias!

    Ch

  9. Adela Reply
    2012-05-30 at 11:21 am

    Hola como estas.. mira tengo mis infowindows cargan normal por cada poligono que tengo,pero quiero que mi infowindows cargue desde unaconsulta de base de datos desde mi javascript como puedo hacerlo?

    • Alex Franco Reply
      2012-08-06 at 10:05 am

      @Adela cómo desde una consulta? te refieres a hacer primero la consulta y que cargue en los infowindows o hacer la consulta en el momento de dat click?
      En el primer caso es colocar la info en un JSON o un XML y consultarlo con JS, del otro modo, es hacer la consulta con AJAX y manejar los datos con JS, depende de cómo lo quieras hacer.

  10. benjas Reply
    2014-10-10 at 10:22 am

    hola q tal yo kisiera saber como poder insertarle a un infowindow un boton q me lance a un formulario para capturar datos

    • Alex Franco Reply
      2014-11-24 at 12:47 pm

      Pues si, si puedes, eso es javascript, que al momento de que detecte el click en el botón lance el formulario, o incluso puedes insertar el formulario en el infowindow, es HTML.

  11. Pingback: Mostrar sólo un InfoWindow y cerrarlo automáticamente GMaps API v3 by Alex Franco « www.coudlain.com

Responder a AdelaCancelar respuesta

Posts populares

  • Geocode Simple: Buscar direcciones (coordenadas a partir de direcciones) con GMaps API v3
  • Buscar y trazar rutas con GMaps API v3
  • Recuperar o ver las claves de las redes inalámbricas en tu Mac (o cualquier App)
  • Enviar correo después de contestar Formulario de Google Drive automáticamente

Suscríbete

Suscríbirme!

Quizá te interese

  • Mostrar sólo un InfoWindow y cerrarlo automáticamente GMaps API v3
  • 3er Destilando Web Guanajuato
  • Django + AllAuth + Google OAuth 2.0
  • Combinar Correspondencia con Google Drive y GMail
Alex Franco 2009 - 2023