2011-02-11 26 views
11

Có ai biết thư viện xác định xem pushState có thể được sử dụng không?Có thể sử dụng pushState

Tôi đã sử dụng này:

if(window.history.pushState){ 
    window.history.pushState(null, document.title, path); 
}else{ 
    location.pathname = path; 
} 

Nhưng tôi vừa phát hiện ra rằng có một lỗi trong Safari 5.0.2 gây ra nó không làm việc mặc dù thử nghiệm trên đi: http://support.github.com/discussions/site/2263-line-links-broken.

Tôi nghĩ rằng có thể có các gotchas khác và ai đó có thể đã tìm thấy chúng và gói chúng lên nhưng tôi chưa tìm thấy gì.

Edit: @Crescent tươi

Từ những gì tôi đã nhìn thấy nó có vẻ như pushState đẩy vào lịch sử ngăn xếp và thay đổi url nhưng không cập nhật location.pathname. Trong mã của tôi, tôi đang sử dụng setInterval để kiểm tra xem đường dẫn đã được cập nhật chưa.

var cachedPathname = location.pathname; 
if(window.history.pushState){ 
    cachedPathname = location.pathname; 
    setInterval(function(){ 
     if(cachedPathname !== location.pathname){ 
      cachedPathname = location.pathname; 
      //do stuff 
     } 
    }, 100); 
} 

Trong Safari 5.0.2 location.pathname không thay đổi khi pushState thay đổi url. Tính năng này hoạt động trên các trình duyệt và phiên bản Safari khác.

+0

Phần nào của trang được liên kết đó cho biết thử nghiệm cho 'window.history.pushState' không hợp lệ? Có vẻ như lỗi liên quan đến một thứ gì đó cụ thể mà github đang làm ('pushState' kết hợp với việc thiết lập' location.hash', từ những gì tôi có thể thu thập). –

Trả lời

16

pushState là một phần của HTML5 History API. Bạn có thể kiểm tra hỗ trợ sử dụng JavaScript thường xuyên như vậy:

if (typeof history.pushState !== "undefined") { 
    // pushState is supported! 
} 

Ngoài ra, bạn có thể sử dụng Modernizr thư viện:

if (Modernizr.history) { 
    // pushState is supported! 
} 
24

Nhìn vào mã nguồn hiện đại hóa này là cách nó kiểm tra nhà nước đẩy:

tests['history'] = function() { 
     return !!(window.history && history.pushState); 
    }; 

vì vậy, một cách đơn giản để bạn sẽ chỉ được:

var hasPushstate = !!(window.history && history.pushState); 

Trước hết, bạn phải kiểm tra sự tồn tại của window.history trước khi đi sâu hai cấp và đó có thể là lý do bạn gặp phải lỗi.

+1

nó thực sự phải là (!! window.history && !! history.pushState) .... (window.history && history.pushState) sẽ tự trả về false/true ... không dùng điểm !! bên ngoài nó .. –

+0

Một giải pháp thay thế sẽ là 'window.history && 'pushState' trong window.history'. – sn3p

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