Historia API jest jedną z tych technik JavaScript, które każdy Web developer musi znać na zimno. Bez tego jedno kliknięcie przycisku Wstecz wyskoczy prosto z aplikacji. Stracisz wszelkie prace w toku, a użytkownik będzie zmuszony zacząć wszystko od nowa.
na szczęście jest proste rozwiązanie. Od czasu sformalizowania HTML5 (i wydania Internet Explorer 10) mamy interfejs API historii, który pozwala dodawać do listy historii i reagować na nawigację Wstecz i do przodu. W tym artykule dowiesz się, jak to działa — i wypróbujesz go na żywym przykładzie.
ale zanim przejdziemy dalej, przyjrzyjmy się bliżej problemowi.
w dawnych czasach w sieci strona internetowa robiła jedną rzecz-wyświetlała rzeczy. Kiedy chciałeś spojrzeć na coś innego, kliknąłeś link i przeszedłeś do nowego adresu URL.
wraz z rozwojem JavaScript, Programiści zdali sobie sprawę, że każda strona internetowa może być kompletną aplikacją samą w sobie. Strona internetowa może konkurować z aplikacją desktopową! Problem polegał na tym, że przyciski do tyłu i do przodu w przeglądarce nie pasowały do tego nowego modelu aplikacji. Na przykład użytkownik może wykonać sekwencję zadań w jednostronicowej aplikacji internetowej, a następnie oczekiwać, że użyje przycisku Wstecz, aby cofnąć się o jeden krok. Zamiast tego przycisk Wstecz powróci do poprzedniej strony internetowej, skutecznie zamykając aplikację JavaScript w środku tego, co robiła.
często takie zachowanie nie było intuicyjne. Na przykład rozważ aplikację, która używa obiektuXMLHttpRequest do pobierania nowych danych i aktualizacji strony. Dla użytkownika może to wyglądać, jakby podróżował do nowej strony. Ale jeśli popełnią błąd używając przycisku Wstecz, iluzja zostanie rozbita i wszystko pójdzie na boki.
przyjrzyjmy się bliżej. Oto przykład, który pozwoli Ci przejść przez Dictionnaire Infernal, słynną (a teraz domenę publiczną) książkę z 1818 roku opisującą dziwne bestie z przesądów i mitologii. Sztuczka polega na tym, że poprzednie i następne linki nie przenoszą Cię na inną stronę. Zamiast tego wywołują asynchroniczne wywołanie poprzez XMLHttpRequest, które pobiera informacje dla następnego slajdu. Następnie kod JavaScript aktualizuje pole slajdów, nie naruszając treści na pozostałej części strony.
oto aktualna wersja przykładu, wraz z obsługą API historii. Mimo że wszystko odbywa się na jednej stronie internetowej, możesz użyć przycisków do przodu i do tyłu, aby płynnie przejść od jednego obrazu do drugiego. Możesz nawet użyć przycisku Przeładuj (przeładowuje bieżący slajd, zamiast ponownie uruchamiać całą aplikację), a także umieścić zakładki, które zachowują aktualny stan — innymi słowy, prowadzą prosto do slajdu, na który aktualnie patrzysz.
a oto stara wersja przykładu, która nie używa API historii. Nie ma znaczenia, jak daleko jesteś w pokazie bocznym – po użyciu przycisku Wstecz, przeskakujesz z powrotem do poprzedniej strony. Przyciski Forward I Reload są podobnie uszkodzone. Zakładki uruchom ponownie aplikację od początku.
możesz pobrać cały kod źródłowy tutaj do zabawy. (Jednak nie będzie działać lokalnie, ponieważ używa obiektuXMLHttpRequest do wysyłania żądań internetowych.) W dalszej części tego artykułu omówię, jak wszystko działa.
przygotowanie przykładu
zanim przejdziemy do historii API, ważne jest, aby mieć podstawową wiedzę na temat tego, jak ten przykład działa. To całkiem proste.
strona używa numeru, aby śledzić slajd, który jest aktualnie wyświetlany. Po kliknięciu przycisku Next lub Previous kod zmienia bieżący numer slajdu. Następnie używa własnej funkcjigoToSlide() do aktualizacji strony.
funkcja goToSlide() jest miejscem, w którym odbywa się prawdziwa praca. Uruchamia ono asymetryczne żądanie używając niesławnego obiektu XMLHttpRequest.
to Ty decydujesz, w jaki sposób zawartość slajdu zostanie wygenerowana i odesłana do kodu wywołującego na stronie. Zazwyczaj masz jakiś rodzaj struktury routingu, która uruchamia odpowiedni kod po stronie serwera. Ten kod po stronie serwera może następnie pobrać zawartość slajdu z pamięci podręcznej, bazy danych, Pliku, a nawet zakodowanego bloku znaczników.
w tym przykładzie trzymałem rzeczy tak proste, jak to tylko możliwe. Żądanie pobiera znaczniki HTML z pliku statycznego. Jeśli więc żądasz trzeciego slajdu (z względnym adresem URL, takim jak Slides/3), otrzymasz fragment znaczników HTML dla tego slajdu. Spokojnie!
Po zakończeniu żądania przeglądarka uruchamia obsługę zdarzenianewSlideReceived(). Następnie wystarczy wziąć otrzymany znacznik i wstawić go na stronę, używając symbolu zastępczego <div>.
to wszystko, co musisz wiedzieć, aby zbudować naiwną wersję tej strony, która nie obsługuje historii przeglądarki.
obiekt history
obiekthistory istnieje niemal od zarania JavaScript. Ale przez większą część swojego życia był znacznie mniej potężny (i znacznie mniej użyteczny) niż jest dzisiaj.
oryginalny history obiekt posiada tylko jedną właściwość i trzy podstawowe metody. Właściwość to length I informuje, ile wpisów znajduje się na liście historii przeglądarki:
alert("You have " + history.length + " pages in the history.");
ten szczegół jest w większości bezużyteczny.
trzy oryginalne metody history to back() (wysyła odwiedzającego o krok do tyłu w historii przeglądania), forward() (wysyła odwiedzającego o krok do przodu) i go() (pobiera przesunięcie liczbowe, które informuje przeglądarkę, ile kroków należy wykonać do przodu lub do tyłu). Wszystko to składa się na stosunkowo niewiele, chyba że chcesz zaprojektować własne niestandardowe przyciski do tyłu i do przodu na stronie internetowej.
Historiapi dodaje dwa znacznie bardziej przydatne składniki: metodę pushState() oraz Zdarzenie onPopState.
dodanie wpisu do listy historii
metodapushState() jest centralnym elementem API historii. Umożliwia dodanie nowego elementu do listy historii bieżącej strony. Oto jak to wygląda: