rails: javascript/jQuery 回调被触发两次

rails: javascript/jQuery callbacks are triggered twice

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中的事件函数中,会追加两次。我也将 actioncable 频道订阅实例视为回调。 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 .

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

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