Modyfikuj adres URL bez przeładowywania strony

Czy mogę modyfikować adres URL bieżącej strony bez przeładowywania strony?

Chciałbym uzyskać dostęp do części Przed # hash, jeśli to możliwe.

Muszę tylko zmienić część Po domenie, więc to nie tak, że naruszam Zasady między domenami.

 window.location.href = "www.mysite.com/page2.php";  // sadly this reloads
Author: Robinicks, 2009-05-05

18 answers

Teraz można to zrobić w Chrome, Safari, FF4+ i IE10pp4+!

Zobacz odpowiedź na to pytanie, aby uzyskać więcej informacji: Aktualizacja paska adresu z nowym adresem URL bez hasha lub przeładowania strony

Przykład:

 function processAjaxData(response, urlPath){
     document.getElementById("content").innerHTML = response.html;
     document.title = response.pageTitle;
     window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
 }

Możesz użyć window.onpopstate, aby wykryć nawigację przycisku wstecz/do przodu:

window.onpopstate = function(e){
    if(e.state){
        document.getElementById("content").innerHTML = e.state.html;
        document.title = e.state.pageTitle;
    }
};

Aby uzyskać bardziej szczegółowe spojrzenie na manipulowanie historią przeglądarki zobacz Ten artykuł MDN .

 1657
Author: David Murdoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24

HTML5 wprowadził history.pushState() oraz history.replaceState() metody, które umożliwiają odpowiednio dodawanie i modyfikowanie wpisów historii.

window.history.pushState('page2', 'Title', '/page2.php');

Czytaj więcej na ten temat z tutaj

 397
Author: Vivart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 01:58:17

UWAGA: jeśli pracujesz z HTML5 przeglądarką, powinieneś zignorować tę odpowiedź. Jest to teraz możliwe, co widać w innych odpowiedziach.

Nie ma możliwości modyfikacji URL w przeglądarce bez przeładowania strony. Adres URL reprezentuje ostatnią załadowaną stronę. Jeśli go zmienisz (document.location), to przeładuje stronę.

Jednym z oczywistych powodów jest to, że piszesz stronę na 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 całkowicie nieświadomy, że naprawdę patrzy na www.mysite.com.
 97
Author: Robin Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 11:11:01

Możesz również użyć HTML5 replaceState Jeśli chcesz zmienić adres url, ale nie chcesz dodawać wpisu do historii przeglądarki:

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

Spowoduje to "złamanie" funkcji przycisku Wstecz. Może to być wymagane w niektórych przypadkach, takich jak Galeria obrazów (gdzie chcesz, aby przycisk Wstecz wracał do strony indeksu galerii zamiast przesuwać się z powrotem do każdego oglądanego obrazu), jednocześnie nadając każdemu obrazowi swój unikalny adres url.

 95
Author: George Filippakos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 07:11:55
parent.location.hash = "hello";
 75
Author: Martin.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-23 17:57:27

Oto moje rozwiązanie: (newUrl to Twój nowy url, który chcesz zastąpić bieżącym)

history.pushState({}, null, newUrl);
 52
Author: Haimei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 18:25:35

HTML5 replaceState jest odpowiedzią, jak już wspomniano przez Vivart i geo1701. Jednak nie jest on obsługiwany we wszystkich przeglądarkach/wersjach. Historia.js zawiera funkcje stanu HTML5 i zapewnia dodatkowe wsparcie dla przeglądarek HTML4.

 25
Author: Thomas Stjernegaard Jeppesen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-21 11:09:02

Przed HTML5 możemy użyć:

parent.location.hash = "hello";

I:

window.location.replace("http:www.example.com");

Ta metoda przeładuje Twoją stronę, ale HTML5 wprowadził history.pushState(page, caption, replace_url), która nie powinna przeładowywać Twojej strony.

 20
Author: Shine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 22:34:08

Jeśli próbujesz zezwolić użytkownikom na zakładki/udostępnianie stron, a nie potrzebujesz dokładnie odpowiedniego adresu URL i nie używasz kotwic haszujących do niczego innego, możesz to zrobić w dwóch częściach; używasz lokalizacji.hash omówione powyżej, a następnie zaimplementować sprawdzenie na stronie głównej, aby wyszukać adres URL z zakotwiczeniem w nim i przekierować do następnego wyniku.

Na przykład:

1) Użytkownik jest na www.site.com/section/page/4

2) użytkownik wykonuje jakąś akcję, która zmienia URL do www.site.com/#/section/page/6 (z Hashem). Powiedzmy, że załadowałeś poprawną treść dla strony 6, więc oprócz hasha użytkownik nie jest zbyt zaniepokojony.

3) Użytkownik przekazuje ten adres URL komuś innemu, lub zakłada go do zakładki

4) ktoś inny, lub ten sam użytkownik w późniejszym terminie, przechodzi do www.site.com/#/section/page/6

