Google maps InfoWindow close()函数不起作用
我正试图从Google Maps JavaScript API v3管理一系列Google maps InfoWindow close()函数不起作用,google-maps,google-maps-api-3,maps,infowindow,Google Maps,Google Maps Api 3,Maps,Infowindow,我正试图从Google Maps JavaScript API v3管理一系列InfoWindow对象。我的数组定义为全局数组,因此我可以管理所有Infowindow对象,如下所示: 我编辑了代码,添加了一些细节,肖恩告诉我: google.maps.event.addListener(markers[id], 'click', function() { for ( var i = 0; i < infowindows.lengt
InfoWindow
对象。我的数组定义为全局数组,因此我可以管理所有Infowindow
对象,如下所示:
我编辑了代码,添加了一些细节,肖恩告诉我:
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]);
});
非常感谢你友好的回答 我开始添加一条评论,但我有多个建议,因此为了清晰起见,我添加了完整的答案。以下是我的初步反馈,还有一个问题:
for-in
循环用于枚举对象的属性,通常在迭代数组内容时应避免使用。因此,将循环控制更改为:
对于(var i=0;ifor
循环的定义中的index
不包括var
关键字,因此它可能会创建一个全局变量。如果按照#1中的建议,重构为使用传统的for
循环,则此可能的问题将被消除if(typeof infowindows[index]=“object”){
,因此请尝试完全删除测试。如果您知道数组包含InfoWindow
实例,则不需要这样做null
成员,则不必使用for-in
。如果您有尚未分配的数组成员,则它们将未定义;如果您有null
成员,这是因为代码已将它们设置为null
。但在其他情况下,您可以处理wi在这些情况下,仍然使用数组迭代:
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(var i=0;i
当您的意图是循环迭代时,使用for-in
是一种不好的做法,有时会奏效,但最终会让您陷入麻烦。它会枚举对象的属性,甚至会从原型链中引入属性,因此您永远无法完全确定将得到什么。此外,for-in
可能不会枚举按顺序遍历数组的属性,这有时会导致问题,因为有些代码假定数组是按顺序遍历的
如果您使用类似的逻辑来调用运行良好的open()
,我必须假设代码正在对两个循环之间的数组进行更改,并在调用close()的地方执行导致循环的操作
失败。如果您在问题中添加了一些额外的代码,这将很有帮助。同样,这对于注释来说太长了
如果infoWin.close()
没有关闭信息窗口,最明显的原因是infoWin
不是信息窗口
for ( var i = 0; i < infowindows.length; i++ ) {
var infoWin = infowindows[i];
if ( infoWin === undefined || infoWin === null ) {
continue;
}
infoWin.close();
}
for(var i=0;i
这个循环循环遍历一个对象数组,你调用了infowindows
,你测试infoWin
不是undefined
或null
,但这并不能检查它实际上是一个InfoWindow
for ( var i = 0; i < infowindows.length; i++ ) {
var infoWin = infowindows[i];
if ( infoWin === undefined || infoWin === null ) {
continue;
}
infoWin.close();
}
因为.close()
不会导致错误,所以无论它是什么,都有一个close()
方法。只有InfoWindow有一个getContent()
方法,所以您可以测试它,作为对象实际上是InfoWindow的肯定指示
for ( var i = 0; i < infowindows.length; i++ ) {
var infoWin = infowindows[i];
if ( infoWin === undefined || infoWin === null ) {
continue;
}
infoWin.close();
}
如果它是一个信息窗口,那么我想我们需要一个到你地图的链接。在这种情况下,close()
方法应该可以工作,所以一定发生了什么变化。是信息窗口[index]==“object”
评估为true?Thanx,andresf.Yes。我可以调用infowindows[index].open()没有问题SHI@ Sean Mickey,非常感谢您的友好回答。代码没有产生任何错误。我已经考虑了您给我的重构建议但有一些问题:我需要使用IO-IN结构,因为数组索引不相关,所以FiffDunWoW(1)和FifWiDOWS(3)可能存在,但是FifWiDOWOS[ 2 ]。可以为null。每当我调用infowindows[index].open()(我可以从for-in循环中打开每个infowindow)时,算法的逻辑似乎都能工作。但他们只是不关闭…@gotardo很乐意提供帮助-我在回答你的评论时添加了内容。嗨,Sean,非常感谢你的帮助。我已经按照你说的重构了代码,但它不起作用。事实是:-在调用.close()时,infoWin总是一个InfoWindow对象。-而不是调用.close()我可以调用infowindows[I].open(map,markers[I]),这样所有的infowindows都可以打开。嗨,安德鲁,非常感谢你的回答。实际上,infoWin是一个infoWindow对象,所以我可以执行infoWin.open(map,markers[I])循环会打开地图上的每个信息窗口。@gotardo我们能有一个指向演示者的链接吗?一定是什么改变了close()
方法。