Rails资产管道:JavaScript被执行两次

时间:2014-07-08 06:01:54

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

我的JavaScript正在执行两次。当我运行Chrome调试器时,我注意到单个JavaScript文件将在第一次执行代码,之后,application.js文件将再次执行代码。

我相信这种情况正在发生,因为我最近关闭了预编译,因为我遇到了Heroku的问题。在此之后我跑了rake assets:precompile

3 个答案:

答案 0 :(得分:10)

<强> Turbolinks

可能Turbolinks存在问题(考虑到您已将其包含在资产管道中);虽然这可能不是问题。

Turbolinks旨在通过使用<body>加载新网页的ajax标记来加快您的网页加载时间,同时保持<head>标记的完整性。这是为了让您的应用程序只加载它所需的HTML,但会在页面上弄乱JS。

如果你的JS被解雇两次,那么可能表明Turbolinks正在干扰你的JS。由于您未包含logs中的任何示例,因此我无法向您提供任何具体信息,但您应该可以通过从turbolinks移除layout包含来测试此信息。 {1}}和您的application清单JS文件:

#app/views/layouts/application.html.erb
= javascript_include_tag "application", "data-turbolinks-track" => false

#app/assets/javascripts/application.js
//= require turbolinks -> remove this line

如果您这样做,请重新启动服务器&amp;重新加载有问题的页面。如果它仍然带有错误的功能,这意味着Turbolinks不是问题(你应该重置你改变的所有东西)

-

<强>事件

可能的另一个问题是您如何调用/触发事件。这可能有很多原因,但你一定要看看你如何调用你的JS:

#app/assets/javascripts/application.js
$(document).on("click", ".element", function(){
    //your stuff here
});

我们现在总是从documentDOM元素委派。虽然这可能会导致一些资源问题,但我们发现它使得Rails应用程序在资产管道中更加强大,因为它可以让您真正识别页面上的元素。

如果您尝试从DOM上的单个对象触发事件,您可能会发现JS将“捕获”事件两次(无论出于何种原因),从而导致您的问题。尝试委派两次被调用的事件

-

<强>功能

最后,您的functions可能成为问题。

如果您有任何anonymous functions或特定事件的函数,则需要确保它们能够被正确调用。你应该在JS&amp; amp;中使用page events来做到这一点。 Turbolinks

#app/assets/javascripts/application.js
var your_function = function() {
    //stuff here
};

$(document).on("page:load ready", your_function);

答案 1 :(得分:1)

我在没有使用turbolinks的rails 3应用程序上遇到了同样的问题。我能够通过运行来解决它:

{<age,10>,<gender,1>,<kw,"123">,<interest,1>}

此链接帮助了我: Jquery Rails 3... form submits twice... deletes twice... help

答案 2 :(得分:1)

我遇到过这个问题,因为资产管道包括jquery,jquery-ujs和rails-ujs:

res.data

删除了rails_ujs,一切都很好。