我试图从Google API v3中管理一系列的JavaScript对象。我的数组被定义为全局数组,因此我可以像这样管理所有的Infowindow
对象:
我编辑了代码以添加一些细节,就像Sean告诉的那样:
google.maps.event.addListener(markers[id], 'click', function() {
for ( var i = 0; i < infowindows.length; i++ ) {
var infoWin = infowindows[i];
if ( infoWin === undefined || infoWin === null ) {
continue;
}
infoWin.close();
}
map.panTo(markers[id].getPosition());
infowindows[id].open(map,markers[id]);
});
.close()
函数没有做任何事情。我知道我正在以正确的方式访问对象,因为我可以调用.open()
,并且它可以工作。有人对这个问题有想法吗?谢谢!
编辑(14 /8/ 2012):它似乎是CSS的一个问题,所以当我用一些JQuery显示地图时,我设法通过强制显示样式来修复它:
$('#google-map').css("display", "block !important");
非常感谢您的好意回答!
发布于 2012-05-10 19:55:17
我开始添加一个评论,但我有多个建议,所以我添加了一个清晰的完整答案。这是我最初的反馈,有一个问题:
for - in
循环用于枚举对象的属性,当您打算迭代数组的内容时,通常应该避免。因此,将循环控件更改为:对于( var i= 0;i< infowindows.length;i++ ){
for
循环定义中的index
不包含var
关键字,因此它可能正在创建一个全局变量。如果按照#1中的建议,重构使用传统的for
循环,那么这个可能的问题是,for
似乎不需要保护条件:if (typeof infowindows[index] == "object") {
,所以尝试完全删除测试。如果您知道数组包含unnecessary.
InfoWindow
分号,因为for
循环的最后一个闭包大括号}
是不必要的;我不认为它有什么坏处,但是应该删除它。问题:这段代码会产生错误吗?
跟进你的评论:
如果您认为数组中将有for - in
成员,则不必使用null
。如果您的数组成员没有被分配,它们将是undefined
;如果您的成员是null
,这是因为代码已经将它们设置为null
。但是在实际情况下,您可以处理这些情况,并仍然使用数组迭代:
for ( var i = 0; i < infowindows.length; i++ ) {
var infoWin = infowindows[i];
if ( infoWin === undefined || infoWin === null ) {
//skips the remainder of the loop code and starts a new iteration
continue;
}
infoWin.close();
}
当您的意图是循环迭代时使用for - in
是一个错误的实践,有时会工作,但最终会给您带来麻烦。它枚举对象的属性,甚至从原型链中提取属性,因此您永远无法完全确定您将得到什么。此外,for - in
可能不会按顺序枚举数组的属性,这有时会导致问题,因为有些代码假定数组是按顺序遍历的。
如果您使用类似的逻辑来调用工作良好的open()
,我必须假设代码正在对两个循环之间的数组进行更改,并做一些导致调用close()
的循环失败的事情。如果你在你的问题中添加了一些额外的代码,这将是有帮助的。
发布于 2012-05-17 23:16:14
再说一次,这太长了不能发表评论..。
如果infoWin.close()
没有关闭InfoWindow,最明显的原因是infoWin
不是InfoWindow。
for ( var i = 0; i < infowindows.length; i++ ) {
var infoWin = infowindows[i];
if ( infoWin === undefined || infoWin === null ) {
continue;
}
infoWin.close();
}
这个循环遍历一个被称为infowindows
的对象数组,测试infoWin
不是undefined
或null
,但这并不检查它是否实际上是InfoWindow。
因为.close()
不会导致错误,所以不管它是什么,都有一个close()
方法。只有InfoWindow有一个getContent()
方法,因此您可以对其进行测试,以确定该对象实际上是一个InfoWindow。
如果它是一个InfoWindow,那么我想我们需要一个链接到您的地图。在这种情况下,close()
方法应该可以工作,所以一定是某些东西改变了这一点。
https://stackoverflow.com/questions/10409782
复制