Можно использовать 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!
}