2013-05-08 7 views
41

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

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

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

+0

Как насчет сохранения «статуса» страницы в файле cookie? Например, клиент щелкнул, чтобы отобразить окно входа в систему, затем вы сохраните это действие в файле cookie «login = 1», например, и всякий раз, когда клиент возвращается, вы используете javascript для чтения файла cookie и отображения входа. Хотя я не думаю, что это «лучшее» решение, так как может быть слишком много «вариантов», чтобы позаботиться. – HamZa

+1

Да, файлы cookie и сеанс и localstorage, все хорошие способы сохранения состояния, например параметров, будут перезагружены. Но я вижу, что другие сайты работают без этого. У них нет визуальной задержки, когда я нажимаю кнопку «Назад», даже если вся страница была построена с помощью ajax. Как они это делают? – Madd0g

+0

Возможно, они создают страницу _before_ onload, которая должна быть, когда браузер кэширует HTML. –

ответ

40

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

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

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

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

+1

Привет, Гровер, спасибо за ответ, я понимаю, как это делается вручную (т. Е. Сохранить параметры состояния, а затем перезагрузить, когда пользователь вернется на страницу). Дело в том, что я вижу на многих сайтах ajax (с firefox, как указано в других комментариях), HTML все еще существует, когда я отжимаю назад, и нет необходимости перезагружать вообще. Я хотел бы понять, как это делается. – Madd0g

+0

Вы и я тоже ... :) Интересно, как/если техника, которую вы используете, работает с браузерами, отличными от FF. Я часто работаю с правительственными агентствами, которые часто стандартизируются для старых браузеров IE - некоторые из них по-прежнему находятся на IE6 (хотя и начинают быть реже), но IE7 будет примерно на некоторое время ... Во всяком случае, я буду наблюдать с большим интересом , Спасибо за постановку вопроса. – Groover

+1

Повторяя ваш ответ, я хотел бы также отметить, что описанная техника не требует фактической остановки сервера, чтобы «перезагрузить» страницу - или любую ее часть - или изменить URL-адрес и т. Д. - эффект заключается в том, что при нажатии кнопку возврата назад, чтобы вернуться на страницу, все динамические изменения волшебны на месте при первом просмотре страницы - будь то в первую очередь ajax или просто, скажем, суммировании столбца цифр. Простите меня, если это уже было понято. :) – Groover

0

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

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

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

+0

, если они не содержат страницы и страницы html в localstorage, я не вижу, как можно восстановить все это без какой-либо перерисовки, это мгновенно. Удерживая только параметры последней страницы в памяти и вызывая ее с помощью ajax, определенно сделайте видимые изменения и займет больше времени. – Madd0g

1

Вы можете достичь своей цели с помощью 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 — ....... This parameter is optional; if it isn't specified, it's set to the document's current URL.

+0

спасибо, я знаю, как это сделать, я сделал это с плагином history.js, но все он выполняет сохранение положения прокрутки страницы во время вызова ajax. Я пробовал pushState и replaceState.В обоих случаях html, который я создал после загрузки страницы, исчез, когда я использовал обратную кнопку – Madd0g

9

Автор РЭС здесь, найдены ваш вопрос в/r/javascript

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

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

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

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

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

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

+0

спасибо за ответ, очень интересно узнать историю. Точно так же, как NER в RES, мой сайт просто загружает новые страницы контента inline, а не использует традиционный пейджинг. Как и reddit, сами страницы сами по себе не стоят, поэтому обновление URL-адреса (таким образом позволяя пользователям копировать постоянную ссылку) просто вызовет путаницу, если URL-адрес получит общий доступ, и я хотел его избежать. Но похоже, что это не выход. В любом случае, это не РЕАЛЬНОЕ требование, просто то, чего я надеялся избежать. спасибо – Madd0g

+0

Хотелось бы, чтобы у меня был лучший ответ для этого, кроме «нет» «хорошего» способа сделать это, когда браузер не сделает это за вас ». Я думаю, я никогда не узнаю, почему он работает reddit и не на моих сайтах. Спасибо в любом случае – Madd0g

+0

, насколько я понимаю, только FF сохранит состояние NER на Reddit. вы говорите, что видите, что Chrome тоже сохраняет его? – honestbleeps

-1

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

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

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

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

0

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

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

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

+0

это не работает, по крайней мере, в хроме. похоже, что браузер также кэширует сообщение ajax get, даже если заголовки кеширования не имеют кеша. – Roey