2012-04-10 50 views
5

Xin chào mọi người,

bây giờ là lần thử thứ tư của tôi để triển khai history.js trong ứng dụng Rails. Tôi có một cách tiếp cận đang chạy khá ổn, nhưng mã quá xấu xí. Hôm nay một lần nữa tôi nhìn vào mã và suy nghĩ: Làm thế nào tôi có thể làm cho điều này tốt hơn, dễ dàng hơn, nhiều hơn nữa?Cách thực hiện history.js trong Rails đúng cách?

Những gì tôi đã làm cho đến nay (và làm việc khá ổn, không hoàn hảo):

  • Đặt remote: true để liên kết của tôi
  • jquery-ujs fetches js.erb

HTML của tôi trông giống như :

<body> 
    <div id="content"> 
    some content with buttons, etc. 
    </div> 
</body> 

js.erb chứa:

History.pushState(
    { 
    func: '$(\'#content\').html(data);', 
    data: '<%= j(render template: "news/index", formats: [:html]) %>' 
    }, 
    'test title', 
    '<%= request.url %>' 
); 

Và sau đó history.js nhận chức năng và cung cấp dữ liệu. Vì vậy, nó thay thế content -div bằng mã được tạo mới. Và nó cũng cập nhật URL. Mã này tôi phải đưa vào mỗi (!) js.erb tệp.

suy nghĩ cuối cùng của tôi để làm cho nó một chút ít xấu xí là:

  • Set remote: true để liên kết của tôi
  • Khi một liên kết được nhấp rồi nó lấy một số js.erb thay thế các content -div
  • Tất cả liên kết với data-remote="true" sẽ nhận được ajax:success -handler
  • Trên ajax:success URL mới được đẩy vào history.js

Nhưng vẫn còn một vấn đề trong đó. Sau đó, tôi có mã JavaScript:

$(document).on('ajax:success', 'a[data-remote="true"]', function() { ... }); 

Vấn đề là:. ajax:success không bao giờ cháy nếu tôi thay thế -tag div nơi liên kết (phải kích hoạt sự kiện) là trong

Có lẽ ai đó có thể giải quyết vấn đề của tôi ...

Hoặc có cách nào tốt hơn không?

+0

Bạn đã thấy jquery.pjax? –

+0

Tôi đã xem trang histoy.js nhiều lần nhưng chưa bao giờ tập trung nỗ lực để thực sự thử nó. Tôi rất muốn thấy câu hỏi này được trả lời một cách rõ ràng. – Ashitaka

+0

PJAX chỉ là HTML5. HTML4 trình duyệt chỉ nhận được các liên kết bình thường ... Với history.js, chúng tôi cũng nhận được AJAX cho các trình duyệt HTML4 –

Trả lời

0

gì về:

History.Adapter.bind(window, 'statechange', function() { 
    var state = History.getState(); 
    ... 
}); 
0

Tôi đang sử dụng kiện beforeSend như nghe toàn cầu cho tất cả các dữ liệu từ xa để thay đổi xử lý lịch sử của trình duyệt. Tôi thích beforeSend vì tôi muốn liên kết thay đổi ngay sau khi được nhấp, bất kể kết quả của yêu cầu ajax ...

$(document).bind('ajax:beforeSend', function(event,data){ 
    history.pushState(null, '', event.target.href) 
}); 

Điều này giải quyết được sự cố của bạn vì sự kiện được kích hoạt trước khi thực hiện bất kỳ sửa đổi nào đối với DOM.

Các vấn đề liên quan