Javascript 谷歌地图标记不会在Firefox上生成信息窗口
以下内容可以在IE和Chrome上使用,但不能在Firefox上使用(最新版本,27.0.1) 我看到的症状是,点击一个标记有时会正确显示一个信息窗口,有时则不正确-如果不正确,我会看到一个白色的向下三角形出现在地图级别的左上角,街景图标和一个“X”窗口在右侧的同一级别关闭 非常感谢您在调试过程中提供的帮助 我的简化代码如下所示(仍显示错误):Javascript 谷歌地图标记不会在Firefox上生成信息窗口,javascript,google-maps,firefox,Javascript,Google Maps,Firefox,以下内容可以在IE和Chrome上使用,但不能在Firefox上使用(最新版本,27.0.1) 我看到的症状是,点击一个标记有时会正确显示一个信息窗口,有时则不正确-如果不正确,我会看到一个白色的向下三角形出现在地图级别的左上角,街景图标和一个“X”窗口在右侧的同一级别关闭 非常感谢您在调试过程中提供的帮助 我的简化代码如下所示(仍显示错误): 地图测试 xmlhttp=新的XMLHttpRequest(); open(“GET”,“MapTestData.xml”,false); xmlht
地图测试
xmlhttp=新的XMLHttpRequest();
open(“GET”,“MapTestData.xml”,false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
var speakers=xmlDoc.getElementsByTagName(“SPEAKER”);
var map=new google.maps.map(document.getElementById('map'){
缩放:10,
中心:新google.maps.LatLng(52.4050,-2),
mapTypeId:google.maps.mapTypeId.ROADMAP
});
var infowindow=new google.maps.infowindow();
变量标记,i,地址,描述,j,iconurl;
var markerBounds=new google.maps.LatLngBounds();
对于(i=0;i;
if(发言者[i].getElementsByTagName(“电子邮件”)[0].childNodes.length>0){
发言人[i].desc+=“电子邮件:”;
}
否则{
speakers[i]。desc+=speakers[i]。getElementsByTagName(“名称”)[0]。childNodes[0]。nodeValue+“”;
};
if(扬声器[i].getElementsByTagName(“电话”)[0].childNodes.length>0){
speakers[i].desc+='Tel:'+speakers[i].getElementsByTagName(“Tel”)[0].childNodes[0].nodeValue;
};
对于(j=0;j'+演讲者[i]。getElementsByTagName(“显示”)[j]。子节点[0]。节点值;
};
markerBounds.extend(新的google.maps.LatLng(speakers[i].getElementsByTagName(“LAT”)[0]。childNodes[0]。nodeValue,speakers[i]。getElementsByTagName(“LONG”)[0]。childNodes[0]。nodeValue));
地图边界(markerBounds);
google.maps.event.addListener(标记,'click',(函数(标记,i){
返回函数(){
如果(!marker.open){
infowindow.setContent(speakers[i].desc);
信息窗口。打开(地图、标记);
marker.open=true;
}
否则{
infowindow.close();
marker.open=false;
}
}
})(marker,i));
};
这可能是Mozillas垃圾收集中的一个bug。
请尝试以下代码:
google.maps.event.addListener(marker, 'click', (function(marker, i) {
console.log('create click-function:',
i,
speakers[i].nodeName,
typeof speakers[i].desc);
var reference=speakers[i];
return function() {
if (!marker.open) {
console.log('run click-function:',
i,
speakers[i].nodeName,
typeof speakers[i].desc);
//(reference===speakers[i])//<!--note this line, uncomment it later
infowindow.setContent(speakers[i].desc);
infowindow.open(map, marker);
marker.open = true;
}
else {
infowindow.close();
marker.open = false;
}
}
})(marker, i));
它只创建对特定演讲者节点的引用(但当前未使用该节点)
现在取消注释注释注释行:
(reference===speakers[i])
现在将使用对节点的引用(不设置任何内容,仅用于比较)
正如您可能注意到的,现在所有信息窗口都打开了
唯一合理的解释(对我来说)是,现在垃圾收集的行为发生了变化,firefox意识到将使用对节点的引用。但是这样的引用也将在单击回调中使用,而不是通过扬声器[i].desc
有很多变通/修复方法。我更愿意将infowindow内容存储为标记的属性。AfterxmlDoc=xmlhttp.responseXML
xmlDoc为null
。读取数据需要一些时间。xmlDoc
如果行xmlDoc=xmlhttp.responseXML
更改为xmlDoc=xmlhttp.responseText,则该行不为空
@Anto Jurković:这是一个同步请求,在javascript控制台中显示此错误:错误:未捕获异常:[exception…”参数不足[nsimmlhttprequest.send]“nsresult:“0x80570001(NS_error\u XPC\u Not_ough_ARGS)”位置:“JS frame::http://www.geocodezip.com/v3_SO_markersInfowindowsXml.html ::第37行“数据:否]
@Dr.Molle:我忘了写我将代码更改为read responseonreadystatechange
。
google.maps.event.addListener(marker, 'click', (function(marker, i) {
console.log('create click-function:',
i,
speakers[i].nodeName,
typeof speakers[i].desc);
var reference=speakers[i];
return function() {
if (!marker.open) {
console.log('run click-function:',
i,
speakers[i].nodeName,
typeof speakers[i].desc);
//(reference===speakers[i])//<!--note this line, uncomment it later
infowindow.setContent(speakers[i].desc);
infowindow.open(map, marker);
marker.open = true;
}
else {
infowindow.close();
marker.open = false;
}
}
})(marker, i));
var reference=speakers[i];
(reference===speakers[i])