2012-05-02 27 views
6

Google-fu của tôi không có gì.Có một cuộc gọi lại cho History.pushstate không?

Khi bạn làm điều này:

var stateObj = { state: "some state" }; 
history.pushState(stateObj, "page 2", "other.htm"); 

Có một cửa sổ gọi lại liên quan?

Tôi biết rằng có này:

window.onpopstate = function() { 

} 

Những tác phẩm tuyệt vời cho nghe khi người dùng chạm vào nút quay lại. Tuy nhiên, tôi muốn nghe bất kỳ lúc nào URL thay đổi và tôi không chắc chắn cách thực hiện.

Có gọi lại toàn cầu cho bất kỳ lúc nào URL thay đổi không?

+0

http://stackoverflow.com/questions/680785/on-window-location-hash-change – Joe

+0

Hãy thử ràng buộc nó với một phần tử và sau đó kiểm tra là typeof giá trị (typeof elem.onpopstate), nếu nó không xác định nó không được hỗ trợ , nếu đó là một chức năng tốt. http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ cho cách – GillesC

+2

bản sao có thể có của [Cách nhận thông báo về các thay đổi của lịch sử qua history.pushState?] (http: // stackoverflow. com/questions/4570093/how-to-get-thông báo-về-thay đổi-of-the-lịch sử-qua-lịch sử-pushstate) – thekevinscott

Trả lời

12

Không, không có onpushstate hoặc bất kỳ thứ gì. Tuy nhiên, một miếng vá nhỏ có thể khắc phục được điều đó:

var pushState = history.pushState; 
history.pushState = function() { 
    pushState.apply(history, arguments); 
    fireEvents('pushState', arguments); // Some event-handling function 
}; 

Điều này sẽ chỉ thông báo cho bạn khi pushState được sử dụng. Bạn có thể muốn làm một cái gì đó tương tự cho replaceState.

Nếu bạn cần được thông báo bất cứ khi nào URL thay đổi, thì một số kết hợp ở trên và trình xử lý hashchange sẽ giúp bạn tận dụng tối đa.

+1

Những gì bạn biết, [this] (http://stackoverflow.com/questions/4570093/how- câu hỏi để được thông báo-về-thay đổi-of-the-lịch sử-qua-lịch sử-pushstate) gần như giống hệt nhau và câu trả lời cũng vậy. : P –

+0

Điều này có thể khiến bạn gặp rắc rối không? Ví dụ. làm điều này trên trang web của bên thứ ba nơi bạn tải tập lệnh. Hay điều này chủ yếu là an toàn? – Cristian

+0

Tôi tìm thấy một ví dụ mà điều này có thể không hoạt động. Ví dụ trong Backbone.history, tham chiếu 'history.pushState' được sao chép vào' Backbone.history.pushState'. Nếu chúng ta thay thế tham chiếu cho 'window.history.pushState' bằng cách sử dụng' = 'gán thì bạn sẽ vẫn có' Backbone.history.pushState' tham chiếu đến 'pushState' cũ do đó mã vá lỗi khỉ của bạn không được gọi. Nếu chỉ JS đã được xây dựng trong quản lý tài liệu tham khảo: ( – Cristian

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