Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

Вы можете достичь своей цели, используя History.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-адрес документа.

Ответ 4

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

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

Вы можете использовать файлы cookie для достижения желаемого.

Ответ 5

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

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

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

Ответ 6

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

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

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

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