【问题标题】:Google maps doesn't show until I refresh在我刷新之前,Google 地图不会显示
【发布时间】:2013-11-04 17:40:05
【问题描述】:

我按照官方文档中的这些简单说明进行操作:https://developers.google.com/maps/documentation/javascript/tutorial

当我第一次打开该网站时一切正常。地图显示正常。问题是当我导航到网站的其他部分时。回到地图应该在的位置后,地图不显示了。

这是基本结构:

<ul>
  <li><%= link_to "Home", root_path %></li>
  <li><%= link_to "About",   about_path %></li>
  <li><%= link_to "Contact", contact_path %></li>
</ul>

“联系人”中的 Javascript:

    <script type="text/javascript"
      src="https://maps.googleapis.com/maps/api/js?key=xxx&sensor=false">
    </script>
    <script type="text/javascript">
      function initialize() {
        var mapOptions = {
          center: new google.maps.LatLng(-34.397, 150.644),
          zoom: 8,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map-canvas"),
            mapOptions);
      }
      google.maps.event.addDomListener(window, 'load', initialize);
    </script>

<h1>Contact</h1>
<p>
  Address & phone number
</p>

<div id="map-canvas" style="width: 35em; height: 35em;"/>

所以,如果我在“主页”页面上打开网站,然后导航到“联系方式”,则没有地图。但是如果我刷新“联系人”站点,就会出现地图。可能是什么问题?

谢谢。

EDIT1:

我试图将我的代码放入准备好的函数中:

$.getScript('https://maps.googleapis.com/maps/api/js?key=xxx&sensor=false');

        var mapOptions = {
          center: new google.maps.LatLng(-34.397, 150.644),
          zoom: 8,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map-canvas"),
            mapOptions);

但是当我这样做时,代码会在这一行中断:

center: new google.maps.LatLng(-34.397, 150.644),

【问题讨论】:

  • 是的,我使用的是 Rails 4。
  • 好吧,由于 turbolinks,将 google 脚本放入您的布局中以进行快速修复。顺便说一句,我刚刚发布了新版本的 gmaps4rails,它可以提供帮助!
  • @apneadiving - 我应该把谷歌脚本放在哪里?我将它们放在views/layouts/application.html.erb 中,但只有在我刷新“联系”页面时它仍然有效。如果我打开主页并单击“联系”,则没有地图。地图仅在我刷新该页面时显示。
  • 不明白这个问题,对不起
  • @ZdravkoVajudin 请你制作一个 jsfiddle.net 来说明这个问题吗?您可能只需要使用您的 rails 应用程序生成的原始 HTML。

标签: javascript jquery ruby-on-rails google-maps


【解决方案1】:

您是否使用启用了 turbolinks 的 Rails 4?如果是这样,当您从主页移动到联系人页面时,load 事件将不会触发 - 但点击刷新会完全加载整个页面,因此会触发 load 事件。这与您描述的行为一致。

尝试将其添加到脚本块的末尾,除了'load' 行:

google.maps.event.addDomListener(window, 'page:load', initialize);

【讨论】:

  • 谢谢,但没有任何区别。我还需要刷新。
  • 可能该窗口不是 'page:load' 事件的正确范围。 Akshat 引用的 jQuery $(document).ready 和 $(document).on('page:load') 事件侦听器将是合适的触发器 - 您可以用 jQuery 替换 Google 建议的侦听器。
  • 我尝试了很多组合,但都不起作用。我更新了我的问题。
  • 我仍然相信您的问题与使用 turbolinks 有关。我会尝试禁用 turbolinks (instructions here) 并查看地图是否正确更新。如果是这样,并且您仍想使用 turbolinks,则重新安装 turbolinks 并更新侦听事件的 javascript 代码。
  • 我收到以下错误:Uncaught TypeError: Cannot read property 'event' of undefined。有什么想法吗?
【解决方案2】:

只需为初始化谷歌地图的函数提供延迟,它就可以正常工作。

setTimeout(function() {
  //code for initializing the google map
}, 1000);

【讨论】:

    【解决方案3】:

    将超时设置为六秒对我有用。地图越大,花费的时间就越长,因此请根据您的地图大小来衡量您的超时时间。

    【讨论】:

      【解决方案4】:

      很难说可能出了什么问题。当您说您导航到网站的其他部分时,它们是否都包含在一个 HTML 文件中?或者也许它们是用 AJAX 动态加载的?当地图显示不正确时,尝试在地图上触发调整大小事件。

      google.maps.event.trigger(map, 'resize');
      

      或者,当您“导航”到它应该在但没有显示的地方时,可以调用它。

      【讨论】:

      • 它们并不都包含在一个 HTML 文件中。问题是每次单击其他链接时地图都会消失。仅刷新地图所在的站点会显示地图。
      • 不幸的是,google.maps.event.trigger(map, 'resize');没有帮助。
      【解决方案5】:

      问题似乎出在您的 turbolinks 上,将您的所有活动绑定在一个函数中,然后在 document.readydocument.page:load 事件上调用该函数。

      $(document).ready( PageSetupFunction );
      $(document).on("page:load", PageSetupFunction );
      

      其实这里document.ready会在你刷新页面的时候被调用。但是 page:load 事件将在您从另一个链接进入该页面时被调用。

      【讨论】:

      • 我尝试了很多组合,但无法让它发挥作用。我将此代码放入准备好的函数中: $.getScript('maps.googleapis.com/maps/api/js?key=xxx&sensor=false'); var mapOptions = { center: new google.maps.LatLng(-34.397, 150.644), zoom: 8, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); -- 问题是当我输入该代码时,没有任何效果,甚至其他之前有效的 Javascript 函数也不起作用。
      • 虽然我没有使用谷歌地图,但我在使用谷歌图表 api 时遇到了同样的问题。似乎您的 javascript 中有一些错误会阻止它旁边的所有其他脚本执行,您必须在浏览器控制台中检查它
      • 是的,错误在这里:中心:新的 google.maps.LatLng(-34.397, 150.644)。我不知道如果它是来自 google 的 c/p,那为什么会出现问题。
      【解决方案6】:

      我已经修复了使用 jQuery 加载页面后触发代码的问题

      $(document).on("pageshow","#contact",function(){
        initialize();
      });
      

      【讨论】:

        猜你喜欢
        • 2017-09-15
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多