style personalizar multiple infowindows google javascript google-maps-api-3

javascript - personalizar - Cierre todas las infowindows en Google Maps API v3



multiple infowindows google maps (10)

¡He pasado una hora con dolor de cabeza tratando de cerrar la ventana de información! Mi opción final (y funcional) ha sido cerrar la ventana de información con un SetTimeout (unos segundos) No es la mejor manera ... pero funciona con facilidad

marker.addListener(''click'', function() { infowindow.setContent(html); infowindow.open(map, this); setTimeout(function(){ infowindow.close(); },5000); });

Estoy ocupado con un script que hará un lienzo de google maps en mi sitio web, con múltiples marcadores. Quiero que cuando haga clic en un marcador, se abra una ventana de información. Lo he hecho, y el código está en este momento:

var latlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 8, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); function addMarker(map, address, title) { geocoder = new google.maps.Geocoder(); geocoder.geocode( { ''address'': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ position: results[0].geometry.location, map: map, title:title }); google.maps.event.addListener(marker, ''click'', function() { var infowindow = new google.maps.InfoWindow(); infowindow.setContent(''<strong>''+title + ''</strong><br />'' + address); infowindow.open(map, marker); }); } else { alert("Geocode was not successful for the following reason: " + status); } }); } addMarker(map, ''Address'', ''Title''); addMarker(map, ''Address'', ''Title'');

Esto funciona al 100%. Pero ahora quiero que cuando una ventana de información esté abierta y usted quiera abrir la segunda, la primera se cierre automáticamente. Pero no he encontrado una manera de hacer eso. infowindow.close (); no ayuda ¿Alguien tiene un ejemplo o una solución a este problema?


Cuando se trata de grupos de marcadores, este me funcionó.

var infowindow = null; google.maps.event.addListener(marker, "click", function () { if (infowindow) { infowindow.close(); } var markerMap = this.getMap(); infowindow = this.info; this.info.open(markerMap, this); });


