Your coding in a for loop is the culprit here. You create a new InfoBox every time in the loop so that you stay with the new InfoBox with each token.
This code is the one that creates a new InfoBox each time in a loop:
var boxText = document.createElement("div"); boxText.style.cssText = "border: 1px solid black;"; boxText.innerHTML = item.name; var myOptions = { content: boxText, boxStyle: { opacity: 0.75, width: "280px" }, closeBoxMargin: "12px 4px 2px 2px", }; var ib = new InfoBox(myOptions);
So, to have one instance of InfoBox, write the above code before the loop, so that you only initialize InfoBox once.
Since boxText.innerHTML is dynamic in the code above, set this content to the AddListener function.
So the final code should be
for (i = 0; i < data.length; i++) { var item = data[i]; var myLatlng = new google.maps.LatLng(item.lat, item.longs); var contentString = item.name; var marker = new google.maps.Marker({ position: myLatlng, map: map, title: item.name, icon: item.type + ".png" }); // end add new marker AddInfoBox(marker, contentString); //function call } //end for loop function AddInfoBox(myMarker, content) { google.maps.event.addListener(myMarker,'click',function() { ib.setContent(content); //not sure about this statement ib.open(map, this); } }); }
source share