Сохранить динамически измененный HTML на кнопку Назад

Это удивительно, я постоянно вижу, что это работает на других сайтах, но никогда на сайтах, над которыми я работаю.

Я привожу новый контент с ajax, я знаю об истории.js и API истории, я не хочу менять URL-адрес, просто кэш браузера новый HTML-контент, поэтому, когда пользователь покидает страницу и возвращается с помощью кнопки "назад", у него все еще есть обновленный HTML.

Я вижу, что это работает все время на других сайтах без изменений URL или использования хэша #.
Есть ли трюк, чтобы заставить его работать или он случайным образом решается браузером?
Если я не хочу использовать URL для получения этой информации, есть ли простая альтернатива?

6 ответов


уже около полутора десятилетий я использую два трюка, которые я когда - то обнаружил болезненными пробами и ошибками: значения входных полей - особенно "скрытые" - сохраняются в истории браузера вместе с URL - адресом и-событие onLoad вызывается при возвращении на страницу кнопками назад (или вперед).

Это означает, что вы можете хранить столько "состояния", сколько хотите - в скрытых полях (не забудьте поместить их в форму), а затем "повторить" изменения в "onLoad". Обычно я делаю часть "рендеринга" отдельной функцией... Другими словами, в момент возникновения динамичности я сначала пишу в скрытые поля , а затем вызываю функцию рендеринга. Затем я собираю все различные функции рендеринга для различных битов динамичности и вызываю их из onLoad.

Я бы подчеркнул, что я никогда не охотился за этим в каких-либо руководствах - поэтому не могу предложить никаких гарантий - но я использую его надежно в течение длительного времени (с тех пор Netscape!!!) Он работает со "многими" браузерами (все IEs, chrome, FF - но что касается других, я никогда не пробовал.)

Если у кого - то есть более "правильный" - и менее утомительный-способ, я, например, буду очень рад услышать об этом. Но это, кажется, делает трюк.


автор RES здесь, нашел ваш вопрос в/r / javascript

по-видимому, Firefox недавно добавил функциональность, чтобы сделать это самостоятельно, но нет "хорошего" способа сделать это, когда браузер не делает этого за вас.

то, что RES использовал, это добавить маркер #page=n, где n - номер вашей страницы. Таким образом, на pageload RES знает, что вы, должно быть, пришли с кнопки "назад", если уже есть местоположение.hash -- к сожалению, это конкретное поведение, вызванное ctrl-f найти в и Firefox, и Chrome, когда находка заставляла вас прокручивать другую страницу (page = n+1), потому что hashchange закрывал диалог поиска, который раздражал пользователей...

Итак, теперь RES делает некоторые уродливые и несовершенные гимнастики, чтобы угадать, прибыли ли вы на страницу с помощью кнопки "Назад". Каждый раз, когда он загружает новую страницу, он сохраняет этот номер в sessionStorage (например, localStorage, но локальный для вкладки), и при появлении с помощью кнопки "назад" он запускает запрос на эту страницу число.

однако: недавно я тестировал в FF и Chrome, и кажется, что хэш-изменения больше не "отменяют" диалог поиска ctrl-f, поэтому я предлагаю вам использовать это. При загрузке страницы, если присутствует хэш, загрузите соответствующие данные, определенные этим хэшем.

вы можете, если хотите получить действительно сумасшедший, сохранить фактический HTML-контент в localStorage и перезагрузить его на pageload с помощью кнопки "Назад". Возможно, это не самый эффективный способ, и почти наверняка вызовет конфликты с javascript, который полагается на DOM, хотя, так что будьте осторожны!

"лучшее" решение действительно зависит от того, что именно делает ваш сайт / как выглядит / ведет себя этот контент.


вы можете достичь своей цели с помощью истории.js как это:

function manageHistory(data){

    var History = window.History;
    if ( !History.enabled ) { return false; }        
    History.replaceState({myData: data}, null);
}

$('select.select').change(function(e) { // I am using select tag here to give an example of an HTML action triggerer

    e.preventDefault(); 

    // get data from your select tag

    manageHistory( data)


});

History.Adapter.bind(window, 'statechange', function() { 
    var State = History.getState();

    // Launch the ajax call and update DOM using State.data.myData
});

согласно документации об истории на сайте Mozilla, третий параметр PushState:

URL - ....... Этот параметр является необязательным; если он не указан, он имеет значение текущего URL-адреса документа.


Я думаю, что причиной может быть то, что другие веб-страницы используют некоторые серверные серверы, которые предоставляют сеанс.

Если вы создаете статическую страницу html / js, такой сессии нет, и страница просто перезагружается.

вы можете использовать cookies для достижения желаемого.


локальное хранилище-это один из способов, другой способ-сохранение на стороне сервера.

когда HTML редактируется / создается / некоторое свойство изменяется на стороне клиента, вам нужно синхронизировать изменение состояния вашей страницы с webstorage или базой данных через restful api (или что-то сопоставимое).

когда вы вернетесь на страницу-страница может получить сохраненную информацию из локального хранилища... Если вы используете сохраняемость на стороне сервера, вам нужно будет использовать ее в сочетании с сеансом cookie, для получения изменения состояния пользователя, которые затем могут быть загружены с сервера.


Я бы рекомендовал вам использовать cookies.

хотя HTML5 предлагает Webstorage, С ним значения могут быть сохранены в браузере. Есть также некоторые JS-библиотеки, обрабатывающие HTML5 Webstorage.

Примечание: существуют различия между размерами данных, которые может хранить каждый браузер. Вы можете найти больше об этом здесь.

Note2: были также некоторые проблемы с взломом дискового пространства пользователя, поэтому вы можете ожидать, что политики об использовании webstorage будут будьте в курсе.(http://feross.org/fill-disk/)