Rails 5: Cách sử dụng $ (document) .ready () với turbo-links


84

Turbolinks ngăn $(document).ready()các sự kiện bình thường kích hoạt trên tất cả các lượt truy cập trang ngoài tải ban đầu, như đã thảo luận ở đâyở đây . Tuy nhiên, không có giải pháp nào trong các câu trả lời được liên kết hoạt động với Rails 5. Làm cách nào để tôi có thể chạy mã trên mỗi lần truy cập trang như trong các phiên bản trước?

Câu trả lời:


170

Thay vì lắng nghe readysự kiện, bạn cần tham gia vào sự kiện do Turbolinks kích hoạt cho mỗi lần truy cập trang.

Thật không may, Turbolinks 5 (là phiên bản xuất hiện trong Rails 5) đã được viết lại và không sử dụng các tên sự kiện giống như trong các phiên bản trước của Turbolinks, khiến các câu trả lời được đề cập không thành công. Những gì hoạt động bây giờ là lắng nghe turbolinks: tải sự kiện như vậy:

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

5
Đúng. Giải thích ở đây là tốt. Guide.rubyonrails.org/… . Kiểm tra 5.2 Sự kiện Thay đổi Trang.
Indika K

3
turbolinks: tải cục bộ lửa cho tôi, nhưng không tải trên Heroku. Tôi thấy mã javascript tùy chỉnh của mình trong nội dung js đã biên dịch của mình, nhưng sự kiện không kích hoạt.
psparrow 22/09/2016

điều này không hoạt động tốt. Tôi có một select2 và khi thay đổi trang và quay lại, tôi có hai select2 (trùng lặp)
inye

3
Mặc dù những gì doc Đường sắt cho biết, tôi đang sử dụng on('ready turbolinks:load')nếu không tôi có một số vấn đề trên một số trang
Cyril Duchon-Doris

1
Xin chào Cyril, tôi đang gặp vấn đề tương tự, tức là cần kích hoạt khi tải trang ban đầu cũng như turbolinks: load. Tôi đã đặt câu hỏi về vấn đề này trên SO, stackoverflow.com/questions/41421496/… . Bạn có hiểu biết thêm về lý do tại sao điều này là như vậy? Bạn có đang sử dụng jquery-turbolinks không (tôi là vậy). Điều tốt duy nhất là nó đảm bảo rằng mã của bạn là không cố định.
Obromios

59

JS gốc:

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

11

Trong rails 5, giải pháp đơn giản nhất là sử dụng:

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

Thay vì $(document).ready. Hoạt động như một sự quyến rũ.


10
Đừng thêm readyvào danh sách, nếu không hàm sẽ được thực thi hai lần. Như github.com/turbolinks/turbolinks/#observing-navigation-events đã nói, bạn nên làm như thế này: javascript $(document).ready(function() { $(document).on('turbolinks:load', function() {} ) })
Xiaohui Zhang

@XiaohuiZhang Bạn có chắc điều đó sẽ hiệu quả không ???? Bởi vì nếu $(document).readyđược kích hoạt, thì ít nhất là trong các tình huống của riêng tôi, tôi sẽ không cầnturbolinks:load
thưa bà chủ.Nozari

@XiaohuiZhang Nếu kịch bản của bạn phải làm việc trên một trang với turbolinks và trên một trang mà không có, điều đó sẽ không làm việc trên trang mà không có, bởi vì nó sẽ cần turbolinks: Sự kiện nạp để thực thi mã
escanxr

@escanxr Nó hoạt động cả hai, bạn có thể dùng thử. bởi vì Turbolinks luôn kích hoạt sự kiện "turbolinks: load" bất cứ khi nào có trang Turbolinks hay không.
Xiaohui Zhang

2
@XiaohuiZhang Tôi đã thử với Turbolinks 5, nó không hoạt động. Nếu turbolinks bị tắt trên trang, chỉ readysự kiện được kích hoạt. Nếu có turbolinks, mã được gọi là hai lần
escanxr

9

Đây là giải pháp của tôi, ghi đè jQuery.fn.ready, sau đó $(document).readyhoạt động mà không có bất kỳ thay đổi nào:

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

Đây chính xác là những gì tôi cần. Điều này cũng hoạt động đối với các thư viện bên ngoài dựa vào lệnh documentgọi lại. Tại sao lại ủng hộ? Điều này sẽ an toàn miễn là turbolinks được sử dụng trong toàn bộ ứng dụng, phải không?
Dylan Vander Berg

3

(Đối với coffeescript)

Tôi sử dụng: $(document).on 'turbolinks:load', ->

Thay vì: $(document).on('turbolinks:load', function() {...})


Tôi đã làm điều đó và tôi vẫn gặp sự cố này như @inye đã nói: github.com/mkhairi/materialize-sass/issues/130 . Sử dụng JS hoặc Coffee không thực sự tạo ra bất kỳ sự khác biệt nào, ít nhất là KHÔNG đối với tôi.
alexventuraio

2
Xin chào các bạn, nói chung câu trả lời này có gì sai?
atw

Tôi đoán rằng đây là coffeescript và không phải javascript gốc? Tôi đã cho nó +1 vì đây chính xác là những gì tôi đang làm và nó phù hợp với tôi (trong tệp coffeescript của tôi)
aarona

vâng !, nó dành cho coffeescript :). Sai lầm của tôi là không để xác định nó
fcabanasm

2

Đây là giải pháp phù hợp với tôi, từ đây :

  1. Tải về gem 'jquery-turbolinks'

  2. thêm tệp .coffee này vào ứng dụng của bạn: https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee

  3. đặt tên cho nó là turbolinks-compatibility.coffee

  4. tại application.js

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

Còn trong productionenv thì sao? Bạn đã thử nó ra chưa? Có một số người nói rằng nó chỉ hoạt động tốt ở developmentchế độ.
alexventuraio

6
Đá quý không được dùng nữa
Mauro

1

Trong khi chúng tôi chờ đợi bản sửa lỗi cho viên ngọc thực sự thú vị này, tôi đã có thể tiếp tục bằng cách sửa đổi phần sau;

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

đến:

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

Tôi chưa biết điều này không giải quyết được điều gì, nhưng nó có vẻ hoạt động tốt khi kiểm tra ban đầu.


-1

Sử dụng đá quý jquery-turbolinks trọng lượng nhẹ .

Nó làm $(document).ready()việc với Turbolinks mà không cần thay đổi mã hiện có.

Ngoài ra, bạn có thể thay đổi $(document).ready()thành một trong số:

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

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

tùy thuộc vào cái nào thích hợp hơn trong hoàn cảnh của bạn.


jquery-turbolinks chưa hỗ trợ Turbolinks 5 github.com/kossnocorp/jquery.turbolinks/issues/56
AndrewH

Bạn nói đúng, @AndrewH! Mong rằng sẽ sớm được bổ sung hỗ trợ.
Vadim

2
Đá quý jquery-turbolinks không được dùng nữa.
Nathan V
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.