2013-03-22 1 views
3

Я пытаюсь использовать плагин Google Планета Земля и обнаружил, что он довольно специфичен в том, как он называется: если вызывается вне основного потока выполнения Javascript (например, через setTimeout), он просто отказывается вызывать обратный вызов нагрузки. Пример ниже - это отдельная иллюстрация. Измените изменение, какая из последних двух строк закомментирована, чтобы увидеть, как он работает или нет.google.load никогда не вызывает обратный вызов

Что происходит?

<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> 

ответ

6

Это проблема с синхронизацией.

google.setOnLoadCallback() позволяет указать функцию, вызываемую при загрузке страницы.

При использовании setTimeout() так, он звонит setOnLoadCallback()после страница уже загружена, поэтому он никогда не называет вашу функцию.

Вместо использования google.setOnLoadCallback() вы можете сделать это:

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

    setTimeout(loadTheMap, 200); 

Я немного запутался, хотя, потому что Google docs сказать, что динамическая нагрузка не поддерживается для Земли, но я видел it done in the api samples, и работает для меня (в Chrome).