首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >InfoWindow close()函数无法工作

InfoWindow close()函数无法工作
EN

Stack Overflow用户
提问于 2012-05-02 07:55:02
回答 2查看 2.9K关注 0票数 1

我试图从Google API v3中管理一系列的JavaScript对象。我的数组被定义为全局数组,因此我可以像这样管理所有的Infowindow对象:

我编辑了代码以添加一些细节,就像Sean告诉的那样:

代码语言:javascript
运行
复制
            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显示地图时,我设法通过强制显示样式来修复它:

代码语言:javascript
运行
复制
$('#google-map').css("display", "block !important");    

非常感谢您的好意回答!

EN

回答 2

Stack Overflow用户

发布于 2012-05-11 03:55:17

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

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

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

  • ,无法确定,但是for循环定义中的index不包含var关键字,因此它可能正在创建一个全局变量。如果按照#1中的建议,重构使用传统的for循环,那么这个可能的问题是,for似乎不需要保护条件:if (typeof infowindows[index] == "object") {,所以尝试完全删除测试。如果您知道数组包含unnecessary.

  • The实例,这是InfoWindow分号,因为for循环的最后一个闭包大括号}是不必要的;我不认为它有什么坏处,但是应该删除它。

问题:这段代码会产生错误吗?

跟进你的评论:

如果您认为数组中将有for - in成员,则不必使用null。如果您的数组成员没有被分配,它们将是undefined;如果您的成员是null,这是因为代码已经将它们设置为null。但是在实际情况下,您可以处理这些情况,并仍然使用数组迭代:

代码语言:javascript
运行
复制
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()的循环失败的事情。如果你在你的问题中添加了一些额外的代码,这将是有帮助的。

票数 1
EN

Stack Overflow用户

发布于 2012-05-18 07:16:14

再说一次,这太长了不能发表评论..。

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

代码语言:javascript
运行
复制
            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()方法应该可以工作,所以一定是某些东西改变了这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10409782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档