2011-02-11 15 views
11

Czy ktoś wie o bibliotece, która określa, czy można użyć parametru pushState?Można używać pushState

używałem to:

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

Ale ja po prostu okazało się, że jest to błąd w Safari 5.0.2, która powoduje to, aby nie pracować, mimo że powyższe testy przechodzi: http://support.github.com/discussions/site/2263-line-links-broken.

Wydaje mi się, że mogą istnieć inne potagi i ktoś prawdopodobnie już je znalazł i owinął je, ale nie znalazłem jeszcze nic.

Edit: @Crescent Fresh

Z tego co widziałem to wydaje się pushState naciska na historii stosu i zmienia adres URL, ale nie aktualizuje location.pathname. W moim kodzie używam setInterval, aby sprawdzić, czy ścieżka została zaktualizowana.

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

W przeglądarce Safari 5.0.2 nazwa location.pathname nie zmienia się, gdy parametr pushState zmienia adres URL. Działa to w innych przeglądarkach i wersjach Safari.

+0

Która część tej połączonej strony mówi, że testowanie dla 'window.history.pushState' jest nieprawidłowe? Wygląda na to, że błąd jest związany z czymś, co robi konkretny github ('pushState' w połączeniu z ustawieniem' location.hash', z tego, co mogę zebrać). –

Odpowiedz

16

pushState jest częścią HTML5 History API. Można przetestować wsparcie przy użyciu zwykłej JavaScript tak:

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

Alternatywnie, można użyć Modernizr Biblioteka:

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

Patrząc na kod źródłowy modernizatora Jak to sprawdza stan Push:

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

więc prostym sposobem dla Ciebie będzie tylko:

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

Najpierw sprawdź, czy istnieje window.history, zanim przejdziesz na dwa poziomy i prawdopodobnie właśnie dlatego wystąpił błąd.

+1

to powinno być (!! window.history && !! history.pushState) .... (window.history && history.pushState) samo zwróci false/true ... no point using !! poza nim .. –

+0

Alternatywą byłoby 'window.history && 'pushState' w window.history'. – sn3p

Powiązane problemy