3

我正在尝试使用 Google Earth 插件,发现它的调用方式相当特别:如果在 Javascript 执行的主要流程之外调用(例如通过 setTimeout),它只是拒绝调用负载打回来。下面的例子是独立的插图。更改更改最后两行中的哪一行被注释掉以查看它是否有效。

这是怎么回事?

<html>
<head>
  <title>Sample</title>
  <script type="text/javascript" src="https://www.google.com/jsapi"> </script>
  <script type="text/javascript">
      var ge;
      function init() {
        console.log('Initing');
        function cb(instance) {
          ge = instance;
          ge.getWindow().setVisibility(true);
          console.log('Ok');
        };
        function fail() {}
        google.earth.createInstance('map3d', cb, fail);
      }
      function loadTheMap() {
        google.load("earth", "1.x");
        google.setOnLoadCallback(init);
        console.log('Callback is set');
      }
      //loadTheMap(); // works
      setTimeout(loadTheMap, 200); // Does not work
  </script>

</head>
<body>
  <div id="map3d" style="height: 400px; width: 600px;"></div>
</body>
</html>
4

1 回答 1

6

这是一个时间问题。

google.setOnLoadCallback()允许您指定在页面加载时调用的函数。

当你setTimeout()这样使用时,它是在页面加载setOnLoadCallback() 后调用的,所以它永远不会调用你的函数。

而不是使用google.setOnLoadCallback()你可以这样做:

  function loadTheMap() {
    google.load("earth", "1.x", {"callback" : init});
    console.log('Callback is set');
  }

  setTimeout(loadTheMap, 200);

不过我有点困惑,因为谷歌文档说地球不支持动态加载,但我已经在 api samples 中看到了它,它对我有用(在 Chrome 中)。

于 2013-03-22T16:56:11.883 回答