Reputation: 2203
I cant for the life of me get only one infoWindow to display at a time in V3 of API. I need one to close prior to the next opening. Also looking to have the infoWindow close onclick anywhere on the map. Does this go within the initialize function?
Here is my full script:
// defining vars
var map = null;
var markers = [];
var adUnit;
var center = new google.maps.LatLng(39.676502,-105.162101);
// function that soley initializes the new map object
function initialize() {
var mapOptions = {
zoom: 10,
center: center,
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
},
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.SMALL,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
panControl: false,
mapTypeId: google.maps.MapTypeId.TERRAIN
}
map = new google.maps.Map($('#map_canvas')[0], mapOptions);
// call the loader function
loadXML();
// Adsense Options
var adUnitDiv = document.createElement('div');
var adUnitOptions = {
format: google.maps.adsense.AdFormat.BUTTON,
position: google.maps.ControlPosition.RIGHT_BOTTOM,
publisherId: 'ca-google-maps_apidocs',
map: map,
visible: true
};
adUnit = new google.maps.adsense.AdUnit(adUnitDiv, adUnitOptions);
google.maps.event.addListener(map, 'click', function() {
infowindow.close();
});
} //<-- Initialize
// load (and map) the markers from XML data
function loadXML() {
$.get('data.xml', function(data) {
// var bounds = new google.maps.LatLngBounds(); //<--- Size map to bounds of markers LatLng
$(data).find('marker').each(function() {
var lat = $(this).attr('lat')
var lng = $(this).attr('lng')
var name = $(this).attr('name')
var type = $(this).attr('type')
var LatLng = new google.maps.LatLng(parseFloat($(this).attr('lat')),
parseFloat($(this).attr('lng')));
var myToggleData = { //<---- collecting data to be toggled on/off
type : $(this).attr('type'),
skill : $(this).attr('skill'),
eta_whatever_that_means : parseFloat($(this).attr('eta'))
}
var marker = new google.maps.Marker({
position : LatLng,
map : map,
icon : 'images/marker.png',
title : $(this).attr('name'),
data : myToggleData
});
var html ='<div id="winBackground"> <div class="winTitle">' + name + '</div> <div class="winHead">Type: <div class="winData">' + type + '</div></div> </div>';
// create the infoWindow
var infoWindow = new google.maps.InfoWindow();
// add a listener to open the infoWindow when a user clicks on one of the markers
google.maps.event.addListener(marker, 'click', function() {
infoWindow.setContent(html);
infoWindow.open(map, marker);
});
markers.push(marker);
// bounds.extend(LatLng);
});
// map.fitBounds(bounds);
});
}
// The toggleMarker function
function toggleMarkers(attr,val) {
if (markers){
for (i in markers) {
if(markers[i].data[attr] == val){
var visibility = (markers[i].getVisible() == true) ? false : true;
markers[i].setVisible(visibility);
}
}
}
}
Upvotes: 4
Views: 8196
Reputation: 119
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;
});
});
Try this it would work
Upvotes: 2
Reputation: 35950
Try something like this:
if(popup) {
popup.close();
}
popup = new google.maps.InfoWindow({
content:'My New InfoWindow',
});
popup.open(map, marker);
Upvotes: 0
Reputation: 1205
This will close all infoWindows on map click (without the need to have a reference to the infoWindow object).
google.maps.event.addListener( map, 'click', function() {
infowindow.open( null, null );
} );
Upvotes: 2
Reputation: 7032
Don't create a new InfoWindow for every marker. Only create one InfoWindow and then when you change it, do the following:
infowin.setContent("");
infowin.open(map, marker);
Upvotes: 6