2011-10-15 33 views
14

Tôi đang cố gắng triển khai History.js cho trang web ajax của mình để tôi có thể sử dụng các nút tiến và lùi và thậm chí cả dấu trang. Tuy nhiên, ví dụ @https://github.com/browserstate/History.js/ khiến tôi hơi bối rối về cách triển khai nó. Có ai có một hướng dẫn đơn giản hoặc ví dụ về cách sử dụng này. Một ví dụ chúng ta có thể sử dụng để bắt đầu ví dụ này là một liên kết chuyển hướng nhưTriển khai History.js

<script type="text/javascript"> 
window.onload = function() 
{ 
function1(); 
}; 

<ul> 
<li><a href="javascript:function1()">Function1</a></li> 
<li><a href="javascript:function2('param', 'param')"</a></li> 
</ul> 
+0

Xem câu trả lời có thể có và câu hỏi liên quan tại đây: http://stackoverflow.com/questions/13278822/is-this-a-proper-way-to-use-history-js – dansalmo

Trả lời

34

I gặp sự cố hoàn toàn hiểu cách sử dụng History.js. Dưới đây là một số mã từ wiki của họ với ý kiến ​​của tôi đối với lời giải thích:

1. Nhận một tham chiếu đến đối tượng history.js

Để có được một tham chiếu đến đối tượng History.js tham khảo window.history (Capitol 'H').

var History = window.History; 

Để kiểm tra xem lịch sử HTML5 có được bật kiểm tra History.enabled hay không. History.js sẽ vẫn hoạt động bằng cách sử dụng thẻ băm nếu không.

History.enabled 

2. Lắng nghe những thay đổi lịch sử và cập nhật điểm của mình từ đây

Để nghe cho lịch sử thay đổi trạng thái liên kết với sự kiện statechange của đối tượng Adapter.

History.Adapter.bind(window,'statechange',function(){ 
    var State = History.getState(); 
    History.log(State.data, State.title, State.url); 
}); 

3. Thao tác quốc gia lịch sử bằng cách sử dụng push hoặc thay thế

Để thêm một nhà nước về lịch sử, gọi pushState. Điều này sẽ thêm một trạng thái vào cuối ngăn xếp lịch sử sẽ kích hoạt sự kiện 'statechange' như được hiển thị ở trên.

History.pushState({data:"any kind of data object"}, "State Title", "?urlforthestate=1"); 

Để thay thế trạng thái thành lịch sử, hãy gọi replaceState. Điều này sẽ thay thế trạng thái cuối cùng trong ngăn xếp lịch sử sẽ kích hoạt sự kiện 'statechange' như được hiển thị ở trên.

History.replaceState({data:"any kind of data object"}, "State Title", "?urlforthestate=1"); 

Sự khác biệt giữa pushState và replaceState là pushState sẽ thêm trạng thái vào danh sách lịch sử, replaceState sẽ ghi đè trạng thái cuối cùng.

LƯU Ý: pushState và replaceState tuần tự hóa đối tượng dữ liệu, vì vậy hãy sử dụng dữ liệu tối thiểu tại đó.

4. Nếu bạn muốn bổ sung thêm ui cho người sử dụng để có thể điều hướng lịch sử, sử dụng lệnh điều hướng

Sử dụng trở lại và đi đến hướng lịch sử thông qua mã.

History.back(); 
History.go(2); 

khác: Sử dụng "một" thẻ với lịch sử

Để sử dụng "a" thẻ với lịch sử, bạn sẽ cần để đánh chặn nhấp sự kiện và ngăn chặn các trình duyệt từ điều hướng bằng công event.preventDefault () phương pháp.

Ví dụ:

<a href="dogs/cats" title="Dogs and cats">Dogs and Cats</a> 

$('a')​.click(function(e){ 
    e.preventDefault(); 
    var url = $(this).attr('href'); 
    var title = $(this).attr('title'); 
    History.pushState({data:title}, title, url); 
})​; 

Tôi hy vọng điều này sẽ giúp.

+0

Tôi cũng đang đấu tranh với điều này làm ví dụ. Tôi nhận được những gì được hiển thị ở trên, nhưng có rất nhiều điều còn thiếu so với history.js trước đó đã sử dụng phương thứC#. Tôi đã có thể nhận được các ví dụ dựa trên # trước làm việc bằng cách liên kết với các mục có thể nhấp như một neo trong trình đơn điều hướng. Điều này sau đó sẽ gọi một trình xử lý dựa trên href nơi có thể thực hiện cuộc gọi ajax. Tôi không thấy các sự kiện nhấp chuột cho mỗi url bị ràng buộc ở đây như thế nào. Mọi thứ tôi đã thử không chặn các sự kiện bấm url. – dansalmo

+0

Những gì bạn cần làm là chặn các nhấp chuột vào những href đó và đi từ đó. Ví dụ: $ ('a') .click (function (e) {e.preventDefault();}). Sau e.preventDefault(), bạn có thể lấy giá trị của thuộc tính href và sử dụng nó để đẩy các trạng thái lịch sử mà không cần điều hướng khỏi trang. – zachzurn

+0

Cảm ơn, tôi đã làm một cái gì đó như thế và thêm nó ở trên nhưng tôi không chắc chắn nếu nó thực sự là cách thích hợp. Ngoài ra, tôi không thấy lý do tại sao e.preventDefault() là cần thiết. Có vẻ như trở về sai; làm điều tương tự. – dansalmo