我正在尝试为一组地址设置不同的标记.我想要一个单独的信息窗口.我没有得到信息窗口
I am trying to set different markers to an array of addresses. I want a separate infowindow for each. I am not getting infowindows
我正在从PHP调用一个函数(被成功调用),并试图为每个标记设置信息窗口。正在设置标记,但是没有为每个标记设置infowindow。
相同的代码如下。
var markers = [];
var infowin = [];
function addMarker(address, name, contact, id, x) {
switch(x) {
case "domestic":
icon = "grn-blank";
break;
case "plumber":
icon = "purple-blank";
break;
case "laundry":
icon = "orange-blank";
break;
case "carpenter":
icon = "red-blank";
break;
case "milk_vendor":
icon = "ylw-blank";
break;
case "electrician":
icon = "pink-blank";
break;
case "newspaper_vendor":
icon = "blu-blank";
break;
}
var iconbase = "http://maps.google.com/mapfiles/kml/paddle/";
var icon = icon + ".png";
var icons = iconbase + icon ;
geocoder.geocode({'address': address}, 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,
icon: new google.maps.MarkerImage(icons)
});
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
var contentw = "Name: " + name + "'nAddress: " + address + " 'nPhone: " + contact + "'nId-Number: " + id;
var infowindow = new google.maps.InfoWindow({
content: contentw
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
markers.push(marker);
infowin.push(infowindow);
}
我可以做些什么来避免这个问题?
您的代码中有一个竞赛条件。要理解它,请看下面的精简示例。
function addMarker(...) {
...
geocoder.geocode({'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
// This is where you create the marker (in an asynchronous callback)
var marker = new google.maps.Marker({ ... });
...
}
});
...
var infowindow = new google.maps.InfoWindow({ ... });
// This is where you access the marker (in the surrounding function)
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
...
}
地理编码请求是异步发出的。因此,当回调function(results, status)
被执行时,周围的addMarker
函数可能已经完成了执行。当您尝试访问marker
变量时,竞争条件发生在addMarker
的末尾。但是,在执行地理编码回调之前,不会分配此变量的值。
要解决这个问题,您所需要做的就是将信息窗口代码移动到地理编码回调中。
function addMarker(...) {
...
geocoder.geocode({'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({ ... });
var infowindow = new google.maps.InfoWindow({ ... });
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
...
}
});
...
}
查看JSFiddle上的一个工作示例。
相关文章:
- 如何调整信息窗口的大小并点击按钮?+更改信息窗口的内容
- 谷歌地图点击潜水触发信息窗口
- 将FlowPlayer嵌入谷歌地图信息窗口
- 当我浏览回页面时,谷歌地图信息窗口不会弹出
- 谷歌地图信息窗口Z索引
- 如何隐藏标记簇内标记的信息窗口
- 谷歌地图信息窗口为每个标记显示相同的内容
- 更改内容信息窗口映射v3
- Cartodb信息窗口未在地图上显示变量
- 为位于路线上的谷歌地图标记(起点和终点)设置一个信息窗口
- 信息窗口谷歌地图点击事件给出错误
- Javascript谷歌地图每个信息窗口
- 更新打开的谷歌地图信息窗口
- 如何在显示多个标记时单击另一个标记时关闭信息窗口
- 禁用角度地图中标记和信息窗口的ng点击
- 在谷歌地图的信息窗口内点击按钮
- 谷歌地图API-信息窗口显示谷歌位置API信息
- 谷歌地图API-获取信息窗口打开时,点击一个圆圈
- Google 地图信息窗口仅显示首次点击时的信息
- 如何在谷歌地图中设置多个信息窗口,但使用这种特定的JavaScript方法