【发布时间】: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 中只包含一次jquery 和rails-ujs,不包含jquery_ujs。不存在public/assets。
my_channel.coffee 的一部分如下所示。所有自定义函数都包含多个回调,例如 click、keydown。如果我对他们使用unbind 和bind 它将解决问题。但我不能将此应用于$(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