1

我正在尝试管理InfoWindow来自 Google Maps JavaScript API v3 的一组对象。我的数组被定义为全局的,所以我可以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]);
            });

.close()功能没有做任何事情。我知道我正在以正确的方式访问对象,因为我可以调用.open()并且它可以工作。有人对这个问题有想法吗?谢谢!

编辑(14 / 8 / 2012):这似乎是 CSS 的问题,所以当我用一些 JQuery 显示地图时,我设法通过强制显示样式来修复它:

$('#google-map').css("display", "block !important");    

非常感谢您的友好回答!

4

2 回答 2

1

我开始添加评论,但我有多个建议,所以为了清楚起见,我添加了一个完整的答案。这是我的初步反馈,有一个问题:

  1. JavaScriptfor - in循环旨在用于枚举对象的属性,当您的意图是迭代Array 的内容时,通常应避免使用该循环。因此,将循环控制更改为:

    for ( var i = 0; i < infowindows.length; i++ ) {

  2. 没有办法确定,但是indexfor循环的定义中不包含var关键字,因此它可能正在创建一个全局变量。如果您按照 #1 中的建议重构以使用传统for循环,则可以消除此可能的问题。

  3. 似乎不需要保护条件:if (typeof infowindows[index] == "object") {,所以尝试完全删除测试。如果您知道数组包含InfoWindow实例,则这是不必要的。

  4. 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-11T03:55:17.347 回答
1

再说一次,评论太长了……

如果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不是undefinednull但不检查它实际上是一个 InfoWindow。

因为.close()不会导致错误,所以不管它是有close()方法的。只有 InfoWindow 有一个getContent()方法,因此您可以测试它作为该对象实际上是 InfoWindow 的肯定指示。

如果它一个信息窗口,那么我认为我们需要一个指向您的地图的链接。在这种情况下,该close()方法应该可以工作,所以一定有什么改变了。

于 2012-05-18T07:16:14.317 回答