5

そのため、最初の 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();
}

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 %>

これらは両方とも、ページを更新した場合にのみ発生します。

たとえば、YouTube ビデオのあるページへのリンクをクリックしても、ロードされません。しかし、リフレッシュすればそうなるでしょう。アセット パイプライン スクリプトと同じです。最初にページをリロードした場合にのみ ajax 呼び出しが行われます。

4

4 に答える 4

7

新しいターボリンク機能の副作用のようです。リンクをクリックしても、ページは再読み込みされません<body>。AJAX 要求によって読み込まれるだけです。そう:

最初のケースでは、は最初のページの読み込み時にのみ起動され、本文はリロードされない$(function{ ... })ため、実行されていません。document.ready

2 番目のケースでは、<head>ターボリンクはリロードされず、ボディだけがリロードされます。だからあなたは古いままで、<script>再放送されません!

jquery.tubrolinksなど、ターボリンクのいくつかのオプションを確認してください。

于 2013-08-30T03:30:29.297 に答える
1

今のところ最も簡単な解決策は、jquery-turbolinksgem を使用することです。に追加してGemfile実行し、jquery 要件の直後にファイルbundle installに追加//= require jquery.turbolinksするだけです。application.js

ところで、ターボリンクの要件をそのスタックの一番下に移動するのが最善です。

于 2013-08-30T06:51:08.470 に答える
0

回避策であり、実際の解決策ではありません。そのページに向けられた URL に target='_blank' を使用すると、js が読み込まれ、追加の gem なしで正しく起動されます。

ここに私の同じ問題があります:

このように、ページ固有の js をヘッドに追加するために別のアプローチを使用しました 。js_for_a.js では、次のようなものがあります。
<%= javascript_include_tag "js_for_a" if
controller_name == "c" && action_name == "a" %>


$(function(){...})

「js_for_a」が含まれていないページからページがリクエストされた場合、この js ファイルは読み込まれません。

gem 'jquery-turbolinks' をインストール//= require jquery.turbolinksして適切な場所に追加した後、js が読み込まれません。ただし、以前にブラウザによってキャッシュされた場合は、起動されます。

誰にも解決策がありますか?

于 2013-09-29T04:06:37.867 に答える