你不应该有“页面特定”的代码,理论上你应该有一个大的 JS 文件。
您的代码不是“特定于页面”的,我的意思是,如果您的页面中没有#my_div,代码将无法运行,但没关系。
在此澄清之后,您的代码应该在 app/assets/javascript 的 javascript 文件中,并且您应该在 jquery_ujs 之后使用 //= require 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 末尾的原因是为了在加载 javascript 代码(这是一个繁重的操作)之前可以查看您的 html(和 CSS),以便用户可以开始交互/阅读您的网站这样。同样通过这种方式,您可以确保正确加载所有内容,因为应该解析最后一个元素。
如果我没记错的话,我记得一些关于“同步加载 javascript”的内容,我不记得是网络请求还是实际加载了 javascript 文件,但我记得 script 标签是 blocking 一,浏览器在加载你的javascript文件时不会继续解析html(或渲染css),这就是为什么它在html末尾作为最后一个元素的原因。
编辑 1:
通过重新阅读您的问题,恐怕您实际上是直接在 html 中插入了一些 javascript 代码。如果是这种情况,至少在 jquery 包含在 rails 之后插入它。
无论如何,这种做法是错误的,除非您正在使用大量 javascript 构建大型 Web 应用程序(并且您可能会使用 requirejs 之类的东西),否则没有理由不使用单个 javascript 文件(多个请求比单个请求慢,您应该始终将 css 合并为一个,对于 javascript 也是如此)。正如我所说,没问题,您的代码可以包含在所有页面中,只需确保#my_div 仅出现在您真正希望该代码运行的位置。
以这种方式将代码绑定到一个类可能会更好(这可能是正确的做法):
$(".js-spam-text").on("click", function() {
alert($(this).text());
});
对不起这个名字,用你想要的任何东西替换 js-spam-text。例如 js-alert-message 它是一个很好的候选。