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

时间:2017-10-10 22:21:59

标签: javascript jquery ruby-on-rails actioncable

Rails版本5.1.3

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

所有回调都会被触发两次。换句话说,触发回调后要执行的功能被调用两次,包括频道订阅和$(document).ready。具体来说,如果我把

$(some_id_name).append some_string

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

可能是整个js文件被加载两次。但是如何?

这只发生在测试和生产环境(Heroku)中,而不是在开发环境中。意味着什么?

我通过在线搜索找到的turbolinks分为3个步骤。在jquery中仅包括rails-ujsjquery_ujs一次,不包括application.js。不存在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 .

1 个答案:

答案 0 :(得分:2)

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

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