Rails 5:ターボリンクで$(document).ready()を使用する方法


84

Turbolinksは$(document).ready()ここここで説明さいるように、初期ロード以外のすべてのページ訪問で通常のイベントが発生するのを防ぎます。ただし、リンクされた回答のソリューションはいずれもRails5では機能しません。以前のバージョンのように、各ページアクセスでコードを実行するにはどうすればよいですか?

回答:


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 2016

3
Turbolinks:ローカルで火をロードしますが、Herokuでは実行しません。コンパイルされたjsアセットにカスタムJavaScriptコードが表示されますが、イベントが発生しません。
psparrow 2016

これはうまく機能しません。select2があり、ページを変更して戻ると、2つのselect2(複製)があります
inye 2016年

3
Railのドキュメントに書かれていることにもかかわらず、私は使用していon('ready turbolinks:load')ます。それ以外の場合は、一部のページで問題が発生します
Cyril Duchon-Doris 2016

1
こんにちはシリル、私は同じ問題を抱えています。つまり、最初のページの読み込みとturbolinks:loadでトリガーする必要があります。SO、stackoverflow.com / questions / 41421496 / …でこれについて質問しました。これがなぜそうなのかについて、もう少し洞察がありますか?jquery-turbolinksを使用していますか(私はそうです)。唯一の良い点は、コードがべき等であることを確認することです。
obromios 2017年

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リストに追加しないでください。追加しないと、関数が2回実行されます。以下のようgithub.com/turbolinks/turbolinks/#observing-navigation-eventsは言った、あなたはこのようにそれを行う必要があります: javascript $(document).ready(function() { $(document).on('turbolinks:load', function() {} ) })
Xiaohui張

@XiaohuiZhangそれがうまくいくと確信していますか???? $(document).readyトリガーされた場合、少なくとも私自身のシナリオでは、私は必要ありませんturbolinks:load
Milad.Nozari 2018

@XiaohuiZhangスクリプトがターボリンクのあるページとないページで機能する必要がある場合、コードを実行するにはturbolinks:loadイベントが必要になるため、スクリプトがないページでは機能しません
escanxr

@escanxrそれは両方で動作します、あなたはそれを試すことができます。Turbolinksは、Turbolinksページであるかどうかに関係なく、常に「turbolinks:load」イベントをトリガーするためです。
XiaohuiZhang19年

2
@XiaohuiZhang Turbolinks 5で試しましたが、機能しませんでした。ページでターボリンクが無効になっている場合、readyイベントのみがトリガーされます。turbolinksをがある場合、コードが2回呼び出されます
escanxr

9

これは私の解決策であり、オーバーライドしてからjQuery.fn.ready$(document).ready変更なしで機能します。

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

これはまさに私が必要としていたものです。これは、documentコールバックに依存する外部ライブラリでも機能します。なぜ反対票を投じるのですか?アプリケーション全体でターボリンクが使用されている限り、これは安全なはずですよね?
ディランヴァンダーバーグ

3

(コーヒースクリプト用)

私が使う: $(document).on 'turbolinks:load', ->

の代わりに: $(document).on('turbolinks:load', function() {...})


@inyeが言ったように、私はそれを実行しましたが、まだこの問題が発生しています:github.com/mkhairi/materialize-sass/issues/130。JSまたはCoffeeを使用しても、少なくとも私にとっては、実際には何の違いもありません。
alexventuraio 2016

2
こんにちは皆さん、一般的にこの答えの何が問題になっていますか?
atw 2018年

私の推測では、これはコーヒースクリプトであり、ネイティブJavaScriptではありませんか?これは私がやっている正確に何であり、それは(私のCoffeeScriptファイルで)私のために動作するので、私はそれを+1を与えた
aarona

はい!、それはcoffeescript用です:)。私のミスは、それを指定することはなかった
fcabanasmを

2

ここから、私のために働く解決策があります

  1. インストール gem 'jquery-turbolinks'

  2. この.coffeeファイルをアプリに追加します:https//github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee

  3. ターボリンクと名付けます-compatibility.coffee

  4. application.jsで

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

約何productionのenv?テストしましたか?developmentモードで問題なく動作すると言う人もいます。
alexventuraio 2016

6
宝石は非推奨です
マウロ

1

この本当にクールな宝石の修正を待っている間、私は以下を変更することで前進することができました。

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

に:

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

これが何を解決しないのかはまだわかりませんが、初期検査ではうまく機能しているようです。


-1

軽量のgemjquery-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!うまくいけば、サポートはすぐに追加されます。
Vadim 2016年

2
jquery-turbolinksgemは非推奨になりました。
ネイサンV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.