使用 geoxml3.js 和 ProjectedOverlay.js 显示 KMZ 文件时出现 Google is undefined 错误

Google is undefined error when using geoxml3.js and ProjectedOverlay.js to display KMZ file

我有一个使用 Google 地图 API JavaScript 来显示地图的网站。我还使用 geoxml3 和 ProjectedOverlay 在地图上显示 KMZ/KML 文件。

我的脚本:

<script async defer src="//maps.googleapis.com/maps/api/js?key=API_KEY_HERE&libraries=places"></script>
<script type="text/javascript" src="/js/geoXML/ZipFile.complete.js"></script>
<script type="text/javascript" src="/js/geoXML/geoxml3.js"></script>
<script type="text/javascript" src="/js/geoXML/ProjectedOverlay.js"></script>
<script src="/js/app.js"></script> 

加载页面时出现错误:

Uncaught ReferenceError: google is not defined at ProjectedOverlay.js

Uncaught ReferenceError: google is not defined at PROJECT_NAME:115

会被抛出。

第 115 行如下:

google.maps.event.addDomListener(window, 'load', initMap);

然而,它们并不总是被抛出。这种情况可能每 10 次我加载页面就会发生一次。

问题是 google 脚本正在异步加载。 geoxml3.js 和 ProjectedOverlay.js 需要 Google 地图 API 完全连接并加载才能工作。

如果异步加载,其他 JS 脚本之一将在 Google API 加载之前加载,从而引发错误。

简单的解决方案是删除 Google API 脚本中的异步延迟:

<script src="//maps.googleapis.com/maps/api/js?key=API_KEY_HERE&libraries=places"></script>

是的,当您在加载前使用 google 时会发生这种情况。这是一个非常常见的问题。所以做一个这样的回调函数:

<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">

<script>
   function initMap() {
       var mapDiv = document.getElementById('map');
       var map = new google.maps.Map(mapDiv, {
          zoom: 8,
          center: new google.maps.LatLng(-34.397, 150.644)
        });
      }
</script>