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

相关问题