如何解决“不支持在没有回调的情况下加载 Google Maps JavaScript API”的问题

Mur*_*ugu 73 javascript

如何修复以下控制台错误。

  1. Loading the Google Maps JavaScript API without a callback is not supported
  2. InvalidValueError: not an instance of HTMLInputElement

由于上述错误,我的职位没有显示在 Google 搜索结果中。

我不是开发人员,所以我需要建议来解决这个问题。我将在我的 WordPress 网站中进行必要的更改。

Lin*_*y D 189

长话短说

用作noopFunction.prototype回调来快速消除错误消息。

https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=Function.prototype
Run Code Online (Sandbox Code Playgroud)

完整说明

根据Google Maps API 文档,该callback参数已经被需要很长时间了。然而,实际上,谷歌最近(在过去几天内)才开始执行这一要求。

虽然它似乎没有破坏任何东西,但它现在在控制台中显示一条丑陋的错误消息......

不支持在没有回调的情况下加载 Google Maps JavaScript API。

我该如何修复它?

简短的答案是指定一个callback值。设置外部 API 库加载完成后您想要触发的 JavaScript 函数的名称。

https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=FUNCTION_NAME
Run Code Online (Sandbox Code Playgroud)

请注意,您必须指定真实的函数名称!否则,您将触发“不是函数”错误消息,并且只是用一个错误消息交换另一个错误消息。

但我没有/需要回调函数!

如果您实际上没有库加载后立即运行的回调函数,则可以将其用作noopFunction.prototype替代。

https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=Function.prototype
Run Code Online (Sandbox Code Playgroud)

Function.prototype方法是 JavaScript 原生的,并且绝对不执行任何操作...这正是您在这种情况下所需要的!

有关 的更多信息Function.prototype,请参阅这个不相关的 SO 线程...


小智 6

我实际上创建了一个 noop 函数,这样我就可以跟踪它的调用时间。

function gmNoop() { console.log('GMap Callback') }
Run Code Online (Sandbox Code Playgroud)

然后将其添加到我的 Google 地图 API 资源请求中。

https://maps.googleapis.com/maps/api/js?key='.GOOGLEMAPSKEY.'&callback=gmNoop
Run Code Online (Sandbox Code Playgroud)

我需要这个的原因是因为我的应用程序在其他先决条件之后调用 initMap() 。在这些其他资源之前调用 initMap() 将加载没有标记的地图。


小智 1

我刚刚发现这个视频可能对您有帮助:

https://www.youtube.com/watch?v=1asukrHEqMM&ab_channel=KnowledgeBase

它对我没有多大帮助,因为我的问题略有不同,但让我知道了该走什么路。希望它对您有帮助。祝你好运

::::::::::编辑::::::::::

基本上,要消除此错误,您需要做的是在运行进行 API 调用的脚本之前声明函数(又名 initMap)。

initMap 函数是创建谷歌地图并赋予其特征等的函数。

initMap 函数如下所示:

function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8,
  });
}
Run Code Online (Sandbox Code Playgroud)

API 调用是我们放置 API-KEY 的脚本行。

<script defer type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=API-KEY&libraries=places&callback=initMap"></script>
Run Code Online (Sandbox Code Playgroud)

我找到了两种方法来做到这一点,第一种方法是:有一个模块,您只需在 API 之前使用 src 脚本调用该模块。

例子:

<html>
    <head>
        <script defer src="js/scripts.js" type="module"></script>
        <script src="js/module/google.js"></script>
        <script defer type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=API-KEY&libraries=places&callback=initMap"></script>
    </head>
    <body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

google.js 提供了 initMap() 函数的保护


第二种方法是:在调用 API 之前将所有代码写入脚本标记内。

例子:

<html>
    <head>
        <script defer src="js/scripts.js" type="module"></script>
        <script>
            function initMap(): void {
            map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
            center: { lat: -34.397, lng: 150.644 },
            zoom: 8,
            });
            }
        </script>
        <script defer type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=API-KEY&libraries=places&callback=initMap"></script>
    </head>
    <body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

请注意,我使用defer以便代码在页面底部加载,这只是我的风格,因为我喜欢在 head元素中声明所有内容。