Google Map API v3 ~ просто закрыть infowindow?
попытка просто закрыть infowindow?
У меня уже есть массив маркеров, так что что-то вроде этого было бы хорошо. Спасибо
MyMarkers[i].infowindow.close();
8 ответов:
С API для В3, вы можете легко закрыть
InfoWindow
СInfoWindow.close()
метод. Вам просто нужно сохранить ссылку наInfoWindow
объект, который вы используете. Рассмотрим следующий пример, который открываетInfoWindow
и закрывает ее через 5 секунд:<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> <title>Google Maps API InfoWindow Demo</title> <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script> </head> <body> <div id="map" style="width: 400px; height: 500px;"></div> <script type="text/javascript"> var map = new google.maps.Map(document.getElementById('map'), { zoom: 4, center: new google.maps.LatLng(-25.36388, 131.04492), mapTypeId: google.maps.MapTypeId.ROADMAP }); var marker = new google.maps.Marker({ position: map.getCenter(), map: map }); var infowindow = new google.maps.InfoWindow({ content: 'An InfoWindow' }); infowindow.open(map, marker); setTimeout(function () { infowindow.close(); }, 5000); </script> </body> </html>
если у вас есть отдельная
или вы можете совместно использовать / повторно использовать один и тот же объект infoWindow. Смотрите этот google демо Для справки.
тот же код из демо
var Demo = { map: null, infoWindow: null }; /** * Called when clicking anywhere on the map and closes the info window. */ Demo.closeInfoWindow = function() { Demo.infoWindow.close(); }; /** * Opens the shared info window, anchors it to the specified marker, and * displays the marker's position as its content. */ Demo.openInfoWindow = function(marker) { var markerLatLng = marker.getPosition(); Demo.infoWindow.setContent([ '<b>Marker position is:</b><br/>', markerLatLng.lat(), ', ', markerLatLng.lng() ].join('')); Demo.infoWindow.open(Demo.map, marker); }, /** * Called only once on initial page load to initialize the map. */ Demo.init = function() { // Create single instance of a Google Map. var centerLatLng = new google.maps.LatLng(37.789879, -122.390442); Demo.map = new google.maps.Map(document.getElementById('map-canvas'), { zoom: 13, center: centerLatLng, mapTypeId: google.maps.MapTypeId.ROADMAP }); // Create a single instance of the InfoWindow object which will be shared // by all Map objects to display information to the user. Demo.infoWindow = new google.maps.InfoWindow(); // Make the info window close when clicking anywhere on the map. google.maps.event.addListener(Demo.map, 'click', Demo.closeInfoWindow); // Add multiple markers in a few random locations around San Francisco. // First random marker var marker1 = new google.maps.Marker({ map: Demo.map, position: centerLatLng }); // Register event listeners to each marker to open a shared info // window displaying the marker's position when clicked or dragged. google.maps.event.addListener(marker1, 'click', function() { Demo.openInfoWindow(marker1); }); // Second random marker var marker2 = new google.maps.Marker({ map: Demo.map, position: new google.maps.LatLng(37.787814,-122.40764), draggable: true }); // Register event listeners to each marker to open a shared info // window displaying the marker's position when clicked or dragged. google.maps.event.addListener(marker2, 'click', function() { Demo.openInfoWindow(marker2); }); // Third random marker var marker3 = new google.maps.Marker({ map: Demo.map, position: new google.maps.LatLng(37.767568,-122.391665), draggable: true }); // Register event listeners to each marker to open a shared info // window displaying the marker's position when clicked or dragged. google.maps.event.addListener(marker3, 'click', function() { Demo.openInfoWindow(marker3); }); }
у меня была аналогичная проблема. Я просто добавил следующее в мой код:
closeInfoWindow = function() { infoWindow.close(); }; google.maps.event.addListener(map, 'click', closeInfoWindow);
полный код js (код выше составляет около 15 строк снизу):
jQuery(window).load(function() { if (jQuery("#map_canvas").length > 0){ googlemap(); } }); function googlemap() { jQuery('#map_canvas').css({'height': '400px'}); // Create the map // No need to specify zoom and center as we fit the map further down. var map = new google.maps.Map(document.getElementById("map_canvas"), { mapTypeId: google.maps.MapTypeId.ROADMAP, streetViewControl: false }); // Create the shared infowindow with two DIV placeholders // One for a text string, the other for the StreetView panorama. var content = document.createElement("div"); var title = document.createElement("div"); var boxText = document.createElement("div"); var myOptions = { content: boxText ,disableAutoPan: false ,maxWidth: 0 ,pixelOffset: new google.maps.Size(-117,-200) ,zIndex: null ,boxStyle: { background: "url('"+siteRoot+"images/house-icon-flat.png') no-repeat" ,opacity: 1 ,width: "236px" ,height: "300px" } ,closeBoxMargin: "10px 0px 2px 2px" ,closeBoxURL: "http://kdev.langley.com/wp-content/themes/langley/images/close.gif" ,infoBoxClearance: new google.maps.Size(1, 1) ,isHidden: false ,pane: "floatPane" ,enableEventPropagation: false }; var infoWindow = new InfoBox(myOptions); var MarkerImage = siteRoot+'images/house-web-marker.png'; // Create the markers for (index in markers) addMarker(markers[index]); function addMarker(data) { var marker = new google.maps.Marker({ position: new google.maps.LatLng(data.lat, data.lng), map: map, title: data.title, content: data.html, icon: MarkerImage }); google.maps.event.addListener(marker, "click", function() { infoWindow.open(map, this); title.innerHTML = marker.getTitle(); infoWindow.setContent(marker.content); infoWindow.open(map, marker); jQuery(".innerinfo").parent().css({'overflow':'hidden', 'margin-right':'10px'}); }); } // Zoom and center the map to fit the markers // This logic could be conbined with the marker creation. // Just keeping it separate for code clarity. var bounds = new google.maps.LatLngBounds(); for (index in markers) { var data = markers[index]; bounds.extend(new google.maps.LatLng(data.lat, data.lng)); } map.fitBounds(bounds); var origcent = new google.maps.LatLng(map.getCenter()); // Handle the DOM ready event to create the StreetView panorama // as it can only be created once the DIV inside the infowindow is loaded in the DOM. closeInfoWindow = function() { infoWindow.close(); }; google.maps.event.addListener(map, 'click', closeInfoWindow); google.maps.event.addListener(infoWindow, 'closeclick', function() { centermap(); }); function centermap() { map.setCenter(map.fitBounds(bounds)); } } jQuery(window).resize(function() { googlemap(); });
это тоже будет работать:
google.maps.event.addListener(marker, 'click', function() { if(!marker.open){ infowindow.open(map,marker); marker.open = true; } else{ infowindow.close(); marker.open = false; } });
который откроет infoWindow при нажатии на него, закройте его при нажатии на него, если он был открыт.
также увидев решение Логана, эти 2 можно объединить в следующее:
google.maps.event.addListener(marker, 'click', function() { if(!marker.open){ infowindow.open(map,marker); marker.open = true; } else{ infowindow.close(); marker.open = false; } google.maps.event.addListener(map, 'click', function() { infowindow.close(); marker.open = false; }); });
который откроет infoWindow при нажатии на него, закройте его при нажатии на него, и он был открыт, и закройте его, если он щелкнул в любом месте на карте, и infoWindows был открыт.
вы можете просто добавить прослушиватель щелчка на карте внутри функции, которая создает InfoWindow
google.maps.event.addListener(marker, 'click', function() { var infoWindow = createInfoWindowForMarker(marker); infoWindow.open(map, marker); google.maps.event.addListener(map, 'click', function() { infoWindow.close(); }); });
следующий прослушиватель событий решил это хорошо для меня даже при использовании нескольких маркеров и информационных окон:
//Add click event listener google.maps.event.addListener(marker, 'click', function() { // Helper to check if the info window is already open google.maps.InfoWindow.prototype.isOpen = function(){ var map = infoWindow.getMap(); return (map !== null && typeof map !== "undefined"); } // Do the check if (infoWindow.isOpen()){ // Close the info window infoWindow.close(); } else { //Set the new content infoWindow.setContent(contentString); //Open the infowindow infoWindow.open(map, marker); } });