Можно использовать pushState
Кто-нибудь знает библиотеку, которая определяет, можно ли использовать pushState?
Я использовал это:
if(window.history.pushState){
window.history.pushState(null, document.title, path);
}else{
location.pathname = path;
}
Но я только узнал, что в Safari 5.0.2 есть ошибка, из-за которой он не работает, хотя приведенный выше тест проходит: http://support.github.com/discussions/site/2263-line-links-broken.
Я думаю, что могут быть другие gotchas, и кто-то, вероятно, уже нашел их и обернул их, но я еще ничего не нашел.
Edit:
@Crescent Fresh
Из того, что я видел, кажется, что pushState нажимает на стек истории и меняет URL-адрес, но не обновляет location.pathname. В моем коде я использую setInterval, чтобы проверить, обновлен ли путь.
var cachedPathname = location.pathname;
if(window.history.pushState){
cachedPathname = location.pathname;
setInterval(function(){
if(cachedPathname !== location.pathname){
cachedPathname = location.pathname;
//do stuff
}
}, 100);
}
В Safari 5.0.2 имя location.pathname не изменяется, когда pushState изменяет URL. Это работает в других браузерах и версиях Safari.
Ответы
Ответ 1
Глядя на исходный код Modernizer, он проверяет состояние push:
tests['history'] = function() {
return !!(window.history && history.pushState);
};
Итак, простой способ для вас:
var hasPushstate = !!(window.history && history.pushState);
Сначала нужно проверить существование window.history
, прежде чем идти на два уровня в глубину и, вероятно, почему вы столкнулись с ошибкой.
Ответ 2
pushState является частью API истории HTML5. Вы можете протестировать поддержку, используя обычный JavaScript, например:
if (typeof history.pushState !== "undefined") {
// pushState is supported!
}
В качестве альтернативы вы можете использовать библиотеку Modernizr:
if (Modernizr.history) {
// pushState is supported!
}