Rails 5:如何使用带有turbo-links的$(document).ready()

And*_*ewH 78 javascript jquery ruby-on-rails turbolinks ruby-on-rails-5

Turbolinks可防止正常$(document).ready()事件在初始加载之外的所有页面访问时触发,如此此处所述.但是,链接答案中的所有解决方案都不适用于Rails 5.如何像以前的版本一样在每次访问页面上运行代码?

And*_*ewH 154

而不是听取ready事件,你需要参与Turbolinks为每次页面访问而发起的事件.

不幸的是,Turbolinks 5(这是Rails 5中出现的版本)已被重写,并且不使用与之前版本的Turbolinks相同的事件名称,导致提到的答案失败.现在有效的是收听turbolinks:加载事件如下:

$( document ).on('turbolinks:load', function() {
  console.log("It works on each visit!")
})
Run Code Online (Sandbox Code Playgroud)

  • 是.这里也解释一下.http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks.检查5.2页面更改事件. (4认同)
  • turbolinks:在本地为我加载火力,但在Heroku上没有.我在编译的js资产中看到了我自定义的javascript代码,但事件没有触发. (3认同)
  • 尽管铁道部门的人说过,我正在使用`'('ready turbolinks:load')`否则我在某些页面上遇到了一些问题 (3认同)
  • Rails 6 有什么不同吗? (2认同)

小智 42

原生JS:

document.addEventListener("turbolinks:load", function() {
    console.log('It works on each visit!');
});
Run Code Online (Sandbox Code Playgroud)

  • Turbo 的 `turbo:load` (2认同)

Xia*_*ang 7

这是我的解决方案,覆盖jQuery.fn.ready,然后$(document).ready工作没有任何改变:

jQuery.fn.ready = (fn)->
  $(this).on 'turbolinks:load', fn
Run Code Online (Sandbox Code Playgroud)


Mil*_*ari 7

在rails 5中,最简单的解决方案是使用:

$(document).on('ready turbolinks:load', function() {});
Run Code Online (Sandbox Code Playgroud)

代替$(document).ready。奇迹般有效。

  • 不要在列表中添加“ ready”,否则该函数将执行两次。就像https://github.com/turbolinks/turbolinks/#observing-navigation-events所说的那样,你应该这样做: 'turbolinks:load',function(){}}})`'' (6认同)
  • @XiaohuiZhang我尝试使用Turbolinks 5,但没有用。如果在页面上禁用了涡轮链接,则仅触发“就绪”事件。如果有turbolinks,则代码被调用两次 (2认同)