Javascript 具有单个信息窗口的多个地图标记
我的闭包技巧不是很好,我试图保留每个InfoWindows的引用以供以后使用,但似乎无法从这里继续。不管我点击哪个标记,都会打开相同的信息窗口。不要担心{{}Django模板代码,这很好Javascript 具有单个信息窗口的多个地图标记,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我的闭包技巧不是很好,我试图保留每个InfoWindows的引用以供以后使用,但似乎无法从这里继续。不管我点击哪个标记,都会打开相同的信息窗口。不要担心{{}Django模板代码,这很好 $( document ).ready(function() { var map; var myLatlng; var marker = []; var infowindow = [];
$( document ).ready(function() {
var map;
var myLatlng;
var marker = [];
var infowindow = [];
var map_markers = [];
{% for map_marker in map_markers %}
map_markers.push({
'lat':{{map_marker.latitude}},
'lng':{{map_marker.longitude}},
'icon':{% if map_marker.icon %}'{{map_marker.icon.url}}'{% else %}''{% endif %},
'info':{% if map_marker.info %}'{{map_marker.info.strip|safe|escapejs}}'{% else %}''{% endif %},
});
{% endfor %}
var mapOptions = {
zoom: {{map_settings.zoom}},
center: new google.maps.LatLng({{map_settings.latitude}}, {{map_settings.longitude}})
};
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
for (i in map_markers){
myLatlng = new google.maps.LatLng( map_markers[i].lat , map_markers[i].lng );
marker[i] = new google.maps.Marker({
position: myLatlng,
map: map,
title: 'Marker',
icon: map_markers[i].icon
});
if ( map_markers[i].info ){
infowindow[i] = new google.maps.InfoWindow({
content: map_markers[i].info
});
google.maps.event.addListener(marker[i], 'click', function() {
infowindow[i].open(map,marker[i]);
});
}
}
});
如果能从这个问题上继续下去就太好了,因为我一直在绕圈子。感谢您的帮助。修复了它。。。添加了以下功能
function marker_click(marker,infowindow){
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
}
然后叫它
marker_click(marker[i], infowindow[i]);
一种选择是使用标记的成员变量,而不是函数闭包。将(自定义)成员添加到标记(例如iWcontent): 在标记单击功能中使用该选项:
google.maps.event.addListener(marker[i], 'click', function() {
infowindow.setContent(this.iWcontent);
infowindow.open(map,this);
});
代码段:
var地理编码器;
var映射;
var映射_标记=[];
var标记=[];
var infowindow=new google.maps.infowindow();
地图推送({
“lat”:45,
“液化天然气”:-75,
“图标”:null,
“信息”:“{0}”
});
地图推送({
“lat”:45.5,
“液化天然气”:-75.5,
“图标”:null,
“信息”:“{1}”
});
函数初始化(){
变量映射选项={
缩放:5,
中心:新google.maps.LatLng(45,-75)
};
map=new google.maps.map(document.getElementById('map-canvas'),mapOptions);
用于(地图标记中的i){
myLatlng=new google.maps.LatLng(地图标记[i].lat,地图标记[i].lng);
marker[i]=新的google.maps.marker({
职位:myLatlng,
地图:地图,
标题:'标记',
图标:地图标记[i]。图标,
iWcontent:map_标记[i]。信息
});
if(映射标记[i].info){
google.maps.event.addListener(标记[i],'click',函数(){
infowindow.setContent(this.iWcontent);
打开(地图,这个);
});
}
}
}
google.maps.event.addDomListener(窗口“加载”,初始化)代码>
html,主体,#地图画布{
高度:500px;
宽度:500px;
边际:0px;
填充:0px
}
您可以使用JSFIDLE/Plnkr附加一个工作示例吗?您不必使用闭包。您可以将infowindow内容存储在标记的(自定义)成员中。我在发布的代码中没有看到任何试图关闭的行为。我尝试过关闭,但没有成功。我假设infowindow[I].open的元素(map,marker[I]);写得太多了。以前没有使用过的JSFIDLE将看一看。
google.maps.event.addListener(marker[i], 'click', function() {
infowindow.setContent(this.iWcontent);
infowindow.open(map,this);
});