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

Joe*_*nas 5 javascript ruby-on-rails ruby-on-rails-4

所以我的第一个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){ 
        $("<option />").val(v.id).text(v.name).appendTo("#car_car_model_id");
    });
    //ON COMPLETE SHOW
    $("#car_model_div").show();
}
Run Code Online (Sandbox Code Playgroud)

带有content_for的页面内联:

<% content_for :head do %>
<script type="text/javascript">
    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: '<%= @timeslip.youtube_id %>'
        });
    }
</script>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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

rmo*_*lgo 7

看起来像新Turbolinks功能的副作用.当您单击链接时,页面不会被重新加载 - 它只是<body>通过AJAX请求加载它.所以:

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

在第二种情况下,<head>没有重新加载turbolinks,只是身体.所以你留下了旧的<script>,它不会重新运行!

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

  • 我禁用了turbolinks,这导致了这个问题.但是,我认为这可能不是解决问题的最佳方法.我将进一步研究它,看看是否有办法让我的代码与turbolinks一起工作.谢谢 (2认同)