Восстановление содержимого при нажатии кнопки с помощью History.js
Я реализовал History.js в локальном тестовом приложении. Кажется, все работает, но если я нажму кнопку "Назад" в браузере, предыдущий контент не восстановится.
Нужно ли мне снова загружать содержимое вручную (т.е. делать другой вызов ajax), когда пользователь нажимает кнопку "Назад" ? Тогда как это делает github? Я вижу, что они не делают другого вызова ajax при нажатии кнопки возврата в дереве кода.
Вот мой код:
History.Adapter.bind(window,'statechange',function()
{
var State = History.getState();
History.log(State.data, State.title, State.url);
});
$('a').each(function(index, link) {
if ($(link).attr('data-ajax-disabled') != 'true') {
$(link).click(function(event)
{
var clips = $(this).attr('data-ajax-clips') || '';
$.ajax($(this).attr('href'),
{
data: {_clips:clips},
success: function(data)
{
var data = $.parseJSON(data);
History.pushState({state:1}, data.title || document.title, 'http://127.0.0.1/site/www/');
$.each(data.clips, function(key, val)
{
$(key).replaceWith(val);
});
}
});
return false;
});
}
});
data.clips - это json-массив, который содержит id html-объектов в качестве ключа и фактическое содержимое html как значение. Например
'# header' = > 'content в заголовке div
Как уже отмечалось, замена отлично работает. Я вывожу случайное число в заголовок. Каждый щелчок по ссылке выплевывает еще одно случайное число в заголовке. Однако, если я нажму кнопку "Назад" , число останется прежним, будет восстановлено только название (также случайное число).
Ответы
Ответ 1
Хорошо, я понял это, также благодаря Тобиасу Коэну за подсказку.
Необходимо сохранить загруженные данные в объекте history (State.data). Сначала посмотрим, как изменился обратный вызов statechange:
History.Adapter.bind(window, 'statechange', function()
{
var State = History.getState();
$.each(State.data.clips, function(key, val)
{
$(key).replaceWith(val);
});
History.log(State.data, State.title, State.url);
});
Как вы можете видеть, на каждом изменении состояния я могу получить доступ к State.data.clips и заменить содержимое html.
ПРИМЕЧАНИЕ. Изменение состояния также происходит при вызове History.pushState(). Это означает, что в моем первоначальном вопросе второй фрагмент кода ошибочен в том, что я делаю манипуляции с содержимым. Там нет необходимости. Просто вызовите History.pushState() и выполните любую обработку содержимого в обратном вызове statechange.
Итак, для полноты, так я вставляю клипы в объект истории:
History.pushState({state:1, clips:data.clips}, data.title || document.title, 'http://127.0.0.1/site/www/');