2013-09-27 156 views
13

Tôi gặp sự cố trong đó Turbolinks sẽ liên kết các sự kiện nhiều lần khi sử dụng các nút quay lại/chuyển tiếp thông qua trình duyệt. Tôi có một kịch bản đơn giản để đảm bảo rằng đó không phải là cách tôi đã viết các sự kiện document.on() của tôi, do đó ...Bối cảnh số nhiều liên kết Turbolinks

$(document).on 'page:load', -> 
    alert 'Loaded' 

Sẽ kích hoạt một lần khi nhấp vào liên kết. Nhấp vào trở lại hoặc chuyển tiếp (hoặc một liên kết Turbolink khác), nó sẽ kích hoạt hai lần. Thời gian tới nó sẽ cháy một loạt các lần và nó tiếp tục phát triển. Đây là điều duy nhất tôi có trong tệp kê khai của tôi bên ngoài jQuery và Turbolinks. Làm thế nào để bạn ngăn chặn Turbolinks từ nhân đôi sự kiện ràng buộc?

Trả lời

15

Sự cố dường như bao gồm javascript_tag ở cuối cơ thể của tôi, thay vì đầu. Khi trong cơ thể, Javascript đã được gỡ bỏ/thêm vào mỗi trang Turbolinks: thay đổi để các ràng buộc giữ chồng chất trên.

6

Điều đó có nghĩa - cùng một vấn đề sẽ xảy ra nếu bạn đang sử dụng đá quý jquery-turbolinks, vì nó sẽ gây ra bất kỳ mã nào bên trong tài liệu jQuery sẵn sàng hoạt động của bạn để chạy trên mỗi lần tải trang. Bởi vì đối tượng tài liệu không bao giờ được khởi tạo lại với Turbolinks, điều này dẫn đến các ràng buộc dư thừa. Giải pháp cho trường hợp này là đặt các ràng buộc $ (document) .on của bạn bên ngoài hàm sẵn sàng jQuery của bạn để chúng không được thực hiện trên mỗi lần tải trang.

0

Tôi đã có cùng một vấn đề và về cơ bản những gì tôi đã làm là truy vấn nếu một biến được xác định trước khi bao gồm JS. Nghe có vẻ hơi lộn xộn một chút ...

+0

Tôi phải xóa thẻ javascript_include ra khỏi cơ thể và vào đầu. – Kombo

+0

Ồ, được rồi. Tôi đã truy vấn nếu thư viện được tải khi thêm phần tử tập lệnh. Điều tương tự mà bạn sẽ làm trên một dự phòng nhưng trên thư viện bao gồm đầu tiên. Cảm ơn! –

0

Tôi đã gặp vấn đề tương tự và vấn đề là đánh dấu mà tôi đã tạo trên bố cục không chính xác. Tôi đã đóng thẻ body ở một nơi tôi không nên