【发布时间】: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