我很难在Google地图标记上获取infowindow中的信息。标记位于正确的位置,但是,这是将第二个位置的名称传递到第一个和第二个infowindows。
<script>
function initMap() {
var mapOptions = {
zoom: 14,
scrollwheel: false,
center: new google.maps.LatLng(31.44, -100.47)
}
var map = new google.maps.Map(document.getElementById('super_map'), mapOptions);
var geocoder = new google.maps.Geocoder();
var addresses = ["3000 Main St San Angelo TX", "4001 Sunset Dr San Angelo TX"];
var names = ['First Place', 'Second Place'];
for(var x = 0; x < addresses.length; x++){
var name = names[x];
geocoder.geocode( { 'address': addresses[x]}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
animation: google.maps.Animation.DROP,
});
var contentString = name;
var infowindow = new google.maps.InfoWindow({
content: contentString
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
}
});
}
}
google.maps.event.addDomListener(window, 'load', initMap);
google.maps.event.addDomListener(window, 'resize', initMap);
</script>
我已尝试使用setContent设置它但结果相同......
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(names[0]);
infowindow.open(map,marker);
});
答案 0 :(得分:3)
嗨,如上面的评论中所解释的那样,地理编码器调用不会在循环中工作。
但是,一旦清理完毕,您可以通过在标记上设置正确的数据将数据传递给标记:
var marker = new google.maps.Marker({
map: map,
data: someDataProperty,// either the geocoder result or custom data
position: results[0].geometry.location,
animation: google.maps.Animation.DROP,
});
然后在你的点击中他们得到标记并使用数据属性:
google.maps.event.addListener(marker, 'click', function()
{
infowindow.setContent(marker.data.name;
infowindow.open(map,marker);
});
这是一个JS小提琴,展示了它是如何工作的:https://jsfiddle.net/loanburger/dh4whm25/
答案 1 :(得分:2)
解决问题的一个选择是&#34; name&#34;上的函数关闭。下面的代码为循环的每次迭代创建一个匿名函数,该函数在name
变量上保存函数闭包。
geocoder.geocode({
'address': addresses[x]
// get function closure on "name"
}, (function(name) {
return function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
animation: google.maps.Animation.DROP,
});
var contentString = name;
var infowindow = new google.maps.InfoWindow({
content: contentString
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
}
}
})(name));
代码段
function initMap() {
var mapOptions = {
zoom: 14,
scrollwheel: false,
center: new google.maps.LatLng(31.44, -100.47)
}
var map = new google.maps.Map(document.getElementById('super_map'), mapOptions);
var bounds = new google.maps.LatLngBounds();
var geocoder = new google.maps.Geocoder();
for (var x = 0; x < addresses.length; x++) {
var name = names[x];
geocoder.geocode({
'address': addresses[x]
}, (function(name) {
// get function closure on "name"
return function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
bounds.extend(results[0].geometry.location);
map.fitBounds(bounds);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
animation: google.maps.Animation.DROP,
});
var contentString = name;
var infowindow = new google.maps.InfoWindow({
content: contentString
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
}
}
})(name));
}
}
google.maps.event.addDomListener(window, 'load', initMap);
google.maps.event.addDomListener(window, 'resize', initMap);
var addresses = ["3000 Main St San Angelo TX", "4001 Sunset Dr San Angelo TX"];
var names = ['First Place', 'Second Place'];
&#13;
html,
body,
#super_map {
height: 100%;
width: 100%;
margin: 0px;
padding: 0px
}
&#13;
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="super_map"></div>
&#13;