InfoWindow close()函数不起作用

时间:2012-05-02 07:55:02

标签: 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.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");    

非常感谢您的回答!

2 个答案:

答案 0 :(得分:1)

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

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

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

  2. 无法确切知道,但index循环定义中的for不包含var关键字,因此可能正在创建全局变量。如果你重构使用传统的for循环,如#1中所述,这个可能的问题就会被删除。

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

  4. for循环的最后右括号}后面的分号是不必要的;我认为这不会造成任何伤害,但应该将其删除。

  5. 问题:此代码是否会产生错误?

    跟进您的评论:

    如果您认为阵列中有for - in个成员,则不必使用null。如果您有尚未分配的数组成员,则它们将为undefined;如果您的成员为null,那是因为代码已将其设置为null。但在eather案例中,您可以处理这些情况并仍然使用数组迭代:

    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(),我必须假设代码正在对两个循环之间的数组进行更改并执行一些导致循环的地方{{1} 1}}失败。如果您在问题中添加一些其他代码,则会有所帮助。

答案 1 :(得分: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的正面指示。

如果 是InfoWindow,那么我认为我们需要一个指向地图的链接。在这种情况下,close()方法应该有效,所以必须改变它。