2013-08-30 13 views
5

Mam więc dziwny problem z moją pierwszą aplikacją Rails4, w której moja strona javascript nie uruchamia się, chyba że ponownie załaduję stronę.Rails 4 app ... w środowisku programistycznym javascript nie jest uruchamiany, chyba że strona jest odświeżana

Dotyczy to zarówno mojego potoku potoku JS, jak i inline z content_for JS.

w moim /assets/javascripts/cars.js pliku:

$(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(); 
} 

inline na stronie z 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 %> 

Obie te tylko ogień gdybym odśwież stronę.

Na przykład, jeśli kliknę link do strony z filmem youtube, nie zostanie załadowany. ale jeśli to odświeżę, będzie. To samo ze skryptem potoku zasobów, to powoduje, że wywoływane jest moje wywołanie ajax, jeśli najpierw ponownie załaduję stronę.

Odpowiedz

7

wygląda jak efekt uboczny nowej funkcji Turbolinks. Po kliknięciu łącza strona nie jest ponownie ładowana - po prostu ładuje się jej <body> za pomocą żądania AJAX. A więc:

W pierwszym przypadku $(function{ ... }) nie jest uruchamiany, ponieważ document.ready jest uruchamiany tylko przy ładowaniu pierwszej strony, a nie ponownie ładowany.

W drugim przypadku <head> nie jest ponownie obciążany turbolinkami, tylko ciałem. Zostajesz więc ze starym <script> i nie jest on ponownie uruchamiany!

Sprawdź niektóre opcje turbolinków, takie jak jquery.tubrolinks.

+2

Wyłączono turbolinks i to było przyczyną problemu. Uważam jednak, że może nie być najlepszym rozwiązaniem tego problemu. Zbadam to dalej i zobaczę, czy istnieje sposób, aby mój kod działał z turbolinkami. dziękuję –

+0

Skończyło się na tym, że próbowałem dodać klejnot jquery.turbolinks, a następnie dodałem go do manifestu JS. Naprawiono skrypt gotowy do dokumentu. Jednak nadal nie zrobił treści content_for javascript. Więc wtedy przeniosłem moją zawartość do pisania wewnątrz znacznika body, jednak to nadal nie rozwiązało problemu content_for issue. Skończyło się na tym, że wracam do wyłączania turbolinków. –

+0

Dlaczego należy włączyć javascript w content_for? Dlaczego nie skorzystać z potoku zasobów i pozwolić przeglądarce na natychmiastowe buforowanie całego javascript? – Almaron

1

Najprostszym rozwiązaniem jest użycie klejnotu jquery-turbolinks. Po prostu dodaj go do swojego Gemfile, uruchom bundle install, a następnie dodaj //= require jquery.turbolinks do swojego pliku application.js zaraz po żądaniu jquery.

Przy okazji, najlepiej przenieść wymaganie turbolinków na dół tego stosu.

+0

Jak wspomniano w powyższym komentarzu (drugi w odpowiedzi na rmosolgo) jquery-turbolinks naprawił połowę problemu. ale nie naprawiłem zawartości dla javascipt, nawet gdy przeniosłem wydajność wewnątrz znacznika body –

+0

Dziękuję za wzmiankę o zamówieniu tutaj, @almaron. Wystąpiły problemy i gdy upewniłem się, że 'wymagają turbolinks' było wcześniej' wymagało jquery.turbolinks' byłem w biznesie –

0

Rozwiązanie, a nie prawdziwe rozwiązanie: użyj target = "_ blank" dla adresu URL skierowanego na tę stronę, js zostanie załadowany i uruchomiony poprawnie bez dodatkowego klejnotu.

Oto ten sam problem z kopalni:

użyłem innego podejścia do Doddaj specyficzne js w głowę, jak to
<%= javascript_include_tag "js_for_a" if
controller_name == "c" && action_name == "a" %>

W js_for_a.js, mam coś takiego:

Gdy strona jest żądana ze strony nie zawierającej "js_for_a", ten plik js nie zostanie załadowany.

Po zainstalowaniu gem jquery-turbolinks i dodaniu //= require jquery.turbolinks we właściwym miejscu, js nie zostanie załadowany. Ale jeśli wcześniej buforowana przez przeglądarkę, zostanie uruchomiona.

Ktoś ma rozwiązanie?

+0

Proszę nie podawać pytań w odpowiedzi. –

3

Ten sam problem dla mnie w Rails 4 i rozwiązuje to rozwiązanie rmosolgo.

najpierw dodać jquery-turbolinks gem

gem 'jquery-turbolinks' 

następnie

bundle install 

Dodaj do application.js (jak widziałem w https://github.com/kossnocorp/jquery.turbolinks)

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

i działa idealnie !! Dzięki!

Powiązane problemy