You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google Maps API时控制台报‘init is not a function’错误求助

解决Google Maps API报错:init is not a function

嘿,我帮你捋捋这个报错的问题——你遇到的InvalidValueError: init is not a function,本质是Google Maps API加载完要调用init函数时,压根找不到这个函数在哪儿!结合你的代码来看,主要是两个关键问题:


第一个大问题:你没在HTML里引入自己的脚本啊!

看你的HTML代码,只加载了Google Maps的脚本,但定义init函数的index.js完全没被引入页面!这就导致index.js里的代码根本没机会执行,window.init自然不存在,Maps API找不到函数可不就报错了嘛。

第二个小隐患:ES模块的异步加载顺序

因为你的index.js用了import语句,属于ES模块,模块脚本的加载是异步的。就算你加了脚本标签,如果Maps API先加载完,那时候init还没挂到全局上,照样会报错。


一步步来解决:

1. 先在HTML里加上业务脚本的引入

修改你的HTML,把index.js的脚本标签加上,注意因为是ES模块,要加type="module":

<body>
  <div id="map"></div>
  <div id="panorama"></div>
  <!-- 先引入我们自己的脚本,让它先执行 -->
  <script type="module" src="./index.js"></script>
  <!-- 再加载Google Maps的脚本 -->
  <script src="https://maps.googleapis.com/maps/api/js?key=******&callback=init" async defer></script>
</body>

2. 确认init函数确实挂到全局了

你的index.js里已经写了window.init = init;,这步是对的!因为ES模块的顶层作用域不是全局作用域,必须手动把函数挂到window上,Maps API才能找到它。

3. 更稳妥的方式:动态加载Maps API(可选)

如果还是担心异步加载的顺序问题,可以去掉Maps脚本的callback参数,改成在我们自己的脚本里动态加载API,等API加载完再执行初始化:

// index.js
import { initMap } from './map'
import { buildAllDreams } from './dream'

// 动态加载Google Maps API
function loadGoogleMaps() {
  const script = document.createElement('script');
  script.src = `https://maps.googleapis.com/maps/api/js?key=******`;
  script.async = true;
  script.onload = () => {
    // 等API加载完,再调用初始化函数
    init();
  };
  document.body.appendChild(script);
}

function init() {
  initMap();
  buildAllDreams();
}

// 启动加载流程
loadGoogleMaps();

这种方式完全不会有“找不到函数”的问题,因为我们是主动在API就绪后才执行初始化逻辑的。


最后再检查两个小细节:

  • 确认index.js、map.js的文件路径是对的,别出现404(可以在浏览器开发者工具的Network标签里看看这些文件有没有成功加载)。
  • 确认你的Google Maps API密钥是有效的,没有被限制使用或者过期。

内容的提问来源于stack exchange,提问作者elodie Moret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:07:36