Rails资产管道:JavaScript执行两次

Rails资产管道:JavaScript执行两次,javascript,ruby-on-rails,ruby-on-rails-3,asset-pipeline,turbolinks,Javascript,Ruby On Rails,Ruby On Rails 3,Asset Pipeline,Turbolinks,我的JavaScript被执行了两次。当我运行Chrome调试器时,我注意到单个JavaScript文件将第一次执行代码,然后,application.js文件将再次执行代码 我相信这是因为我最近关闭了预编译,因为我和Heroku有问题。在此之后,我运行了rake资产:预编译Turbolinks 您可能有问题(考虑到您已将其包括在资产管道中);虽然这可能不是问题所在 Turbolinks旨在通过使用ajax加载新页面的标记,保持标记完好无损,从而加快页面加载速度。这意味着您的应用程序只需加载所需

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


我相信这是因为我最近关闭了预编译,因为我和Heroku有问题。在此之后,我运行了
rake资产:预编译

Turbolinks

您可能有问题(考虑到您已将其包括在资产管道中);虽然这可能不是问题所在

Turbolinks旨在通过使用
ajax
加载新页面的
标记,保持
标记完好无损,从而加快页面加载速度。这意味着您的应用程序只需加载所需的HTML,但会弄乱页面上的JS

如果您的
JS
被触发两次,这可能是Turbolinks干扰您的JS的迹象。由于您没有包含
日志中的任何示例,因此我无法提供任何具体信息,但您应该能够通过从
布局
应用程序
清单JS文件中删除
TurboLink
包含来测试这一点:

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

#app/assets/javascripts/application.js
//= require turbolinks -> remove this line
如果执行此操作,请重新启动服务器并重新加载有问题的页面。如果它仍然返回错误的功能,这意味着TurboLink不是问题所在(您应该重置所有更改的内容)

--

事件

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

#app/assets/javascripts/application.js
$(document).on("click", ".element", function(){
    //your stuff here
});
我们总是从“现在”的元素开始委派。虽然这可能会导致一些资源问题,但我们发现,它使Rails应用程序通过资产管道更加健壮,因为它允许您真正识别页面上的元素

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

--

功能

最后,您的
函数
可能是问题所在

如果您有用于特定事件的任何或函数,则需要确保能够正确调用它们。您应该通过在JS&中使用


我在一个不使用TurboLink的rails 3应用程序上遇到了同样的问题。我可以通过运行以下命令来修复它:

rake assets:clean
这个链接帮助我:

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

/=需要jquery
//=需要jquery\u ujs
//=需要rails\u ujs
//=需要引导
//=需要涡轮链路

//=require_tree.
我没有使用TurboLink,除非它自动包含在rails 3.2.13中,或者除非它包含在bootstrap 3中感谢您的精彩解释
rake assets:clean