Rails 5 : 터보 링크와 함께 $ (document) .ready ()를 사용하는 방법


84

Turbolinks는 여기여기에$(document).ready() 설명 된대로 초기로드를 제외한 모든 페이지 방문에서 정상적인 이벤트가 발생 하지 않도록 합니다 . 그러나 연결된 답변의 솔루션은 Rails 5에서 작동하지 않습니다. 이전 버전과 마찬가지로 각 페이지 방문에서 코드를 어떻게 실행할 수 있습니까?

답변:


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 페이지 변경 이벤트를 확인하십시오.
Indika K

3
turbolinks : load가 로컬에서 실행되지만 Heroku에서는 실행되지 않습니다. 컴파일 된 js 자산에 사용자 지정 자바 스크립트 코드가 표시되지만 이벤트가 발생하지 않습니다.
psparrow

이것은 잘 작동하지 않습니다. 나는 select2를 가지고 있고 페이지를 바꾸고 뒤로 돌아갈 때 나는 두 개의 select2 (중복)를 가지고있다
inye

3
제가 사용하고 무엇 레일 문서는 말합니다에도 불구하고 on('ready turbolinks:load'), 그렇지 않으면 나는 몇몇 페이지에서 문제가
시릴 Duchon - 도리스

1
안녕하세요 Cyril, 동일한 문제가 있습니다. 즉, 초기 페이지로드 및 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() {} ) })
Xiaohui 장

@XiaohuiZhang 그게 효과가 있다고 확신합니까 ???? 경우 때문에 $(document).ready트리거 도착 후, 내 자신의 시나리오에서 적어도, 나는 필요가 없을 것turbolinks:load
Milad.Nozari

로드 이벤트 코드 실행 : @XiaohuiZhang는 스크립트가 turbolinks을 페이지에없는 일을해야하기 때문에,하지 않고 그, turbolinks와없는 페이지의 페이지에서 작업해야하는 경우
escanxr

@escanxr 둘 다 작동하며 사용해 볼 수 있습니다. Turbolinks는 항상 Turbolinks 페이지가 있는지 여부에 관계없이 "turbolinks : load"이벤트를 트리거하기 때문입니다.
Xiaohui Zhang 19 년

2
@XiaohuiZhang Turbolinks 5로 시도했지만 작동하지 않았습니다. 페이지에서 터보 링크가 비활성화 된 경우 ready이벤트 만 트리거됩니다. turbolinks이 있다면, 코드가 두 번 호출됩니다
escanxr

9

이것은 내 솔루션이며 재정 jQuery.fn.ready의 한 다음 $(document).ready변경하지 않고 작동합니다.

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

이것이 바로 내가 필요한 것입니다. 이것은 document콜백에 의존하는 외부 라이브러리에서도 작동 합니다. 왜 반대 투표입니까? 전체 애플리케이션에서 터보 링크를 사용하는 한 안전해야합니다. 그렇죠?
Dylan Vander Berg

3

(커피 스크립트 용)

나는 사용한다: $(document).on 'turbolinks:load', ->

대신에: $(document).on('turbolinks:load', function() {...})


나는 그것을했고 @inye가 말했듯이 여전히이 문제가 발생합니다 : github.com/mkhairi/materialize-sass/issues/130 . JS 또는 Coffee를 사용한다고해서 적어도 나에게는 아무런 차이가 없습니다.
alexventuraio

2
안녕하세요 여러분, 일반적으로이 답변에 어떤 문제가 있습니까?
atw

내 생각 엔 이것이 커피 스크립트이고 네이티브 자바 스크립트가 아니라는 것입니까? 이것이 바로 제가하는 일이고 저에게 효과가 있기 때문에 +1을주었습니다. (커피 스크립트 파일에서)
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
    

약 무엇 productionENV? 테스트 해 보셨나요? 어떤 사람들은 development모드 에서 잘 작동한다고 말합니다 .
alexventuraio

6
gem은 더 이상 사용되지 않습니다
Mauro

1

이 멋진 gem의 수정을 기다리는 동안 다음을 수정하여 앞으로 나아갈 수있었습니다.

  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! 지원이 곧 추가되기를 바랍니다.
Vadim

2
jquery-turbolinks gem은 더 이상 사용되지 않습니다.
Nathan V
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.