Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google maps InfoWindow close()函数不起作用_Google Maps_Google Maps Api 3_Maps_Infowindow - Fatal编程技术网

Google maps InfoWindow close()函数不起作用

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

我正试图从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]);
            });

非常感谢你友好的回答

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

  • JavaScript
    for-in
    循环用于枚举对象的属性,通常在迭代数组内容时应避免使用。因此,将循环控制更改为:

    对于(var i=0;i
  • 没有办法确定,但是
    for
    循环的定义中的
    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()
    方法。