当前位置: 首页 > 面试题库 >

如何在网络应用的单独文件中回调Google Maps init

古明煦
2023-03-14
问题内容

当我有Google Maps API片段时:

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

在中index.html,出现错误:Uncaught InvalidValueError: initMap is not a function

我想将所有bower_component,CSS,API和脚本声明保存在index.htmlYeoman支架的AngularJS
Web应用程序上的文件中。我实际上试图重新创建的地图将位于另一条路线上,我们称其为“
afterlogin”路线,仅是基本地图。我分开JS和HTML HTML组件成afterlogin.jsafterlogin.html

有很多潜在的原因。此处介绍的其中一项功能是调整调用以匹配名称空间。这需要角度服务吗?如果是这样,该服务将如何initMap在GoogleMaps api代码段的函数及其调用中起作用?

并发症之一是订购。我是Web应用程序开发人员的新手,但index.html首先我可以告诉负载,它使用代码段中的url回调了该initMap函数,该函数<script>...</script>index.html文件或app.js文件中均未提供。相反,由于init函数位于路由的js代码中,因此无法看到它,因此需要某种“命名空间”版本的调用。即使从登录路径也将导致控制台错误,甚至在div映射的位置也不会。

-—编辑:----

另请注意,在这种情况下,这并没有解决问题:

window.initMap = function(){
//...
}

这也并不适用,因为永远不会调用该函数:UncaughtInvalidValueError:initMap不是函数
------

afterlogin.js

angular.module('myappproject').controller('AfterloginCtrl', function ($scope) {

  function initMap() {
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 17,
      center: {lat: -33.8666, lng: 151.1958}
    });

    var marker = new google.maps.Marker({
      map: map,
      // Define the place with a location, and a query string.
      place: {
        location: {lat: -33.8666, lng: 151.1958},
        query: 'Google, Sydney, Australia'

      },
      // Attributions help users find your site again.
      attribution: {
        source: 'Google Maps JavaScript API',
        webUrl: 'https://developers.google.com/maps/'
      }
    });

    // Construct a new InfoWindow.
    var infoWindow = new google.maps.InfoWindow({
      content: 'Google Sydney'
    });

    // Opens the InfoWindow when marker is clicked.
    marker.addListener('click', function() {
      infoWindow.open(map, marker);
    });
  }
 });

afterlogin.html

<!DOCTYPE html>
<html>
    <head>
        <title>after login page</title>
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
        <meta charset="utf-8">
        <style>
            html, body {
                height: 100%;
                margin: 0;
                padding: 0;
                }
            #map {
                height: 100%;
            }
        </style>
    </head>
    <body>

        <div id="map"></div>

    </body>
</html>

问题答案:

由于Google Maps SDK脚本加载了同步(由于async属性),因此callbackURL中存在参数。

要解决该问题,您需要了解asyncGoogle SDK中的机制

async属性可让浏览器在加载Maps JavaScript API时呈现网站的其余部分。API准备就绪后,它将调用使用callback参数指定的函数。

https://developers.google.com/maps/documentation/javascript/tutorial#Loading_the_Maps_API

因此,解决方案是加载脚本同步:

在加载Maps JavaScript API的脚本代码中,可以省略async属性和callback参数。这将导致在下载API之前,API的加载将被阻止。

这可能会减慢您的页面加载速度。但这意味着您可以假定已加载API来编写后续脚本标签。

https://developers.google.com/maps/documentation/javascript/tutorial#sync

  1. 您可以通过async这种方式删除属性,页面将停止运行,直到脚本完成下载并在页面上运行。因此,当浏览器访问您的代码时,所有SDK对象都将可用。
  2. 现在,由于没有调用该initMap函数的代码(请记住:谁调用了它,是仅在async模式下调用它的是sdk脚本),因此您需要自己调用它。因此,只需在控制器末尾调用它即可。


 类似资料:
  • 问题内容: 据我所知,网络工作者需要用一个单独的JavaScript文件编写,并按如下方式调用: 我正在使用闭包编译器来合并和最小化我的所有JavaScript源代码,而我不必将我的工作人员放在单独的文件中进行分发。有什么办法可以做到这一点? 鉴于一流的功能对JavaScript至关重要,为什么进行后台工作的标准方法必须从Web服务器加载整个其他JavaScript文件? 问题答案: 如果您想即时

  • 我有一个javascript函数在一个单独的js文件,该文件在ASP. net应用程序的中,它调用引导烤面包机。 烤面包机留言。js。 我想从我的vue实例调用。我创建vue实例与直接脚本包含。 我不想在Vue实例之外向函数添加任何Vue依赖项。那么,调用Vue实例之外的外部js文件中的函数的正确方法是什么呢? 当我尝试使用以下方式导入时: 使用时: 我得到的错误是: 我尝试使用以下方式导入: 这

  • 问题内容: 我正在使用节点的Mean-cli packgae开发MEAN-STACK应用程序。在其中我使用Darksky Weather API(程序包名称Information)中。我在平均值应用程序的自定义文件夹中还有其他4个软件包。我如何启用CORS,以便所有API请求均不会失败并返回响应。 我用谷歌搜索,发现我必须添加这个中间件。 我应该在哪里添加。在我们使用跨域请求的每个包中或在某些全局

  • 我正在使用代码::块进行编程。我设置了一些断点,但是当我运行程序时,Code::Blocks似乎忽略了它们。 我在下检查并看到不可用(开始/继续): 程序编译运行正常,只是忽略断点。有人知道如何解决这个问题吗? 注意:我在这里检查了一下,我认为建议的答案与我无关,因为在中,我在下只有“C:\MinGW”。 编辑: 我正在使用Windows 8(64位),代码::块12.11

  • 我有一个带有websocket连接的AWS API网关。还有一个lambda(LA),它被这个API网关调用,并将一个请求连同websocket连接ID一起发送到另一个服务。在那之后它就存在了。还有另一个lambda,它正在监听某个后端数据存储。如果存在任何更新事件,数据存储服务将调用。事件包括websocket连接ID。我想让向API网关发送一个更新事件,API网关通过websocket连接将该

  • 在过去的两天里,我一直在学习React,我在理解URL参数方面遇到了困难。 假设我想要一个路由。路线的定义如下: 现在我希望在另一个文件中定义的对象能够使用值。我该怎么做?我已经找到了关于路由url参数的教程,但没有一个解释如何实现这一点。 下面是我的视图现在的样子: 在哪里可以获得详细信息中的?我试过: 但是,未定义。