Я пытаюсь использовать API истории HTML5 с загрузкой содержимого ajax.
У меня есть куча тестовых страниц, связанных относительными ссылками. У меня есть JS, который обрабатывает клики по этим ссылкам. При щелчке ссылки обработчик захватывает свой атрибут href и передает его в ajaxLoadPage(), который загружает контент с запрашиваемой страницы в область содержимого текущей страницы. (Мои PHP-страницы настроены для возврата полной HTML-страницы, если вы запрашиваете их в обычном режиме, но только фрагмент содержимого, если? URL-адрес = true добавлен к URL-адресу запроса.)
Затем мой обработчик кликов вызывает history.pushState(), чтобы отобразить URL-адрес в адресной строке и добавить его в историю браузера.
$(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);
}
}
});
});
Когда вы добавляете URL-адреса в историю с помощью pushState, вам также необходимо включить обработчик событий для события popstate для обработки щелчков на кнопках с обратной или прямой. (Если вы этого не сделаете, щелчок назад показывает URL-адрес, который вы нажали в историю в адресной строке, но страница не обновляется.) Поэтому мой обработчик popstate захватывает URL-адрес, сохраненный в свойстве состояния каждой записи, которую я создал, и передает его в ajaxLoadPage для загрузки соответствующего содержимого.
Это работает нормально для страниц, которые мой обработчик кликов добавляет в историю. Но что происходит со страницами, которые браузер добавил в историю, когда я попросил их "нормально"? Скажем, что я приземляюсь на своей первой странице, а затем просматриваю свой сайт с помощью кликов, которые делают эту загрузку ajax, - если я затем попытаюсь вернуться к истории на первую страницу, последний щелчок показывает URL-адрес первой страницы, но doesn Загрузите страницу в браузере. Почему это?
Я могу видеть, что это имеет какое-то отношение к свойству состояния последнего события popstate. Свойство состояния является нулевым для этого события, потому что только записи добавляются в историю с помощью pushState() или replaceState(), которые могут дать ему значение. Но моя первая загрузка страницы была "нормальным" запросом - почему браузер не просто отступает и обычно загружает начальный URL?