【问题标题】:rails: javascript/jQuery callbacks are triggered twicerails: javascript/jQuery 回调被触发两次
【发布时间】:2017-10-10 22:21:59
【问题描述】:

Rails 版本 5.1.3

具体来说,它是assets/javascripts/channels/my_channel.coffee 中的代码,通道 js 客户端代码所在的位置,以及其他通用 js 代码。我正在使用可操作电缆。但是一般的 jQuery/javascript 回调也会受此影响。在 javascript 中重写 jQuery append 并没有什么不同。

所有回调都被触发两次。也就是说,回调触发后要执行的函数被调用了两次,包括订阅频道和$(document).ready。具体来说,如果我把

$(some_id_name).append some_string

$(document).ready的事件函数中,会被追加两次。我也将可操作的频道订阅实例视为回调。用户发送消息调用receive方法触发实例。所以该方法中的代码也被执行了两次。 append 就我而言。

可能是整个 js 文件被加载了两次。但是怎么做呢?

这只发生在测试和生产环境(Heroku)中,不会发生在开发环境中。暗示什么?

我通过 3 个步骤彻底删除了 turbolinks,您可以通过在线搜索找到。在application.js 中只包含一次jqueryrails-ujs,不包含jquery_ujs。不存在public/assets

my_channel.coffee 的一部分如下所示。所有自定义函数都包含多个回调,例如 clickkeydown。如果我对他们使用unbindbind 它将解决问题。但我不能将此应用于$(document).ready 和频道订阅实例。

$(document).ready ->
  $('#messages').append "document is ready"
  submitQuestion()
  submitAnswer()
  hideJudgeForm()
  return

application.js

//= require jquery
//= require rails-ujs
//= require bootstrap
//= require spin.js/spin
//= require_tree .

【问题讨论】:

  • 你能确保文件没有被包含在最终生成的 HTML 中两次吗?实际操作中,能不能在浏览器中按F12分析一下?
  • @AndréGuimarãesSakata 是的,我在application.html.erb 中仔细检查了<%= javascript_include_tag 'application' %>,其他任何地方都不应该有它。抱歉,我不确定如何分析浏览器控制台中的双重加载。

标签: javascript jquery ruby-on-rails actioncable


【解决方案1】:

嗯,我要做的第一件事就是检查我没有任何其他文件,包括文件my_channel.coffee。既不是另一个捆绑包的一部分,也不是javascript_include_tag

之后,我会尝试删除我所有文件中的require_tree .,并将其替换为我希望 Rails 作为捆绑包的一部分加载的特定文件列表。因此,您可能有两个不同的文件间接导入 my_channel.coffee

【讨论】:

  • 删除require_tree . 确实有效。目前我认为require_tree folder 在文件夹channels 中需要my_channel.coffeemy_channel.js。我认为资产管道不包括咖啡文件。或者是吗?谁能确认?无论如何,只需要 js 文件就可以了。
  • 还有什么原因导致开发环境不受此影响?如果是 bc,它不使用预编译,那么它如何访问 my_channel.coffeemy_channel.js
  • 对不起,我不能给你一个正确的答案,我上次使用 Rails 是在第 4 版中。但在我那个时代,我从未直接使用过 .coffee 扩展。我会将我的文件命名为 my_channel.js.coffee.erb (如果您不需要任何 Rails 助手,可以省略 erb 部分),以便资产管道首先将文件解析为 ERB,然后解析为咖啡,最后解析为一个JS。在您的情况下,您可能正在间接创建两个 my_channel.js:一个是因为您已经创建了一个实际的 my_channel.js 文件,另一个是因为 my_channel.coffee 的编译
  • 足够好了。这是我使用的一个插件,可以在保存时编译咖啡。我以为是 rails 做的,所以我认为咖啡不会被编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多