Czy istnieje sposób na zmodyfikowanie adresu URL bieżącej strony bez ponownego ładowania strony?
Chciałbym uzyskać dostęp do części przed hashem #, jeśli to możliwe.
Muszę tylko zmienić część po domenie, więc to nie tak, że naruszam zasady dotyczące wielu domen.
window.location.href = "www.mysite.com/page2.php"; // Sadly this reloads
history.pushState()
jest to prawdopodobnie właściwa odpowiedź tutaj, w tej sytuacji (w zależności od konkretnych okoliczności ...) możliwość skorzystania z przekierowania po stronie serwera (na przykład za pomocą dyrektywy RewriteRule Apache) jest czymś, co warto rozważyć, a przynajmniej być świadomym. Pomyślałem, że należy o tym wspomnieć!Odpowiedzi:
Można to teraz zrobić w Chrome, Safari, Firefox 4+ i Internet Explorer 10pp4 +!
Aby uzyskać więcej informacji, zobacz odpowiedź na to pytanie: Aktualizowanie paska adresu nowym adresem URL bez mieszania lub przeładowywania strony
Przykład:
Następnie możesz użyć
window.onpopstate
do wykrycia nawigacji przycisku Wstecz / Dalej :Bardziej szczegółowe spojrzenie na manipulowanie historią przeglądarki znajduje się w tym artykule MDN .
źródło
W HTML5 wprowadzono metody
history.pushState()
ihistory.replaceState()
, które pozwalają odpowiednio dodawać i modyfikować wpisy historii.Przeczytaj więcej na ten temat stąd
źródło
file:///
ze względów bezpieczeństwa, np. Firefox 30. Testlocalhost
zpython -m SimpleHTTPServer
.Możesz również użyć HTML5 replaceState, jeśli chcesz zmienić adres URL, ale nie chcesz dodawać wpisu do historii przeglądarki:
Spowodowałoby to „uszkodzenie” funkcji przycisku wstecz. Może to być wymagane w niektórych przypadkach, na przykład w galerii obrazów (gdzie chcesz, aby przycisk Wstecz wrócił do strony indeksu galerii, zamiast przesuwać się po każdym oglądanym obrazie), jednocześnie nadając każdemu obrazowi swój unikalny adres URL.
źródło
Oto moje rozwiązanie (newUrl to nowy adres URL, który chcesz zastąpić bieżącym):
źródło
UWAGA: Jeśli pracujesz z przeglądarką HTML5, powinieneś zignorować tę odpowiedź. Jest to teraz możliwe, jak widać w innych odpowiedziach.
Nie można zmodyfikować adresu URL w przeglądarce bez ponownego ładowania strony. Adres URL reprezentuje ostatnią załadowaną stronę. Jeśli to zmienisz (
document.location
), spowoduje to ponowne załadowanie strony.Jednym z oczywistych powodów jest to, że piszesz witrynę,
www.mysite.com
która wygląda jak strona logowania do banku. Następnie zmieniasz pasek adresu URL przeglądarki, aby powiedziećwww.mybank.com
. Użytkownik będzie zupełnie nieświadomy, że tak naprawdę na niego patrzywww.mysite.com
.źródło
źródło
W nowoczesnych przeglądarkach i HTML5 istnieje metoda wywoływana
pushState
w okniehistory
. To zmieni adres URL i prześle go do historii bez ładowania strony.Możesz użyć tego w ten sposób, zajmie 3 parametry, 1) stan obiektu 2) tytuł i adres URL):
Spowoduje to zmianę adresu URL, ale nie przeładuje strony. Ponadto nie sprawdza, czy strona istnieje, więc jeśli wykonasz kod JavaScript reagujący na adres URL, możesz z nimi pracować w ten sposób.
Jest też coś,
history.replaceState()
co robi dokładnie to samo, tyle że zmodyfikuje bieżącą historię zamiast tworzyć nową!Możesz także utworzyć funkcję, aby sprawdzić, czy
history.pushState
istnieje, a następnie kontynuować resztę w następujący sposób:Możesz także zmienić
#
for<HTML5 browsers
, który nie przeładuje strony. W ten sposób Angular wykorzystuje SPA zgodnie z hashtagiem ...Zmiana
#
jest dość łatwa, wykonując:Możesz to wykryć w następujący sposób:
źródło
window.onhashchange
iwindow.onpopstate
zrobić to samo w tym przypadku?HTML5 replaceState jest odpowiedzią, jak już wspomniano w Vivart i geo1701. Jednak nie jest obsługiwany we wszystkich przeglądarkach / wersjach. History.js zawiera funkcje stanu HTML5 i zapewnia dodatkową obsługę przeglądarek HTML4.
źródło
Przed wersją HTML5 możemy użyć:
i:
Ta metoda spowoduje ponowne załadowanie strony, ale HTML5 wprowadził tę,
history.pushState(page, caption, replace_url)
która nie powinna ponownie ładować strony.źródło
history.pushState(..)
polega na tym, że jeśli chcesz przekierować do innej domeny, obowiązują zasady dotyczące wielu domen. Podczaswindow.location.replace(..)
przekierowania do innej domeny jest możliwe.Jeśli próbujesz zezwolić użytkownikom na dodawanie zakładek do zakładek / udostępnianie stron, a nie potrzebujesz dokładnie tego adresu URL i nie używasz kotwic mieszających do niczego innego, możesz to zrobić na dwa sposoby Części; korzystasz z location.hash omówionego powyżej, a następnie zaimplementujesz sprawdzanie na stronie głównej, aby wyszukać adres URL z zakotwiczeniem skrótu i przekierować do następnego wyniku.
Na przykład:
1) Użytkownik jest włączony
www.site.com/section/page/4
2) Użytkownik wykonuje pewne czynności, które zmieniają adres URL na
www.site.com/#/section/page/6
(z skrótem). Załóżmy, że załadowałeś na stronę prawidłową treść strony 6, więc oprócz skrótu użytkownik nie jest zbytnio zakłócany.3) Użytkownik przekazuje ten adres URL komuś innemu lub dodaje go do zakładek
4) Ktoś inny lub ten sam użytkownik w późniejszym terminie udaje się do
www.site.com/#/section/page/6
5) Kod na
www.site.com/
przekierowuje użytkownikawww.site.com/section/page/6
, używając czegoś takiego:Mam nadzieję, że to ma sens! Jest to przydatne podejście w niektórych sytuacjach.
źródło
Poniżej znajduje się funkcja zmiany adresu URL bez ponownego ładowania strony. Jest obsługiwany tylko dla HTML5.
źródło
Wszelkie zmiany lokalizacji (albo
window.location
albodocument.location
) spowodują żądanie dotyczące tego nowego adresu URL, jeśli nie zmienisz tylko fragmentu adresu URL. Jeśli zmienisz adres URL, zmienisz adres URL.Użyj technik przepisywania adresów URL po stronie serwera, takich jak mod_rewrite Apache, jeśli nie podoba ci się adres URL, którego aktualnie używasz.
źródło
Możesz dodać tagi kotwicy. Używam tego w mojej witrynie, aby móc śledzić za pomocą Google Analytics, co ludzie odwiedzają na stronie.
Po prostu dodaję tag zakotwiczenia, a następnie część strony, którą chcę śledzić:
źródło
Jak zauważył Thomas Stjernegaard Jeppesen, możesz użyć History.js do modyfikowania parametrów URL, podczas gdy użytkownik porusza się po twoich linkach i aplikacjach Ajax.
Od tej odpowiedzi minął prawie rok, a History.js urósł i stał się bardziej stabilny i działał w różnych przeglądarkach. Teraz można go używać do zarządzania stanami historii w zgodnych z HTML5, a także w wielu przeglądarkach obsługujących tylko HTML4. W tym demo możesz zobaczyć przykład, jak to działa (a także móc wypróbować jego funkcje i ograniczenia.
Jeśli potrzebujesz pomocy w korzystaniu i implementowaniu tej biblioteki, radzę spojrzeć na kod źródłowy strony demonstracyjnej: zobaczysz, że jest to bardzo łatwe.
Wreszcie, aby uzyskać wyczerpujące wyjaśnienie problemów związanych z używaniem skrótów (i skrótów), sprawdź ten link Benjamina Luptona.
źródło
Użyj
history.pushState()
z interfejsu API historii HTML 5.Więcej informacji można znaleźć w interfejsie API historii HTML5 .
źródło
Możesz użyć tej pięknej i prostej funkcji, aby to zrobić w dowolnym miejscu swojej aplikacji.
Możesz nie tylko edytować adres URL, ale także aktualizować tytuł wraz z nim.
Całkiem pomocny wszystkim.
źródło
window.history.pushState('data', 'Title', '#new_location');