2011-02-11 9 views
11

¿Alguien sabe de una biblioteca que determina si se puede usar pushState?Puede usar pushState

que estaba usando esto:

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

Pero me acabo de enterar que hay un error en Safari 5.0.2 que hace que no trabajar a pesar de que la prueba anterior pasa: http://support.github.com/discussions/site/2263-line-links-broken.

Estoy pensando que podría haber otros problemas y alguien probablemente ya los ha encontrado y los ha empaquetado pero aún no he encontrado nada.

Editar: @Crescent fresco

Por lo que he visto parece que empuja pushState en la pila historia y cambia la url, pero no actualiza location.pathname. En mi código estoy usando setInterval para verificar si la ruta se ha actualizado.

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

En Safari 5.0.2 la ubicación.nombre de la ruta no cambia cuando pushState cambia la url. Esto funciona en otros navegadores y versiones de Safari.

+0

¿Qué parte de esa página vinculada dice que las pruebas para 'window.history.pushState' no son válidas? Parece que el error está relacionado con algo específico que está haciendo github ('pushState' junto con la configuración' location.hash', de lo que puedo deducir). –

Respuesta

16

pushState es parte de HTML5 History API. Puede comprobar la compatibilidad con JavaScript regular de este modo:

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

Alternativamente, se puede utilizar el Modernizr biblioteca:

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

Mirando el código fuente renovador así es como se comprueba el estado de empuje:

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

Así que una manera simple para que usted acaba de ser:

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

Primero se debe verificar la existencia de window.history antes de ir a dos niveles de profundidad y es probable que haya experimentado un error.

+1

debería ser (!! window.history && !! history.pushState) ... .... (window.history && history.pushState) devolverá false/true ... no sirve de nada !! fuera de él ... –

+0

Una alternativa sería 'window.history && 'pushState' en window.history'. – sn3p