2011-02-11 10 views
11

Qualcuno sa di una libreria che determina se può essere utilizzato pushState?Può utilizzare pushState

stavo usando questo:

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

Ma ho appena scoperto che c'è un bug in Safari 5.0.2, che fa sì che non funzionare, anche se la prova di cui sopra passa: http://support.github.com/discussions/site/2263-line-links-broken.

Sto pensando che ci potrebbero essere altri trucchi e qualcuno probabilmente li ha già trovati e impacchettati ma non ho ancora trovato nulla.

Edit: @Crescent Fresh

Da quello che ho visto sembra pushState spinge nello stack storia e cambia l'url, ma non aggiorna location.pathname. Nel mio codice sto usando setInterval per verificare se il percorso è stato aggiornato.

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

In Safari 5.0.2 il percorso percorso non cambia quando pushState cambia l'URL. Funziona con altri browser e versioni di Safari.

+0

Quale parte di quella pagina collegata dice che il test per 'window.history.pushState' non è valido? Sembra che il bug sia collegato a qualcosa che sta facendo github specifico ('pushState' in congiunzione con l'impostazione' location.hash', da ciò che posso raccogliere). –

risposta

16

pushState fa parte di HTML5 History API. È possibile verificare per il supporto utilizzando regolari JavaScript in questo modo:

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

In alternativa, è possibile utilizzare la libreria Modernizr:

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

Guardando il codice sorgente modernizzatore è così che verifica la presenza di stato di spinta:

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

Quindi, un modo semplice per voi sarebbe solo:

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

Prima di passare a due livelli è necessario innanzitutto verificare l'esistenza di window.history ed è probabilmente il motivo per cui si è verificato un errore.

+1

dovrebbe effettivamente essere (!! window.history && !! history.pushState) .... (window.history && history.pushState) restituirà esso stesso false/true ... nessun punto usando !! al di fuori di esso .. –

+0

Un'alternativa sarebbe 'window.history && 'pushState' in window.history'. – sn3p

Problemi correlati