【问题标题】:Google Places autocomplete on a Rails app not working reliablyRails 应用程序上的 Google Places 自动完成功能无法可靠运行
【发布时间】:2014-09-05 10:45:57
【问题描述】:

我的 Rails 应用程序中有一个表单,我在其中使用 Google Places API 进行自动完成,但我无法让它每次都正常工作。每次加载表单所在的页面时,就像掷骰子一样:有时 JS 有效,有时无效。

顺便说一句,我有几个其他的 javascripts 有时也无法工作,但用于谷歌自动完成的那些是最古怪的,它们是关键任务。

设置如下:

1° 我的 html 标头有:

<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= yield :javascript_includes %>

然后在我的身体里,我有 content_for 标记在头部产生

<% content_for :javascript_includes do %>
  <%= javascript_include_tag "application", "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places" %>

  <script type="text/javascript">
     function initializeAutocomplete(){
       var input = document.getElementById('offer_location');
       var options = {
         types: ['(cities)']
       };

       var autocomplete = new google.maps.places.Autocomplete(input, options);

       google.maps.event.addListener(autocomplete, 'place_changed', function() {
         var place = autocomplete.getPlace();
         var lat = place.geometry.location.lat();
         var lng = place.geometry.location.lng();
         $('#offer_latitude').val(lat)
         $('#offer_longitude').val(lng)
       });
     }
     google.maps.event.addDomListener(window, 'load', initializeAutocomplete);
  </script>
<% end %>

我曾经将带有 initializeAutocomplete 的脚本放在一个单独的 .js 文件中,该文件是通过 Asset Pipeline 加载的,但结果相似:自动完成功能只工作了一半...(实际上我什至觉得它失败了更频繁)

我认为问题与加载不同元素的时间以及触发回调的时间有关。以下是我尝试更改的示例:

  • 使用$(window).load$(document).ready 代替addDomListener(window, 'load', initializeAutocomplete)

  • 将脚本放在资产管道中加载的单独google-autocomplete.js文件中(这意味着它是在content_for标签中提供的API链接之前加载的

  • 将脚本放入单独的 google-autocomplete.js 文件中,该文件不包含在资产管道中,并在 content_for 标记中的 API 链接标记之后立即调用

非常感谢您的帮助!

-- 编辑--

最后结果证明是 turbolinks 搞乱了我的 jquery 触发器,尤其是用于 google 自动完成的触发器。找到了答案there,我用它修复了我所有的 JS。

【问题讨论】:

  • 我遇到了同样的问题 - 这对我有用 ubilabs.github.io/geocomplete/examples/simple.html
  • 你知道它到底是做什么的吗?
  • 您在项目中使用 Turbolinks 吗?如果您的脚本在您第一次加载页面时工作,但在您使用网站内另一个页面的链接导航到它时却没有,那么这可能是因为 Turbolinks!
  • 是的,我使用涡轮链接。我应该有选择地为有问题的脚本关闭它吗?还是为所有 Javascript 关闭它?
  • 这可能是渲染/加载问题。试试这个...stackoverflow.com/questions/10808109/script-tag-async-defer

标签: javascript ruby-on-rails asset-pipeline google-places-api google-places


【解决方案1】:

不确定这是否解决了您的实际错误,但请尝试使用$(function() {initializeAutocomplete()}); 调用该函数 - 这是$(document).ready(function(){ 的更简洁的替代方法

我会这样设置:

<% content_for :javascript_includes do %>
  <%= javascript_include_tag "application", "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places" %>

  <script type="text/javascript">
     function initializeAutocomplete(){
       var input = document.getElementById('offer_location');
       var options = {
         types: ['(cities)']
       };

       var autocomplete = new google.maps.places.Autocomplete(input, options);

       google.maps.event.addListener(autocomplete, 'place_changed', function() {
         var place = autocomplete.getPlace();
         var lat = place.geometry.location.lat();
         var lng = place.geometry.location.lng();
         $('#offer_latitude').val(lat)
         $('#offer_longitude').val(lng)
       });
     }
     $(function() {
       initializeAutocomplete();
     });
  </script>
<% end %>

所以你定义你的函数,然后等到 dom 完成加载。

这并不能解释为什么它有时有效,但有时无效。我会通过使用console.log()从函数中注销东西来进行调查

【讨论】:

  • 我试过你建议的听众。它似乎工作得更好,但仍然不是每次。当它在第一页加载时失败时,如果我刷新它通常会起作用。这是否让您知道问题出在哪里?
  • 不是真的没有。尝试沿着日志记录路线走下去。
【解决方案2】:

这可能是渲染/加载问题。

试试这个……

<%= javascript_include_tag "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=place", async: => true, :defer => true %>

在这里阅读更多...

Script Tag - async & defer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多