5) Kod na www.site.com/ przekierowuje użytkownika na www.site.com/section/page/6, używając czegoś takiego:

if (window.location.hash.length > 0){ 
   window.location = window.location.hash.substring(1);
}
Mam nadzieję, że to ma sens! Jest to przydatne podejście w niektórych sytuacjach.
 18
Author: Jeremy Warne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 12:10:09

Wszelkie zmiany lokalizacji (window.location LUB document.location) spowodują żądanie dla tego nowego adresu URL, jeśli nie zmieniasz 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 podobają ci się adresy URL, których obecnie używasz.

 12
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-05 10:58:53

Możesz dodawać znaczniki zakotwiczenia. Używam tego na mojej stronie http://www.piano-chords.net / abym mógł śledzić za pomocą google analytics, co ludzie odwiedzają na stronie. Po prostu dodaję tag kotwicy, a następnie część strony, którą chcę śledzić.

var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);
 11
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-14 09:04:42

Poniżej znajduje się funkcja zmiany adresu URL bez przeładowywania strony. To tylko wsparcie dla HTML5

  function ChangeUrl(page, url) {
        if (typeof (history.pushState) != "undefined") {
            var obj = {Page: page, Url: url};
            history.pushState(obj, obj.Page, obj.Url);
        } else {
            window.location.href = "homePage";
            // alert("Browser does not support HTML5.");
        }
    }

  ChangeUrl('Page1', 'homePage');
 10
Author: Suraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-27 08:33:13

W nowoczesnych przeglądarkach i HTML5 istnieje metoda o nazwie pushState w oknie history. Spowoduje to zmianę adresu URL i przesunięcie go do historii bez ładowania strony.

Możesz go używać w ten sposób, będzie to wymagało 3 parametrów, 1) obiektu stanu 2) tytułu i adresu URL):

window.history.pushState({page: "another"}, "another page", "example.html");

To zmieni adres url, ale nie przeładuje strony, również nie sprawdza, czy strona istnieje, więc jeśli wykonasz kod javascript, który reaguje na adres URL, możesz pracować z nimi jak to.

Istnieje również history.replaceState(), która robi dokładnie to samo, z tym, że modyfikuje bieżącą historię zamiast tworzyć nową!

Można również utworzyć funkcję, aby sprawdzić, czy historia.pushState istnieje, a następnie kontynuuj z resztą tak:

function goTo(page, title, url) {
  if ("undefined" !== typeof history.pushState) {
    history.pushState({page: page}, title, url);
  } else {
    window.location.assign(url);   
  }
}

goTo("another page", "example", 'example.html');

Możesz również zmienić # na <HTML5 browsers, co nie spowoduje przeładowania strony, w ten sposób Angular użyj SPA zgodnie z hashtagiem...

Zmiana # jest dość łatwa, robiąc tak:

window.location.hash = "example";

I można to wykryć w następujący sposób:

window.onhashchange = function () {
  console.log("#changed", window.location.hash);
}
 10
Author: Alireza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-13 01:20:39

Jak zauważył Thomas Stjernegaard Jeppesen, możesz użyć historii.js , aby zmodyfikować parametry URL, podczas gdy użytkownik przechodzi przez łącza Ajax i aplikacje.

Minął prawie rok od tej odpowiedzi, a historiajs rosła i stała się bardziej stabilna i cross-browser. Teraz może być używany do zarządzania stanami historii w zgodnych z HTML5, jak również w wielu przeglądarkach tylko HTML4. w tym demo można zobaczyć przykład, jak to działa (a także możliwość wypróbowania jego funkcjonalności i ograniczenia.

Jeśli potrzebujesz pomocy w użyciu i zaimplementowaniu tej biblioteki, proponuję rzucić okiem na kod źródłowy strony demo: zobaczysz, że jest to bardzo łatwe do zrobienia.

Wreszcie, aby uzyskać wyczerpujące wyjaśnienie, jakie mogą być problemy związane z używaniem hashów (i hashbangów), sprawdź ten link autorstwa Benjamina Luptona.

 7
Author: Erenor Paz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-05 13:55:24

Jest to możliwe bez użycia hashów, spójrz na asual jQuery Address plugin :

Przykład tutaj .

Zauważ, że będzie używał hashów w IE, nie ma dla niego obejścia.

 6
Author: satoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-18 09:37:35

Użyj history.pushState() z HTML 5 History API

Zobacz link po więcej szczegółów HTML5 History API

 3
Author: Prathamesh Rasam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-15 11:55:32

Użyj window.history.pushState("object or string", "Title", "/new-url"), ale nadal wysyła nowe żądanie url do serwera

 -4
Author: Huy Truong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 04:04:41

Zakładając, że nie próbujesz zrobić czegoś złośliwego, wszystko, co chcesz zrobić z własnymi adresami URL, może zostać magiczne za pomocą htaccess .

 -8
Author: Hexagon Theory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-05 12:23:52