Próbuję API historii HTML5 z ładowaniem zawartości ajax.Ajax z history.pushState i popstate - co mam zrobić, gdy właściwość state popstate ma wartość NULL?
Mam kilka stron testowych połączonych względnymi linkami. Mam ten JS, który obsługuje kliknięcia tych łączy. Po kliknięciu łącza przewodnik pobiera atrybut href i przekazuje go do ajaxLoadPage(), która ładuje zawartość z żądanej strony do obszaru zawartości bieżącej strony. (Moje strony PHP są skonfigurowane tak, aby zwracać pełną stronę HTML, jeśli zwykle ich zażądasz, ale tylko fragment treści, jeśli? Fragment = true jest dołączany do adresu URL żądania.)
Następnie moja historia obsługi połączeń odpowiada historii .pushState(), aby wyświetlić adres URL w pasku adresu i dodać go do historii przeglądarki.
$(document).ready(function(){
var content = $('#content');
var ajaxLoadPage = function (url) {
console.log('Loading ' + url + ' fragment');
content.load(url + '?fragment=true');
}
// Handle click event of all links with href not starting with http, https or #
$('a').not('[href^=http], [href^=https], [href^=#]').on('click', function(e){
e.preventDefault();
var href = $(this).attr('href');
ajaxLoadPage(href);
history.pushState({page:href}, null, href);
});
// This mostly works - only problem is when popstate happens and state is null
// e.g. when we try to go back to the initial page we loaded normally
$(window).bind('popstate', function(event){
console.log('Popstate');
var state = event.originalEvent.state;
console.log(state);
if (state !== null) {
if (state.page !== undefined) {
ajaxLoadPage(state.page);
}
}
});
});
Podczas dodawania adresów URL do historii z pushState trzeba także zawierać obsługi zdarzeń dla popstate przypadku do czynienia z kliknięć na plecach lub przyciskami forward. (Jeśli tego nie zrobisz, kliknięcie z powrotem wyświetli adres URL przeniesiony do historii w pasku adresu, ale strona nie zostanie zaktualizowana.) Tak więc moja obsługa popstate przechwytuje adres URL zapisany we właściwości state każdego wpisu, który utworzyłem, i przekazuje go do ajaxLoadPage, aby załadować odpowiednią zawartość.
To działa poprawnie w przypadku stron, które moja aplikacja obsługi kliknięć została dodana do historii. Ale co się dzieje ze stronami przeglądarki dodanymi do historii, kiedy poprosiłem o "normalnie"? Powiedzmy, że normalnie ląduję na mojej pierwszej stronie, a potem poruszam się po mojej stronie za pomocą kliknięć, które ładują ten ajax - jeśli spróbuję wrócić do tej pierwszej strony, ostatnie kliknięcie pokazuje adres URL pierwszej strony, ale robi nie załaduje strony w przeglądarce. Dlaczego?
Mogę zobaczyć, że ma to coś wspólnego z własnością stanową tego ostatniego wydarzenia. Właściwość state ma wartość null dla tego zdarzenia, ponieważ to tylko wpisy dodawane do historii przez metodę pushState() lub replaceState(), która może nadać jej wartość. Ale moje pierwsze ładowanie strony było "normalnym" żądaniem - dlaczego przeglądarka nie cofa się i nie ładuje początkowego adresu URL?
Działa z jednym małym problemem, jeśli przeładujesz stronę, załaduje tylko część ajaxową strony. Chciałbym usłyszeć, jeśli ktoś ma rozwiązanie do przeładowania strony. – Hydrino
@Hydrino Naciśnij stan z prawidłowym adresem URL i załaduj stronę z AJAX. –