Modyfikuj adres URL paska adresu w aplikacji AJAX, aby pasował do bieżącego stanu

Piszę aplikację AJAX, ale jak użytkownik przechodzi przez aplikację, chciałbym URL w pasku adresu, aby zaktualizować pomimo braku przeładowania strony. Zasadniczo chciałbym, aby mogli w dowolnym momencie dodać zakładkę i tym samym powrócić do obecnego stanu.

Jak ludzie radzą sobie z utrzymaniem spokoju w aplikacjach AJAX?

Author: Rais Alam, 2008-08-04

8 answers

Sposobem na to jest manipulowanie location.hash gdy aktualizacje AJAX powodują zmianę stanu, że chcesz mieć dyskretny adres URL. Na przykład, jeśli adres URL Twojej strony to:

Http://example.com/

Jeśli funkcja po stronie klienta wykonała ten kod:

// AJAX code to display the "foo" state goes here.

location.hash = 'foo';

Wtedy URL wyświetlany w przeglądarce zostanie zaktualizowany do:

Http://example.com/#foo

To pozwala użytkownikom na zakładkę " foo " stanu strony, i używać historia przeglądarki do nawigacji między Stanami.

Po wdrożeniu tego mechanizmu będziesz musiał przeanalizować fragment skrótu adresu URL po stronie klienta za pomocą JavaScript, aby utworzyć i wyświetlić odpowiedni stan początkowy, ponieważ identyfikatory fragmentów (część po#) nie są wysyłane do serwera.

Wtyczka hashchange Bena Almana sprawia, że ta ostatnia jest bardzo prosta, jeśli używasz jQuery.

 116
Author: Dave Ward,
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-06-20 17:31:29

Spójrz na strony jak book.cakephp.org. ta strona Zmienia Adres URL bez użycia hash i używać AJAX. Nie wiem, jak to dokładnie robi, ale próbowałem to rozgryźć. Jeśli ktoś wie, daj mi znać.

Także github.com patrząc na nawigację w ramach określonego projektu.

 18
Author: daniel.wright,
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-13 19:54:34

Jest mało prawdopodobne, aby pisarz chciał przeładować lub przekierować swojego gościa podczas korzystania z Ajax. Ale dlaczego nie używać HTML5 pushState/replaceState?

Będziesz mógł dowolnie modyfikować pasek adresu. uzyskaj naturalnie wyglądające adresy URL za pomocą AJAX.

Zobacz kod mojego najnowszego projektu: http://iesus.se/

 17
Author: iesus,
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-06-24 23:05:18

To jest podobne do tego, co powiedział Kevin. Możesz mieć stan klienta jako jakiś obiekt javascript, a gdy chcesz zapisać stan, możesz serializować obiekt (używając kodowania JSON i base64). Następnie można ustawić fragment href na ten ciąg znaków.

var encodedState = base64(json(state));
var newLocation = oldLocationWithoutFragment + "#" + encodedState;

document.location = newLocation; // adds new entry in browser history
document.location.replace(newLocation); // replaces current entry in browser history

Pierwszy sposób potraktuje nowy stan jako nową lokalizację (więc przycisk Wstecz przeniesie je do poprzedniej lokalizacji). Ten ostatni nie.

 12
Author: Edward Luong,
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-08-04 18:06:37

SWFAddress działa w projektach Flash & Javascript i pozwala tworzyć bookmarkable URL (za pomocą metody hash, o której mowa powyżej), a także daje wsparcie przycisku Wstecz.

Http://www.asual.com/swfaddress/

 3
Author: ,
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-01 13:43:36

Okno.miejsce.metoda hash jest preferowanym sposobem robienia rzeczy. Dla wyjaśnienia jak to zrobić, Wzorce Ajax-Unikalne Adresy URL .

YUI ma implementację tego wzorca jako modułu, który zawiera specyficzne dla IE obszary pracy dla uzyskania przycisku back wraz z ponownym zapisem adresu za pomocą hasha. YUI Menedżer historii przeglądarki .

Inne frameworki również mają podobne implementacje. Ważne jest to, jeśli chcesz historię aby działać wraz z ponownym zapisem adresu, różne przeglądarki potrzebują różnych sposobów obsługi GO. (Jest to szczegółowo opisane w pierwszym artykule link.)

IE potrzebuje hakera opartego na iframe, w którym Firefox stworzy podwójną historię przy użyciu tej samej metody.

 3
Author: Drew Noakes,
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 10:00:25

Jeśli OP lub inni nadal szukają sposobu na zmodyfikowanie historii przeglądarki, aby włączyć stan, użycie pushState i replaceState, zgodnie z sugestią IESUS, jest 'właściwym' sposobem, aby to zrobić teraz. To główna przewaga nad lokalizacją.hash wygląda na to, że tworzy rzeczywiste adresy URL, a nie tylko hasze. Jeśli historia przeglądarki z hashami jest zapisywana, a następnie ponownie odwiedzana z wyłączoną obsługą javascript, aplikacja nie będzie działać, ponieważ hasze nie są wysyłane na serwer. Jeśli jednak użyto pushState, cała trasa będzie wysyłane na serwer, które następnie można zbudować, aby odpowiednio reagować na trasy. Widziałem przykład, w którym te same szablony wąsów były używane zarówno po stronie serwera, jak i po stronie klienta. Jeśli klient miał włączoną obsługę javascript, otrzymałby zgryźliwe odpowiedzi, unikając podróży do serwera, ale aplikacja działałaby doskonale bez javascript. W ten sposób, aplikacja może wdzięcznie degradacji w przypadku braku javascript.

Poza tym uważam, że istnieje jakiś framework o nazwie jak historia.js. W przypadku przeglądarek obsługujących HTML5 używa pushState, ale jeśli przeglądarka tego nie obsługuje, automatycznie powraca do używania skrótów.

 3
Author: Neil,
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-06-23 09:20:36

Sprawdź, czy użytkownik jest " na " stronie, po kliknięciu na pasku adresu URL, javascript mówi, że jesteś poza stroną. Jeśli zmienisz pasek adresu url i naciśniesz "ENTER" z symbolem " # " w nim, a następnie ponownie wejdziesz na stronę, bez klikania strony ręcznie kursorem myszy, a następnie polecenie zdarzenia klawiatury (dokument.onkeypress) z javascript będzie w stanie sprawdzić, czy jest enter i aktywny javascript do przekierowania. Możesz sprawdzić, czy użytkownik znajduje się na stronie z oknem.onfocus i sprawdź czy jest z okno.onblur.

Tak, to możliwe.

;)

 2
Author: Marcelo,
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-10-13 23:18:50