Rails 4 app …在开发环境中javascript不会触发,除非刷新页面

所以我的第一个rails4应用程序出现了一个奇怪的问题,我的页面javascript没有被触发,除非我重新加载页面。

对于我的资产管道JS和内联的content_for JS都是如此。

在我的/assets/javascripts/cars.js文件中:

$(function(){ $("#car_car_make_id").on("change", function(){ //SET MODELS $.ajax({ url: "/car_makes/" + $(this).val() + "/car_models", type: "GET", dataType: "json", cache: false }) .done(function(data) { model_list(data) }) .fail(function() { alert("error"); }) }); }); function model_list(data) { $("#car_car_model_id").empty(); $.each(data, function(i,v){ $("").val(v.id).text(v.name).appendTo("#car_car_model_id"); }); //ON COMPLETE SHOW $("#car_model_div").show(); } 

带有content_for的页面内联:

   var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; function onYouTubeIframeAPIReady() { player = new YT.Player('yt_vid', { height: '390', width: '640', videoId: '' }); }   

如果我刷新页面,这两个都只会触发。

例如,如果我点击带有youtubevideo的页面链接,则无法加载。 但如果我刷新它会。 与资产管道脚本相同,如果我首先重新加载页面,它只会调用我的ajax。

看起来像新Turbolinksfunction的副作用。 单击链接时,页面不会被重新加载 – 它只是通过AJAX请求加载了 。 所以:

在第一种情况下, $(function{ ... })没有被运行,因为document.ready仅在第一页加载时触发,而不是重新加载正文。

在第二种情况下, 不会重新加载turbolinks,只是身体。 所以你留下了旧的 ,它不会重新运行!

检查turbolinks的一些选项,例如jquery.tubrolinks 。

在Rails 4中对我来说同样的问题并且解决了rmosolgo的解决方案。

首先添加jquery-turbolinks gem

 gem 'jquery-turbolinks' 

然后

 bundle install 

添加到application.js(正如我在https://github.com/kossnocorp/jquery.turbolinks上看到的那样)

 //= require jquery //= require jquery.turbolinks . . . //= require turbolinks 

并且工作完美!! 谢谢!

现在最简单的解决方案是使用jquery-turbolinks gem。 只需将其添加到您的Gemfile ,运行bundle install ,然后在jquery要求之后//= require jquery.turbolinks//= require jquery.turbolinks添加到您的application.js文件中。

顺便说一句,最好将turbolinks要求移到该堆栈的底部。

解决方法,而不是真正的解决方案:对于指向该页面的URL使用target =’_ blank’,js将被正确加载和触发,而无需额外的gem。

这是我的同样问题:

我使用了一种不同的方法在头部添加特定于页面的js,就像这样
<%= javascript_include_tag "js_for_a" if
controller_name == "c" && action_name == "a" %>

在js_for_a.js中,我有这样的事情:
$(function(){...})

当从不包含“js_for_a”的页面请求页面时,将不会加载此js文件。

在我安装//= require jquery.turbolinks -turbolinks’并在正确的地方添加//= require jquery.turbolinks之后,js将不会加载。 但如果之前被浏览器缓存,它将被触发。

有人有解决方案吗?