2011-02-11 11 views
11

PushState kullanılıp kullanılamayacağını belirleyen bir kitaplık bilen var mı?Kullanarak pushState

bu kullanıyordum: http://support.github.com/discussions/site/2263-line-links-broken:

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

Ama sadece yukarıdaki test geçer olsa bile çalışmamasına neden olur Safari 5.0.2 bir hata olduğunu öğrendim.

Diğer tuhaflıklar olabileceğini düşünüyorum ve birileri muhtemelen onları zaten bulup sarstı ama henüz bir şey bulamadım.

Düzenleme: pushState geçmişi yığının üstüne iter ve url değiştirir ama location.pathname güncelleme değildir gibi görünüyor gördüklerime @Crescent Taze

. Kodumda, yolun güncellenmiş olup olmadığını kontrol etmek için setInterval kullanıyorum. Safari'de

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

pushState url değiştirdiğinde değişmez location.pathname 5.0.2. Bu, diğer tarayıcılarda ve Safari sürümlerinde çalışır.

+0

Bağlantılı sayfanın hangi bölümü "window.history.pushState" için testin geçersiz olduğunu söylüyor? Görünüşe göre hata, belirli bir github’ın yaptığı şeyle ilgilidir ('pushState',' toplayabildiğimden 'location.hash' ayarıyla bağlantılı olarak). –

cevap

16

pushState, HTML5 History API'un bir parçasıdır. Çok gibi düzenli JavaScript kullanarak destek için test edebilirsiniz:

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

Alternatif olarak, Modernizr kitaplığını kullanabilirsiniz: Bu da itme devlet denetler nasıl çağdaşlaştırıcı kaynak koduna baktığımızda

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

:

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

Yani sizin için basit bir yolu sadece olacaktır:

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

İki seviye derinliğe gitmeden önce önce window.history'un varlığını kontrol etmelisiniz ve bu muhtemelen bir hatayla karşılaşıyor olabilir.

+1

aslında olmalı (!! window.history && !! history.pushState) .... (window.history && history.pushState) kendisi yanlış/true döndürür ... hiçbir nokta kullanarak !! dışarıda .. –

+0

Bir alternatif window.history 'içinde pencere.history &&' pushState 'olacaktır. – sn3p

İlgili konular