Можно использовать pushState - PullRequest
11 голосов
/ 11 февраля 2011

Кто-нибудь знает библиотеку, которая определяет, можно ли использовать 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.

Я думаю, что могут быть другие ошибки, и кто-то, вероятно, уже нашел их и завернул их, но я не нашелеще ничего.

Редактировать: @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.

Ответы [ 2 ]

24 голосов
/ 18 мая 2012

Глядя на исходный код Модернизатора, вот как он проверяет состояние push:

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

Итак, простой способ для вас будет просто:

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

Сначала нужно проверитьза существование window.history до перехода на два уровня в глубину, и, вероятно, именно поэтому вы столкнулись с ошибкой.

16 голосов
/ 01 ноября 2011

pushState является частью HTML5 History API . Вы можете проверить поддержку с помощью обычного JavaScript, например, так:

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

Кроме того, вы можете использовать библиотеку Modernizr :

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