Debería hacer clic en su mapa - $(''#map-selector'').click();


Declarar variables globales:

var mapOptions; var map; var infowindow; var marker; var contentString; var image;

intialize use el método addEvent del mapa:

google.maps.event.addListener(map, ''click'', function() { if (infowindow) { infowindow.close(); } });


Para bucles que crean infowindows dinámicamente, declare una variable global

var openwindow;

y luego en la llamada a la función addListener (que está dentro del ciclo):

google.maps.event.addListener(marker<?php echo $id; ?>, ''click'', function() { if(openwindow){ eval(openwindow).close(); } openwindow="myInfoWindow<?php echo $id; ?>"; myInfoWindow<?php echo $id; ?>.open(map, marker<?php echo $id; ?>); });


Te animo a probar el complemento goMap jQuery cuando goMap con Google Maps. Para este tipo de situación, puede configurar hideByClick en true al crear marcadores:

$(function() { $("#map").goMap({ markers: [{ latitude: 56.948813, longitude: 24.704004, html: { content: ''Click to marker'', popup:true } },{ latitude: 54.948813, longitude: 21.704004, html: ''Hello!'' }], hideByClick: true }); });

Este es solo un ejemplo, tiene muchas características para ofrecer, como marcadores de agrupación y manipulación de ventanas de información.


Tenía un bucle dinámico que creaba infowindows y marcadores en función de cuántos infowindows en el CMS, por lo que no quería crear un InfoWindow() en cada evento, hacer clic y atascarlo con las solicitudes, si es que alguna vez surgió . En cambio, traté de saber cuál infowindow variable de infowindow específica para cada instancia fuera de la cantidad establecida de ubicaciones que tenía, y luego solicité a Maps que las cerrara antes de que abriera la correcta.

Mi conjunto de ubicaciones se llamaba ubicaciones, por lo que el PHP que configuré antes de la inicialización de mapas para obtener mis nombres de variables de infowindow fue:

for($k = 0; $k < count($locations); $k++) { $infowindows[] = ''infowindow'' . $k; }

Luego, después de inicializar el mapa y demás, en el script tenía un bucle foreach PHP que creaba las ventanas de información dinámica usando un contador:

//...javascript map initilization <?php $i=0; foreach($locations as $location) { ..//get latitudes, longitude, image, etc... echo ''var mapMarker'' . $i . '' = new google.maps.Marker({ position: myLatLng'' . $i . '', map: map, icon: image });''; echo ''var contentString'' . $i . '' = "<h1>'' . $title[$i] . ''</h1><h2>'' . $address[$i] . ''</h2>'' . $content[$i] . ''";''; echo ''infowindow'' . $i . '' = new google.maps.InfoWindow({ ''; echo '' content: contentString'' . $i . '' });''; echo ''google.maps.event.addListener(mapMarker'' . $i . '', "click", function() { ''; foreach($infowindows as $window) { echo $window . ''.close();''; } echo ''infowindow'' . $i . ''.open(map,mapMarker''. $i . ''); });''; $i++; } ?> ...//continue with Maps script...

Entonces, el punto es que antes de llamar a todo el script del mapa, tenía una matriz con los nombres que sabía que iban a salir cuando se creó InfoWindow() , como infowindow0, infowindow1, infowindow2, etc...

Luego, en el evento click para cada marcador, el ciclo foreach pasa y dice cerrar todos antes de seguir con el siguiente paso para abrirlos. Resulta que se ve así:

google.maps.event.addListener(mapMarker0, "click", function() { infowindow0.close(); infowindow1.close(); infowindow2.close(); infowindow0.open(map,mapMarker0); }

Supongo que es una manera diferente de hacer las cosas ... pero espero que ayude a alguien.


Tengo algo como lo siguiente

function initMap() { //...create new map here var infowindow; $(''.business'').each(function(el){ //...get lat/lng var position = new google.maps.LatLng(lat, lng); var content = "contents go here"; var title = "titleText"; var openWindowFn; var closure = function(content, position){. openWindowFn = function() { if (infowindow) { infowindow.close(); } infowindow = new google.maps.InfoWindow({ position:position, content:content }); infowindow.open(map, marker); } }(content, position); var marker = new google.maps.Marker({ position:position, map:map, title:title. }); google.maps.event.addListener(marker, ''click'', openWindowFn); } }

Según entiendo, usar un cierre como ese permite capturar variables y sus valores en el momento de la declaración de la función, en lugar de depender de variables globales. Entonces, cuando se llama a openWindowFn más tarde, en el primer marcador, por ejemplo, el content y la variable de position tienen los valores que hicieron durante la primera iteración en la función each() .

No estoy seguro de cómo openWindowFn tiene infowindow en su alcance. Tampoco estoy seguro de estar haciendo las cosas bien, pero funciona, incluso con múltiples mapas en una página (cada mapa tiene una ventana abierta).

Si alguien tiene alguna idea, por favor comente.


Tengo una muestra de mi código que quizás pueda ayudar. Había establecido solo un objeto infowindow en alcance global. Luego use setContent () para establecer el contenido antes de mostrarlo.

let map; let infowindow; let dataArr = [ { pos:{lat: -34.397, lng: 150.644}, content: ''First marker'' }, { pos:{lat: -34.340, lng: 150.415}, content: ''Second marker'' } ]; function initMap() { map = new google.maps.Map(document.getElementById(''map''), { center: {lat: -34.397, lng: 150.644}, zoom: 8 }); // Set infowindow object to global varible infowindow = new google.maps.InfoWindow(); loadMarker(); } function loadMarker(){ dataArr.forEach((obj, i)=>{ let marker = new google.maps.Marker({ position: obj.pos, map: map }); marker.addListener(''click'', function() { infowindow.close() infowindow.setContent(`<div> ${obj.content} </div>`) infowindow.open(map, marker); }); }) }


infowindow es una variable local y la ventana no está disponible en el momento de close ()

var latlng = new google.maps.LatLng(-34.397, 150.644); var infowindow = null; ... google.maps.event.addListener(marker, ''click'', function() { if (infowindow) { infowindow.close(); } infowindow = new google.maps.InfoWindow(); ... }); ...