1

在我谈到我的实际问题之前,有点旁白:

几个月前,我遇到了一个问题,当我收到 AJAX 调用(大约每分钟两次)时,我需要通过 javascript 动态调整 Google Earth Balloon 的大小。有时每次调用只需要将气球增加一两个像素,这不是一个大问题。主要问题是,在某些(很多)时间,我返回的数据需要气球更大,这会导致出现滚动条(对我工作的公司来说这是一个不良影响)。最终,在向它扔了几天代码之后,我找到了一种非常 hacky 的方法来让气球按照我想要的方式调整大小。在获取我的数据并用新数据重新填充气球后,我会称之为:

setTimeout(window.location.reload, 250);

我有一个理论认为这会起作用,因为在 Google 地球应用程序(客户端和插件版本)中,我可以右键单击气球并单击“重新加载”,然后气球会按照我想要的方式调整它的大小。显然,考虑到如果我在普通浏览器中使用相同的代码,这个 hack 有点可疑,页面只会无限重新加载,所以我还必须想办法确定我是在 Google Bubble 中还是在浏览器中这个网页的版本(我找到了一种方法,但它并不重要或与我最终要解决的问题无关)。现在办公室周围的事情变得不那么混乱了,我想确切地找出为什么会这样。

最后,我的问题是:Google Earth API 是否重新定义了 Window 或 Location 对象,还是只是重新定义了 window.location.reload 的工作方式?

我正在使用 Google 地球客户端 v6.1.0.5001 和 Google 地球插件 v6.2.2.6613

4

1 回答 1

0

Google 地球 API 是否重新定义了 Window 或 Location 对象,还是只是重新定义了 window.location.reload 的工作方式?

不,它没有重新定义任何东西,它只是页面框架内的插件。基本上,如果您在一个框架内,window指的是当前框架,parent指的是当前框架的父级,top指的是窗口层次结构中最顶层的窗口。

当您第一次加载插件时,您通常将createInstance方法指向div页面上的一个或其他元素。例如

<div id='map3d'></div>

但是,一旦插件加载,如果您查看页面的标记,您可以看到插件将 iframe 注入该元素。所以你有类似...

<div id='map3d' style='...'>
  <div style='...'>
    <div style='...'>
      <iframe src="http://www.google.com/earth/plugin/..">
        <html>
          ...

因此,当您引用window对象时,您指的是该框架,而不是父窗口。

尝试调用window.top.location.reload();window.location.reload();显示差异。

显然,这个 hack 有点可疑

根本没有任何可疑之处,这是基本的标记。您所做的只是告诉当前frame而不是最顶层window重新加载。

于 2013-08-06T12:27:53.197 回答