“initMap is not a function” error in JS console (Google Maps API)
我很感激它已经被多次询问了,但是我找不到解决它的方法,并且使用initMap函数作为单独文件加载脚本。
让我解释:
我正在呼叫Google Maps API:
1 2 | <script src="https://maps.googleapis.com/maps/api/js?key=MYAPIKEY&callback=initMap" async defer> |
其次是我的捆绑主JS文件,其中包含initMap函数。
1 | <script src="/js/main.js"> |
我有标题中的错误。
我试图做的是:
- 首先加载main.js-同样的错误。
- 将两个脚本移动到头部-同样的错误。
- 第二次加载main.js-同样的错误。
- 在页面顶部(头部)和底部(正文末尾之前)之间分别调用两个脚本(每种方式)-相同的错误。
有效的方法是按以下方式在页面内调用该函数:
1 2 | function initMap() { //rest of the code |
并将其放在api调用之后。
我很欣赏这是解决控制台错误消息最初问题的方法,但是我想像其他JS一样从主js文件中启动并调用此函数。
任何帮助和解释,将不胜感激:)谢谢
编辑1-在下面添加了更多代码,并将函数移到了main.js文件的顶部
所以main.js现在看起来像-webpack blob,开头是:
1 2 3 4 5 6 7 | function initMap() { var uluru = { lat: 40.741895, lng: -73.989308 }; var map = new google.maps.Map(document.getElementById('map'), _defineProperty({ center: { lat: 40.741895, lng: -73.989308 }, zoom: 14 }, 'center', uluru)); var marker = new google.maps.Marker({ position: uluru, map: map }); } |
错误仍然会发生,因此地图不会加载。
编辑2-在您提出意见和建议后还要进行更多测试。
当我使用JS bin代码尝试全局作用域时,它也不起作用。
因此,我将代码手动导出到单独的文件中,然后将其加载为
1 | <script src="/js/Maps.js"> |
而且有效。
它表明,以某种方式webpack和babel导致了问题...也许我应该以某种方式对module.export函数进行处理?
我的main.js(预打包-用于webpack)如下所示:
1 2 | require('./base/main'); require('./modules/Maps'); |
而Maps.js(预捆绑)最后没有任何导出。
好吧,我知道了。
问题是webpack不能给initMap一个全局范围。
几个解决方案:
-
将
window.initMap = initMap; 添加到Maps.js的末尾以使其具有全局作用域 -
添加对象
var initMapObj = require('./modules/Map'); initMapObj.initMap();
更多阅读:
如何将Webpack与Google Maps API结合使用?
Webpack:如何导出功能?
Webpack捆绑包中的导出功能