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

Rails 5: how to use $(document).ready() with turbo-links

Turbolinks 会阻止正常 $(document).ready() 事件在除初始加载之外的所有页面访问时触发,如前所述 here and here。不过,链接答案中的 None 解决方案适用于 Rails 5。我如何 运行 像以前的版本一样在每次访问页面时编写代码?

与其监听 ready 事件,您需要为每次页面访问连接到 Turbolinks 触发的事件。

不幸的是,Turbolinks 5(即 Rails5 中出现的版本)已被重写,并且不使用与以前版本的 Turbolinks 相同的事件名称,导致提到的答案失败。现在有效的是像这样收听 turbolinks:load 事件:

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

使用轻量级 gem jquery-turbolinks.

它使 $(document).ready() 在不更改现有代码的情况下与 Turbolinks 一起工作。

或者,您可以将 $(document).ready() 更改为以下之一:

$(document).on('page:fetch', function() { /* your code here */ });

$(document).on('page:change', function() { /* your code here */ });

取决于哪一个更适合您的情况。

虽然我们等待修复这个非常酷的 gem,但我能够通过修改以下内容继续前进;

  addCallback: (callback) ->
if $.turbo.isReady
  callback($)
$document.on 'turbo:ready', -> callback($)

至:

  addCallback: (callback) ->
if $.turbo.isReady
  callback($)
$document.on 'turbolinks:load', -> callback($)

我还不知道这不能解决什么问题,但初步检查时似乎效果很好。

这是对我有用的解决方案,来自 here:

  1. 安装gem 'jquery-turbolinks'

  2. 将此 .coffee 文件添加到您的应用程序:https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee

  3. 将其命名为 turbolinks-compatibility.coffee

  4. 在application.js

    //= require jquery
    //= require jquery_ujs
    //= require jquery.turbolinks
    //= require turbolinks
    //= require turbolinks-compatibility
    

原生 JS:

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

这是我的解决方案,覆盖 jQuery.fn.ready,然后 $(document).ready 无需任何更改即可工作:

jQuery.fn.ready = (fn)->
  $(this).on 'turbolinks:load', fn

(对于咖啡脚本)

我使用: $(document).on 'turbolinks:load', ->

而不是: $(document).on('turbolinks:load', function() {...})

在 rails5 中最简单的解决方案是使用:

$(document).on('ready turbolinks:load', function() {});

而不是 $(document).ready。奇迹般有效。

纯现代 js:

const onLoad = () => {
  alert("works")
}

document.addEventListener("load", onLoad)
document.addEventListener("turbolinks:load", onLoad)

使用 turbo 时 turbo:load