【问题标题】:InfoWindow close() function is not workingInfoWindow close() 函数不起作用
【发布时间】:2012-05-02 07:55:02
【问题描述】:

我正在尝试管理来自 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");    

非常感谢您的友好回答!

【问题讨论】:

  • typeof infowindows[index] == "object" 评估为真吗?
  • 谢谢,andresf.Yes。我可以毫无问题地调用 infowindows[index].open()

标签: google-maps google-maps-api-3 maps infowindow


【解决方案1】:

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

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

    for (var i = 0; i

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

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

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

问题:此代码是否产生任何错误?

跟进您的评论:

如果您认为数组中有null 成员,则不必使用for - in。如果您有尚未分配的数组成员,它们将是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() 的循环失败。如果您在问题中添加一些额外的代码,将会很有帮助。

【讨论】:

  • 嗨@Sean Mickey,非常感谢您的友好回答。该代码不会产生任何错误。我已经考虑了你给我的重构建议,但有一些问题:我需要使用 for - in 结构,因为数组索引不相关,所以 infowindows[1] 和 infowindows[3] 可能存在,但 infowindows[2] 可能是无效的。每当我调用 infowindows[index].open() 时,算法的逻辑似乎都有效(我可以从 for - in 循环打开每个 infowindow)。但他们只是不关闭......
  • @gotardo 很高兴为您提供帮助 - 我在回答中添加了内容以回应您的评论。
  • 嗨,肖恩,非常感谢您的有用帮助。我已经按照您所说的重构了代码,但它不起作用。事实是: - infoWin 在调用 .close() 时始终是一个 InfoWindow 对象。 - 我可以调用 infowindows[i].open(map,markers[i]) 而不是调用 .close(),这样所有的 infowindows 都会打开。
【解决方案2】:

再一次,评论太长了……

如果infoWin.close() 没有关闭信息窗口,最明显的原因是infoWin 不是信息窗口。

            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() 方法应该可以工作,所以一定有什么改变了。

【讨论】:

  • 您好安德鲁,非常感谢您的回答。实际上,infoWin 是一个 infoWindow 对象,所以我可以执行 infoWin.open(map,markers[i]) 并且循环打开地图中的每个 infoWindow。
  • @gotardo 那么我们可以给一个演示者的链接吗?一定有什么东西改变了close() 方法。
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2016-04-28
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多