我在这里遇到了一个混乱的情况,希望有人可以帮助我解决这个问题已在Stackoverflow中讨论过。
我正在使用循环来读取XML并根据该XML的节点创建标记,这是有效的。此外,在该循环内部,我调用一个位于该循环的函数,为每个标记创建一个InfoWindow,并从XML中提取内容。
这是代码:
function xml_Leer() {
function agregar_datos(marcador, map, direccion, telefono, dias_habiles, sabado, domingo) {
var datos = new google.maps.InfoWindow({content: "<h2>"+nombre+"</h2><p>"+direccion+"</p><p>"+telefono+"</p><ul><li>Lunes a Viernes: "+dias_habiles+"</li><li>Sábados: "+sabado+"</li><li>Domingos: "+domingo+"</li></ul>"});
google.maps.event.addListener(marcador, 'click', function() {datos.open(map,marcador);});
}
var iglesias = xml.getElementsByTagName("iglesia");
for(var i=0; i<iglesias.length; i++) {
var nombre = iglesias[i].getElementsByTagName("nombre")[0].childNodes[0].nodeValue;
var direccion = iglesias[i].getElementsByTagName("direccion")[0].childNodes[0].nodeValue;
var telefono = iglesias[i].getElementsByTagName("telefono")[0].childNodes[0].nodeValue;
var dias_habiles = iglesias[i].getElementsByTagName("horarios")[0].getElementsByTagName("dias_habiles")[0].childNodes[0].nodeValue;
var sabado = iglesias[i].getElementsByTagName("horarios")[0].getElementsByTagName("sabado")[0].childNodes[0].nodeValue;
var domingo = iglesias[i].getElementsByTagName("horarios")[0].getElementsByTagName("domingo")[0].childNodes[0].nodeValue;
var tipo = iglesias[i].getAttribute("tipo");
var ubicacion = new google.maps.LatLng(iglesias[i].getAttribute("lat"), iglesias[i].getAttribute("lng"));
var marcador = new google.maps.Marker({position: ubicacion, animation: google.maps.Animation.DROP, map: map, title:nombre });
agregar_datos(marcador, map, direccion, telefono, dias_habiles, sabado, domingo);
}
}
如果编码不好,我应该如何创建InfoWindow,考虑到我需要从XML中获取的信息显示在InfoWindow的内容中?
提前致谢。
此代码有效,但我不知道如何,只是......有效。
var datos = new google.maps.InfoWindow();
function agregar_datos(marcador, map, direccion, telefono, dias_habiles, sabado, domingo) {
var datos = new google.maps.InfoWindow({content: "<h2>"+nombre+"</h2><p>"+direccion+"</p><p>"+telefono+"</p><ul><li>Lunes a Viernes: "+dias_habiles+"</li><li>Sábados: "+sabado+"</li><li>Domingos: "+domingo+"</li></ul>"});
google.maps.event.addListener(marcador, 'click', function() { if(window.datos){window.datos.close();} window.datos=datos; datos.open(map,marcador);});
}
答案 0 :(得分:0)
我怀疑这是因为javascript关闭问题,看看这里,这是完全相同的问题! https://stackoverflow.com/a/8326203/684229
你有问题,因为当启动marcador click事件处理程序时,它使用函数调用中的marcador
变量,但是这已经被改为for循环中的最后一个标记。
尝试更改功能agregar_datos()
中的代码,使用this
代替marcador
:
google.maps.event.addListener(marcador, 'click', function() {datos.open(map, this);});
答案 1 :(得分:0)
创建1个全局变量,存储最后一个opend infowindow。当您打开一个新的infoWindow时,您可以访问此全局变量并关闭窗口:
全球范围内的某个地方:
var datos;
agregar_datos()中的:
删除第二行并添加:
google.maps.event.addListener(marcador, 'click',
function() {
if(window.datos){window.datos.close();}
window.datos=datos;
datos.open(map,marcador);
});
更好的解决方案:只使用1个infoWindow:
全球范围内的某个地方:
var datos=new google.maps.InfoWindow();
agregar_datos()中的:
删除该行:
var datos = new google.maps.InfoWindow(/*....*/);
并添加:
google.maps.event.addListener(marcador, 'click',
function() {
window.datos.close();
window.datos.setContent("put your content here");
datos.open(map,marcador);
});