2012-07-13 24 views
8

Tôi đang sử dụng history.js và tôi có một event handlerLàm cách nào để thay đổi trạng thái mà không kích hoạt statechange trong history.js?

$(window).bind('statechange', function(){ 
    // Loads the content representing the state via ajax 
}); 

Hầu hết những thay đổi nội dung được kích hoạt bởi History.pushState([...]) khi người dùng nhấp vào một liên kết hoặc một nút.

Nhưng trong một số trường hợp, thay đổi nội dung được quản lý trực tiếp bằng javascript (tức là thay đổi, thêm hoặc loại bỏ phần tử DOM) và không cần tải nội dung biểu thị trạng thái mới qua ajax.

Tuy nhiên, tôi cần phải đẩy một trạng thái và thay đổi url để phản ánh tình trạng mới, nên reload dùng hit hay muộn muốn sử dụng nút quay lại, vv

Vì vậy, câu hỏi của tôi là: Làm thế nào để đẩy một trạng thái nhưng tránh tải nội dung trong một số trường hợp? Có một loại cờ nào có thể được chuyển tới trình xử lý sự kiện statechange hay tôi có thể phá vỡ nó hoàn toàn không?

Trả lời

7

Tôi cũng tự hỏi về câu hỏi này. Quyết định của tôi là sử dụng một biến toàn cục. Ví dụ, bạn có thể khởi tạo window.stateChangeIsLocal như sai:

window.stateChangeIsLocal = false; 

handler statechange của bạn có thể được tìm kiếm một cái gì đó như thế này:

History.Adapter.bind(window,'statechange',function(){ 
    if (!window.stateChangeIsLocal) { 
     someAjaxLoadFunction(History.getState().url); 
    } 
    else { 
     window.stateChangeIsLocal = false; 
    } 
}); 

Khi bạn thay đổi trạng thái và không muốn tải một nội dung của trạng thái mới, chỉ cần đặt window.stateChangeIsLocaltrue;

Có thể có một số giải pháp thanh lịch hơn, nhưng tôi không thể tìm thấy chúng và sử dụng nó.

+0

Giải pháp của riêng tôi là một cái gì đó tương tự, ngoại trừ tôi đặt thuộc tính của đối tượng Lịch sử toàn cầu. Xem thêm câu hỏi này (http://stackoverflow.com/questions/8744487/statechange-is-firing-whenever-i-do-a-push-state?rq=1) để biết thêm về vấn đề này. – jgivoni