【问题标题】:Rails: Calling a Javascript function at the end of the pageRails:在页面末尾调用 Javascript 函数
【发布时间】:2013-09-17 13:51:16
【问题描述】:

我的 assets/javascripts/ 目录中有一个 js 文件。这个文件被 rails 正确拾取(当我检查页面的 head 标签时,我可以在 firebug 中看到它)

我正在我的 application.js 中从这个 js 文件调用一个函数,如下所示:

//
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require_tree .

$(window).load(function(){
    Boxlayout.init();
});

我在某处读到,init() 函数必须用.load 函数调用,以便在加载 DOM 后调用它们。

但是这里的 javascript 不起作用。

相反,当我明确包含 js 文件时:

<%= javascript_include_tag "file.js" %>  

在页面底部并从 application.js 调用相同的 init 函数,javascript 工作正常。

我不想明确包含该文件。 (想用rails的方式来做)。那么我该如何使用第一种方法呢?

编辑

使用 Rails 3.2.14(无 Turbolinks)。

虽然 Javascript 在本地运行良好,但 无法在 Heroku 上运行

【问题讨论】:

  • 请显示您的 application.js 文件
  • @lol007 更新了问题
  • 顺便说一句,.load(…) 在 jQuery 1.8 中已被弃用;你应该使用.on("load", …)
  • 你在使用turbolinks吗?如果是这样, $(window).load 将不会被调用。 Turbolinks 替换了页面的正文,这就是当您将脚本嵌入正文时运行脚本的原因。
  • @superluminary 不。我使用的是 Rails 3.2.14,没有 turbolinks。

标签: javascript ruby-on-rails asset-pipeline


【解决方案1】:

尝试改变

$(window).load(function(){

进入

$(document).ready(function(){

【讨论】:

  • 请注意,这意味着不同的东西。 load 将等待所有图像和 CSS 完成下载,而​​ ready 在 HTML 下载完成且 DOM 加载到内存后立即运行。
  • 当我删除 js 文件的 &lt;%= include_tag %&gt; 时,这仍然不起作用
  • @RoryO'Kane 我想使用.load 函数。想要在加载完所有 css 后执行 js。
【解决方案2】:

你有 //= require_tree 。在 application.js 中将尝试在 assets/javascripts/ 目录中创建新文件 *.js,并将您的代码附加到那里。

【讨论】:

  • 那又怎样?我知道。
【解决方案3】:

我认为这是一个 turbolinks 问题。

当您单击链接时,Turbolinks 通过 AJAX 交换页面主体,但头部保持不变。因为 CSS 和 JavaScript 仅在浏览会话开始时才被下载和解析,所以您的速度会得到显着提升。

缺点是不会触发您的 jQuery 加载事件。这解释了为什么当您将脚本嵌入到页面正文中时脚本正在执行,而不是在正确放置在头部时执行。

尝试包含 jQuery turbolinks gem。这将在激活 turbolink 时触发预期的 jQuery 事件。

https://github.com/kossnocorp/jquery.turbolinks

【讨论】:

  • 我没有使用 Turbolinks。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
相关资源
最近更新 更多