Zmień adres URL w przeglądarce bez ładowania nowej strony za pomocą JavaScript
Jak miałbym mieć JavaScript działanie, które może mieć pewne skutki na bieżącej stronie, ale również zmienić adres URL w przeglądarce, więc jeśli użytkownik naciśnie przeładuj lub zakładkę nowy adres URL jest używany?
Byłoby również miło, gdyby przycisk Wstecz przeładował oryginalny adres URL.
Próbuję zarejestrować Stan JavaScript w adresie URL.
14 answers
Jeśli chcesz, aby działał w przeglądarkach, które jeszcze nie obsługują history.pushState
i history.popState
, "starym" sposobem jest ustawienie identyfikatora fragmentu, co nie spowoduje przeładowania strony.
Podstawową ideą jest ustawienie właściwości window.location.hash
na wartość, która zawiera wszelkie potrzebne informacje o stanie, następnie użyj okna .Zdarzenie onhashchange lub dla starszych przeglądarek, które nie obsługują onhashchange
(IE setInterval) i aktualizuj strona. Aby skonfigurować początkową zawartość, musisz również sprawdzić wartość hash podczas ładowania strony.
Jeśli używasz jQuery, istnieje wtyczka hashchange , która użyje dowolnej metody obsługiwanej przez przeglądarkę. Jestem pewien, że istnieją również wtyczki do innych bibliotek.
Należy uważać na kolizję z identyfikatorami na stronie, ponieważ przeglądarka przewija dowolny element o pasującym identyfikatorze.
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
2011-10-05 16:46:43
Z HTML 5, Użyj history.pushState
function . Jako przykład:
<script type="text/javascript">
var stateObj = { foo: "bar" };
function change_my_url()
{
history.pushState(stateObj, "page 2", "bar.html");
}
var link = document.getElementById('click');
link.addEventListener('click', change_my_url, false);
</script>
I href:
<a href="#" id='click'>Click to change url to bar.html</a>
Jeśli chcesz zmienić adres URL bez dodawania wpisu do listy przycisków Wstecz, użyj history.replaceState
.
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-04-07 16:35:10
Okno.miejsce.href zawiera aktualny adres URL. Można z niego czytać, można do niego dodawać i można go zastąpić, co może spowodować przeładowanie strony.
Jeśli, Jak to brzmi, chcesz zapisać stan javascript w adresie URL, aby można go było dodawać do zakładek, bez przeładowywania strony, dodaj go do bieżącego adresu URL po znaku # i poproś, aby fragment javascript wyzwalany przez zdarzenie onload analizował bieżący adres URL, aby sprawdzić, czy zawiera zapisany stan.
Jeśli używasz a ? zamiast#, będziesz Wymuś przeładowanie strony, ale ponieważ będziesz analizować zapisany stan po załadowaniu, może to nie być problemem; a to sprawi, że przyciski do przodu i do tyłu będą działać poprawnie.
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
2008-09-25 22:19:36
Podejrzewałbym, że nie jest to możliwe, ponieważ byłby to niesamowity problem bezpieczeństwa, gdyby tak było. Na przykład, mogę zrobić stronę, która wyglądała jak strona logowania do banku, a adres URL w pasku adresu wygląda tak jak prawdziwy bank !
Być może jeśli wyjaśnisz, dlaczego chcesz to zrobić, ludzie mogą być w stanie zasugerować alternatywne podejścia...
[Edit w 2011: odkąd napisałem tę odpowiedź w 2008, więcej informacji wyszło na jaw odnośnie technika HTML5 która pozwala na modyfikację adresu URL pod warunkiem, że pochodzi on z tego samego źródła]
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
2011-02-01 12:09:43
Ustawienia zabezpieczeń przeglądarki uniemożliwiają użytkownikom bezpośrednią modyfikację wyświetlanego adresu url. Możesz sobie wyobrazić luki w zabezpieczeniach phishingowych, które mogłyby spowodować.
Jedynym niezawodnym sposobem zmiany adresu url bez zmiany stron jest użycie wewnętrznego linku lub hasha. np.: http://site.com/page.html staje się http://site.com/page.html#item1 . Technika ta jest często używana w hijax(AJAX + preserve history).
Robiąc to często używam linków do akcji z hash jako href, a następnie dodaj zdarzenia kliknięć za pomocą jquery, które używają żądanego skrótu do określenia i delegowania akcji.
Mam nadzieję, że to wskaże Ci właściwą drogę.
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
2008-09-26 01:03:31
jQuery posiada świetną wtyczkę do zmiany adresu URL przeglądarki, o nazwie jQuery-pusher.
JavaScript pushState
i jQuery mogą być używane razem, jak:
history.pushState(null, null, $(this).attr('href'));
Przykład:
$('a').click(function (event) {
// Prevent default click action
event.preventDefault();
// Detect if pushState is available
if(history.pushState) {
history.pushState(null, null, $(this).attr('href'));
}
return false;
});
Using only JavaScript history.pushState()
, który zmienia referrer, który jest używany w nagłówku HTTP dla obiektów XMLHttpRequest utworzonych po zmianie stan.
Przykład:
window.history.pushState("object", "Your New Title", "/new-url");
Metoda pushState ():
pushState()
pobiera trzy parametry: obiekt stanu, tytuł (który jest obecnie ignorowany) i (opcjonalnie) adres URL. Przyjrzyjmy się każdemu z tych trzech parametrów bardziej szczegółowo:
-
obiekt state - obiekt state jest obiektem JavaScript, który jest powiązany z nowym wpisem history utworzonym przez
pushState()
. Ilekroć użytkownik przechodzi do nowego stanu, a Zdarzenie popstate jest wywoływane, a właściwość state zdarzenia zawiera kopię obiektu state wpisanego w historii.Obiektem stanu może być wszystko, co można serializować. Ponieważ Firefox zapisuje obiekty stanu na dysku użytkownika, aby mogły zostać przywrócone po ponownym uruchomieniu przeglądarki, nakładamy limit rozmiaru 640k znaków na serializowaną reprezentację obiektu stanu. Jeśli przekażesz obiekt stanu, którego serializowana reprezentacja jest większa niż ta do
pushState()
, metoda będzie wyrzuć wyjątek. Jeśli potrzebujesz więcej miejsca, zachęcamy do korzystania z sessionStorage i / lub localStorage. title - Firefox obecnie ignoruje ten parametr, chociaż może go używać w przyszłości. Przekazanie pustego ciągu powinno być bezpieczne przed przyszłymi zmianami w metodzie. Alternatywnie możesz przekazać krótki tytuł dla stanu, do którego się przenosisz.
URL - adres URL nowego wpisu historii jest podany przez to parametr. Zauważ, że przeglądarka nie będzie próbowała załadować tego adresu URL po wywołaniu
pushState()
, ale może spróbować załadować adres URL później, na przykład po ponownym uruchomieniu przeglądarki. Nowy adres URL nie musi być bezwzględny; jeśli jest względny, zostanie rozwiązany względem bieżącego adresu URL. Nowy URL musi być tego samego pochodzenia co bieżący URL; w przeciwnym raziepushState()
wyrzuci wyjątek. Ten parametr jest opcjonalny; jeśli nie jest określony, jest ustawiony na bieżący adres URL dokumentu.
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-10-08 21:04:06
Istnieje komponent Yahoo YUI (Menedżer historii przeglądarki), który może sobie z tym poradzić: http://developer.yahoo.com/yui/history/
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
2008-09-25 23:47:45
Galeria Zdjęć Facebook robi to za pomocą # hash w adresie URL. Oto kilka przykładowych adresów URL:
Przed kliknięciem "dalej":
/photo.php?fbid=496429237507&set=a.218088072507.133423.681812507&pid=5887027&id=681812507
Po kliknięciu "Dalej":
/photo.php?fbid=496429237507&set=a.218088072507.133423.681812507&pid=5887027&id=681812507#!/photo.php?fbid=496435457507&set=a.218088072507.133423.681812507&pid=5887085&id=681812507
Uwaga na hash-bang (#!) natychmiast po nowym adresie URL.
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
2011-01-11 15:43:21
Jest miejsce.hash= "tekst" w http://probablyinteractive.com/url-hunter
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
2011-04-20 11:31:31
Jest plugin jquery http://www.asual.com/jquery/address/
Myślę, że to jest to, czego potrzebujesz.
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
2011-04-20 14:03:27
Mój kod to:
//change address bar
function setLocation(curLoc){
try {
history.pushState(null, null, curLoc);
return false;
} catch(e) {}
location.hash = '#' + curLoc;
}
I akcja:
setLocation('http://example.com/your-url-here');
I przykład
$(document).ready(function(){
$('nav li a').on('click', function(){
if($(this).hasClass('active')) {
} else {
setLocation($(this).attr('href'));
}
return false;
});
});
To wszystko:)
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-01-10 07:30:46
Zastanawiałem się, czy będzie to możliwe, dopóki ścieżka nadrzędna na stronie jest taka sama, tylko coś nowego zostanie do niej dołączone.
Więc powiedzmy, że użytkownik jest na stronie: http://domain.com/site/page.html
Wtedy przeglądarka może pozwolić mi zrobić location.append = new.html
a strona staje się: http://domain.com/site/page.htmlnew.html
i przeglądarka jej nie zmienia.
Lub po prostu pozwól osobie zmienić parametr get, więc let ' s location.get = me=1&page=1
.
Tak oryginalna strona staje się http://domain.com/site/page.html?me=1&page=1
i nie odświeża się.
Problem z # polega na tym, że dane nie są buforowane (przynajmniej tak mi się wydaje) kiedy hash jest zmieniany. Tak więc jest tak, jak za każdym razem, gdy ładowana jest nowa strona, podczas gdy przyciski Wstecz i do przodu na stronie NIE-Ajax są w stanie buforować dane i nie spędzają czasu na ponownym ładowaniu danych.
Z tego, co widziałem, Historia Yahoo ładuje wszystkie dane na raz. Wydaje się, że nie wykonuje żadnych żądań Ajax. Więc gdy div
jest używany do obsługi różnych metod, dane te nie są przechowywane dla każdego stanu historii.
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
2010-09-22 08:33:58
Odniosłem sukces z:
location.hash="myValue";
Dodaje #myValue
do bieżącego adresu URL. Jeśli chcesz wywołać zdarzenie podczas ładowania strony, możesz użyć tej samej location.hash
, aby sprawdzić odpowiednią wartość. Pamiętaj tylko, aby usunąć #
z wartości zwracanej przez location.hash
np.
var articleId = window.location.hash.replace("#","");
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-23 11:56:41
Dla mnie działa funkcja - history.replaceState()
która jest następująca -
history.replaceState(data,"Title of page"[,'url-of-the-page']);
To nie spowoduje przeładowania strony, można z niej skorzystać przy pomocy zdarzenia javascript
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-04-26 06:52:24