Rails 5:如何在Turbo-Links中使用$(document).ready()


Answers:


170

ready无需监听事件,而是需要挂接到Turbolinks在每次页面访问时触发的事件。

不幸的是,Turbolinks 5(Rails 5中出现的版本)已被重写,并且没有使用与以前版本的Turbolinks相同的事件名称,从而导致上述答案失败。现在有效的方法是像这样监听turbolinks:load事件:

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

5
是。也在这里解释。guides.rubyonrails.org/…。检查5.2页面更改事件。
靛蓝K

3
turbolinks:load在本地为我开火,但不是在Heroku上开火。我在编译的js资产中看到了自定义的javascript代码,但是该事件没有触发。
psparrow

这不好用。我有一个select2,在更改页面和返回页面时,我有两个select2(重复)
inye 16-10-18

3
尽管Rail文档说了什么,但我正在使用on('ready turbolinks:load')否则在某些页面上会遇到一些问题
Cyril Duchon-Doris 16/12/22

1
嗨,西里尔,我遇到了同样的问题,即需要在初始页面加载以及turbolinks:load上触发。我已经在stackoverflow.com/questions/41421496/…上询问了有关此问题。您对为什么会这样有更多的了解吗?您是否正在使用jquery-turbolinks(我在)。唯一的好处是,它可以确保您的代码是幂等的。
Obromios

59

本机JS:

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

11

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

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

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


10
不要添加ready到列表中,否则该函数将执行两次。正如github.com/turbolinks/turbolinks/#observing-navigation-events所说,您应该这样做: javascript $(document).ready(function() { $(document).on('turbolinks:load', function() {} ) })
Zhang Xiaohui

@XiaohuiZhang你确定行得通吗????因为如果$(document).ready被触发了,那么至少在我自己的情况下,我将不需要turbolinks:load
Milad.Nozari,

@XiaohuiZhang如果您的脚本必须在具有Turbolinks的页面上工作,而在不具有Turbolinks的页面上工作,那么在没有该页面的页面上将无法工作,因为它将需要turbolinks:load事件来执行代码
escanxr

@escanxr两者均可,您可以尝试一下。因为无论是否出现Turbolinks页面,Turbolinks总是会触发“ turbolinks:load”事件。
张晓辉

2
@XiaohuiZhang我尝试使用Turbolinks 5,但没有用。如果在页面上禁用了涡轮链接,则仅ready触发事件。如果有turbolinks,该代码将被调用两次
escanxr

9

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

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

这正是我所需要的。这也适用于依赖document回调的外部库。为什么要投票?只要在整个应用程序中都使用Turbolink,这应该是安全的,对吗?
迪伦·范德伯格

3

(对于咖啡脚本)

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

代替: $(document).on('turbolinks:load', function() {...})


我已经做到了,而且仍然像@inye所说的那样得到这个问题:github.com/mkhairi/materialize-sass/issues/130。使用JS或Coffee并没有任何区别,至少对我而言没有。
alexventuraio

2
嗨,大家好,这个答案通常有什么问题?
atw

我的猜测是,这是coffeescript而不是本机javascript?我给了+1,因为这正是我在做什么,并且对我有用(在我的coffeescript文件中)
aarona

是的,这是用于coffeescript的:)。我的错误是没有指定它
-fcabanasm

2

这是对我有用的解决方案,从这里开始

  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
    

在环境中production呢?你测试过了吗?有人告诉它在development模式下可以正常工作。
alexventuraio

6
弃用了该宝石
Mauro

1

当我们等待修复这个非常酷的宝石时,我能够通过修改以下内容继续前进:

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

至:

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

我尚不清楚这不能解决什么问题,但在初步检查中似乎效果很好。


-1

使用轻量级的gem jquery-turbolinks

它可以$(document).ready()在不更改现有代码的情况下使用Turbolinks。

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

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

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

取决于哪种情况更适合您。


jquery-turbolinks尚不支持Turbolinks 5 github.com/kossnocorp/jquery.turbolinks/issues/56
AndrewH

你是对的,@ AndrewH!希望很快会增加支持。
瓦迪姆

2
jquery-turbolinks gem已被弃用。
内森五世
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.