I have multiple markers being add dynamically to a map. I need the map to focus on all markers displayed on the map. This will vary depending on input in search fields. I also need an info window for each marker. I had the info window working before I got the map to focus on all of the markers. Now that I found code that will focus on all markers even if they are on the other side of the country, I can not get the info window to work.
<script>
function map_initialize() {
var member_locations = [
[ "Member 1", new google.maps.LatLng(47.1330611, -122.4350594),1],
[ "Member 12", new google.maps.LatLng(47.2394208, -122.3549794),2],
[ "Member 123", new google.maps.LatLng(47.2071584, -122.2370664),3],
[ "Member 11", new google.maps.LatLng(47.1520592, -122.3524013),4],
[ "Member 112", new google.maps.LatLng(47.1178347, -122.0554941),5],
[ "Member 1122", new google.maps.LatLng(47.3104558, -122.5861279),6]
];
var map = new google.maps.Map(document.getElementById("directory_map"), {
center: new google.maps.LatLng(0, 0),
zoom: 0,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
for (var i = 0; i < member_locations.length; i++) {
new google.maps.Marker({
position: member_locations[i][1],
map: map,
title: member_locations[i][0]
});
}
var infowindow = new google.maps.InfoWindow();
var marker, i;
var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < member_locations.length; i++) {
latlngbounds.extend(member_locations[i][1]);
}
map.fitBounds(latlngbounds);
for (var i = 0; i < member_locations.length; i++) {
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(member_locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
new google.maps.Rectangle({
bounds: latlngbounds,
map: map,
fillColor: "#000000",
fillOpacity: 0.2,
strokeWeight: 0
});
}
google.maps.event.addDomListener(window, 'load', map_initialize);
</script>
Advertisement
Answer
You aren’t adding the InfoWindow to the markers correctly, marker is not defined in the loop below, and member_locations is not an array of google.maps.Marker objects:
for (var i = 0; i < member_locations.length; i++) {
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(member_locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
Best to do something like in the related/duplicate question: Google Maps JS API v3 – Simple Multiple Marker Example. Create the marker, add the InfoWindow in the same loop.
code snippet:
function map_initialize() {
var member_locations = [
["Member 1", new google.maps.LatLng(47.1330611, -122.4350594), 1],
["Member 12", new google.maps.LatLng(47.2394208, -122.3549794), 2],
["Member 123", new google.maps.LatLng(47.2071584, -122.2370664), 3],
["Member 11", new google.maps.LatLng(47.1520592, -122.3524013), 4],
["Member 112", new google.maps.LatLng(47.1178347, -122.0554941), 5],
["Member 1122", new google.maps.LatLng(47.3104558, -122.5861279), 6]
];
var map = new google.maps.Map(document.getElementById("directory_map"), {
center: new google.maps.LatLng(0, 0),
zoom: 0,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
for (var i = 0; i < member_locations.length; i++) {
let marker = new google.maps.Marker({
position: member_locations[i][1],
map: map,
title: member_locations[i][0]
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(member_locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
var infowindow = new google.maps.InfoWindow();
var marker, i;
var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < member_locations.length; i++) {
latlngbounds.extend(member_locations[i][1]);
}
map.fitBounds(latlngbounds);
new google.maps.Rectangle({
bounds: latlngbounds,
map: map,
fillColor: "#000000",
fillOpacity: 0.2,
strokeWeight: 0
});
}
google.maps.event.addDomListener(window, 'load', map_initialize);/* Always set the map height explicitly to define the size of the div
* element that contains the map. */
#directory_map {
height: 100%;
}
/* Optional: Makes the sample page fill the window. */
html,
body {
height: 100%;
margin: 0;
padding: 0;
}<!DOCTYPE html> <html> <head> <title>Simple Map</title> <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script> <!-- jsFiddle will insert css and js --> </head> <body> <div id="directory_map"></div> <!-- Async script executes immediately and must be after any DOM elements used in callback. --> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=&v=weekly"></script> </body> </html>
