5

我希望把他們在Rails 4.1的項目使用jQuery的某個特定頁面上的一些簡單的JavaScript代碼:哪裏可以在Rails 4.1中放置頁面特定的jQuery代碼?

$("#my_div").on("click", function() { 
    alert($(this).text()); 
}); 

然而,使用Rails 4.1,jQuery是包含在默認情況下,HTML的盡頭。我知道我可以將它移動到標題中,或者我可以將上述內容設置爲window.onloaddocument.onload。但我猜測Rails將jQuery移動到最後是個很好的理由,所以我很好奇這裏要做的是什麼?

+0

將該文件放在公用文件夾中,並將該腳本加載到所需頁面上。雖然這不是最好的解決方案,但可能會有所幫助 –

回答

0

在你的application.js中,你可以改變它們被調用的順序,必須改變這個順序,使所有的東西都運行或者正確地載入。我必須這樣做一次,這是一項非常乏味的工作。

+0

我想我明白你在說什麼......但是,我希望JavaScript代碼只能在單個頁面上運行。我不希望該JavaScript代碼在其他任何地方運行。所以application.js不是我想要的。 –

+0

在你的佈局或html視圖文件的頂部使用javascript include標記,作爲<%= javascript_include_tag'文件路徑'%> – Babar

+0

javascript include標記仍然會在加載jQuery庫之前加載它嗎? –

0

你不應該有「頁面特定」的代碼,考慮到理論上你最終應該有一個大的JS文件。

你的代碼不是「頁面特定的」,我的意思是,如果你的頁面沒有#my_div,代碼就不會運行,但沒關係。

後澄清一下,你的代碼應該是在一個JavaScript文件中的應用程序/資產/ javascript和你應該需要它// =需要jquery_ujs或那裏的東西后yourfile(不記得現在)。

你應該把你的代碼「的document.ready」事件,這是jQuery中以這種方式處理內部:

$(function() { 
    $("#my_div").on("click", function() { 
    alert($(this).text()); 
    }); 
}); 

有關的document.ready其他細節可以在JQuery documentation

此找到確保您的代碼只在所有頁面加載後執行(包括javascript,css等),因此執行代碼時不會有任何問題。

一個例子的application.js文件可能是這樣的:

//= require jquery_ujs 
//= require yourfile 
//= require_tree . 

爲什麼Rails的把代碼在HTML結束的原因是,所以你的HTML(和CSS)可加載的JavaScript前觀看代碼(這是一項沉重的操作),因此用戶可以通過這種方式開始交互/閱讀您的網站。同樣以這種方式,你可以確保一切正確加載,最後一個元素應該被解析。
如果我沒有錯,我記得有關「javascript的同步加載」,我不記得是網絡請求還是實際加載的JavaScript文件,但我記得腳本標記是阻止之一,瀏覽器將不會繼續解析HTML(或渲染CSS),而它正在加載您的JavaScript文件,這就是爲什麼它在HTML的末尾作爲最後一個元素。

編輯1: 通過重新閱讀您的問題,恐怕您實際上是直接在html中插入一些JavaScript代碼。如果是這樣的話,至少在rails包含jquery之後插入它。
在任何情況下,練習是錯誤的,除非你正在建立一個大型的Web應用程序與大量的JavaScript(你可能會使用像requirejs的東西),沒有理由不會有一個單一的JavaScript文件(多個請求比單個請求慢,你應該總是將css合併爲一個,對於javascript也是如此)。正如我所說的,沒問題,您的代碼可以包含在的所有頁面中,只要確保#my_div僅存在於實際需要該代碼運行的位置。

這可能是更好的約束你的代碼一類以這種方式(這可能是做正確的方式):

$(".js-spam-text").on("click", function() { 
    alert($(this).text()); 
}); 

很抱歉的名稱,替換JS-垃圾郵件的文本與任何你要。例如js-alert-message這是一個很好的候選人。

+1

在某些情況下,您希望只爲單個頁面執行JavaScript/jQuery代碼 –

+0

如果是這種情況,請使用某種** If **來實現,您可以隨時將一個類添加到body標籤並執行只有在body標籤存在的情況下(或者即使某個特定的類在頁面中存在的任何地方),該頁面的腳本也是如此。不要用不同的方式來完成,你只能在特定的頁面上執行javascript代碼,而不會將它分成多個javascript文件。有**沒有理由**沒有在一個文件中的JavaScript。如果你需要在你的視圖和你的javascript之間共享一些數據,並且你不想執行ajax調用,請使用gon:https://github.com/gazay/gon –

+0

我同意,絕對有些情況你只需要該代碼在一個頁面上。具體來說,對於部分。我明白爲什麼一個人會希望所有的javascript代碼位於可維護性的中心位置,但我不同意大致概括如何執行以及在哪裏存儲。 – Tass

相關問題