Rails 版本 5.1.3
具体来说,它是 channel js 客户端代码所在的 assets/javascripts/channels/my_channel.coffee
中的代码,以及其他通用 js 代码。我正在使用可操作的。但一般的 jQuery/javascript 回调也会受到这个问题的影响。在 JavaScript 中重写 jQuery append
并没有什么区别。
所有回调都会触发两次。也就是说,回调触发后要执行的函数被调用了两次,包括 channel 订阅和$(document).ready
。具体来说,如果我把
$(some_id_name).append some_string
在$(document).ready
的事件函数中,会被追加两次。我也将可操作的 channel 订阅实例视为回调。 receive
方法由用户发送消息调用以触发实例。因此该方法中的代码也执行了两次。在我的例子中附加
。
可能整个 js 文件被加载了两次。但如何呢?
这只发生在测试和生产环境(Heroku)中,不会发生在开发环境中。暗示着什么吗?
我通过 3 个步骤干净地删除了 turbolinks
,您可以通过在线搜索找到。在 application.js
中仅包含 jquery
和 rails-ujs
一次,不包含 jquery_ujs
。不存在 public/assets
。
my_channel.coffee
的一部分如下所示。所有自定义函数都包含多个回调,例如 click
、keydown
。如果我对它们使用unbind
和bind
它将解决问题。但我无法将其应用于 $(document).ready
和 channel 订阅实例。
$(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
。既不作为另一个 bundle 的一部分,也不与 javascript_include_tag
一起使用。
之后,我会尝试删除所有文件中的 require_tree .
并将其替换为我希望 Rails 作为 bundle 的一部分加载的特定文件列表。因此,您可能有两个不同的文件间接导入 my_channel.coffee
。
关于javascript - rails : javascript/jQuery callbacks are triggered twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676921/