Можете ли вы сохранить динамическое c содержимое страницы, использующей ajax, чтобы оно было восстановлено, когда пользователи вернутся? - PullRequest
1 голос
/ 08 мая 2020

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

Например, в LinkedIn или Twitter, когда вы go вернулись из твита / публикации, страница, похоже, больше не отправляет запросы, это мгновенный переход.

Означает ли это, что вы можете каким-то образом сохранить всю страницу с помощью JS и сразу же восстановить ее без повторных запросов к серверу? Или это какая-то махинация, когда страница на самом деле не меняется, поэтому это всего лишь одно страничное приложение, и весь контент загружается динамически?

Редактировать: я думаю, что Twitter / LinkedIn каким-то образом заменяет контент на той же странице и не перенаправляет на другую страницу (я предполагаю), но у меня 2 отдельные страницы.

Я перефразирую и попытаюсь объяснить лучше .

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

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

Теперь пользователи нажимают кнопка «Назад» возвращает на главную страницу, как мне сделать так, чтобы пользователи видели контент с того места, где он остановился.

Решения, которые я пробовал.

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

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

Как я могу показать пользователю контент с того места, откуда он ушел, при возвращении на главную страницу и сохранении положения прокрутки страница с бесконечной прокруткой? (Я снова приведу твиттер в качестве примера)

Ответы [ 2 ]

1 голос
/ 10 июня 2020

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

  1. Вам это действительно нужно вообще? Почему бы не открывать полноразмерные изображения в новых вкладках? Или почему бы не открыть их, не покидая страницы? Вы можете использовать History API , если вам нужна функция перемотки вперед / назад. И вы сэкономите весь трафик c, который сможете. Кроме того, при отображении полноразмерного изображения вы можете позволить пользователю перемещаться между полноразмерными изображениями с помощью клавиш со стрелками и других интересных вещей.

  2. Примерно

    но я думаю, что это не очень хорошая идея, потому что загрузка большого количества такого контента влияет на производительность

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

  3. О названии вопроса: нам действительно стоит поговорить про воссоздание состояние не про восстановление это. Потому что для этого:

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

    Ответ: « Нет, не можешь ». Не потому, что это совершенно невозможно, а потому, что у вас определенно не получится. Чтобы заархивировать эту цель, вам нужно

    1. Сериализовать каждую переменную вашего приложения где-то на при каждом изменении. Включая информацию о динамике c изменений в DOM.
    2. И не все легко сериализовать: Promise s, WeakMap s, Symbol s, данные с циклическими c ссылками и т. Д. c.
    3. Затем вам нужно будет десериализовать их обратно. И это тоже может быть проблемой. Особенно, если между сериализацией и десериализацией произошли некоторые изменения на стороне сервера. (Возможно, проще просто выбросить все и начать заново)
    4. Также вам нужно решить, нужно ли это вообще делать. Например, если пользователь посещает вашу страницу месяцем позже - вы действительно хотите показать состояние за месяц?
  4. Но если мы говорим о хранении какой-то важной переменной и воссоздавая состояние из них, тогда ответ будет: « Да, это происходит постоянно ».

    Существуют разные способы хранения данных на стороне клиента (даже БД!) И уж тем более хранить данные на сервере размером.

    Все они хороши для собственного сценария ios. Трудно сказать, что является лучшим способом, не зная этих сценариев ios.

    Но в этом конкретном случае вам нужно сохранить только 1 или 2 переменные. И использование файлов cookie, вероятно, лучший выбор. Хотя в наши дни вам нужно показывать некоторые назойливые сообщения, если вы используете файлы cookie. Из-за директивы ЕС о поварах ie . Но они просты в использовании, и если, например, вы решите предоставить пользователю состояние fre sh через месяц, вам просто нужно установить дату истечения срока действия для Cook ie, а вам нужно будет закодировать этот logi c, если вы используете localStorage.

    И, вероятно, нет необходимости в серверном хранилище на этом явно не бизнес-сайте.

1 голос
/ 09 июня 2020

Я бы порекомендовал вам использовать localStorage для этого, который имеет довольно хороший объем памяти .

Вы ограничены строками в нем, поэтому вы ' Для достижения наилучших результатов вам нужно будет преобразовать все в JSON.

Что вы храните, зависит от вас. Я бы создал объект с различными свойствами, такими как текущая высота прокрутки, последний запрошенный индекс и массив, содержащий все, что вы извлекли из AJAX до сих пор (а также все, что вы создали при загрузке страницы). Вы также можете захотеть сохранить, на какой странице это находится, если вы собираетесь использовать этот logi c на нескольких страницах, или просто изменить ключ для каждой страницы. Однако, если вы делитесь ключом, вы также можете полностью пропустить AJAX вызовы данных, которые у вас уже есть и которые вы считаете «fre sh» вашим собственным бизнес-логом c.

Ниже это пример кода. Если вы нажмете кнопку «Пуск» и дадите ей поработать пару секунд, вы увидите, что список увеличивается с отметками времени. Если вы затем обновите sh страницу, все по-прежнему будет на ней.

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

<button id="start">Start</button>
<button id="stop">Stop</button>

<ul id="list">

</ul>

А затем JS со встроенными комментариями, которые, надеюсь, должны объяснить все:

// This is the interval key, used when stopping the interval code
let iv;

const cache_key = 'my-cache-key';

function stop() {
    window.clearInterval( iv );
}

function start() {
    iv = window.setInterval( tick, 1000 );
}

function makeLi( text ) {
    const li = document.createElement( 'li' );
    li.appendChild( document.createTextNode( text ) );
    return li;
}

// Run once a second
function tick() {
    // Create a timestamp
    const ts = new Date().getTime();

    // Store it to local session
    store( ts );

    // Append to our list
    const ul = document.getElementById( 'list' );
    ul.appendChild( makeLi( ts ) );
}

function store( text ) {
    // See if we have our key
    let items = window.localStorage.getItem( cache_key );

    // Parse it as JSON or set it to an empty array to start
    if ( items ) {
        items = JSON.parse( items );
    } else {
        items = [];
    }

    // Append our current key
    items.push( text );

    // Push it back
    window.localStorage.setItem( cache_key, JSON.stringify( items ) );
}

// One page load, recreate all items
function load() {
    const ul = document.getElementById( 'list' );
    let items = window.localStorage.getItem( cache_key );
    if ( !items ) {
        return;
    }
    items = JSON.parse( items );
    items
        .forEach(
            ( item ) => {
                ul.appendChild( makeLi( item ) )
            }
        );
}

// Click handlers for the button
document.getElementById( 'start' ).addEventListener( 'click', start );
document.getElementById( 'stop' ).addEventListener( 'click', stop );

// Reload anything previously stored on page refresh
window.addEventListener( 'load', load );

Что касается того, что вы храните в локальном хранилище, это зависит. Если ваш DOM сложный, но короткий, вы могли бы сохранить его outerHTML, но это немного некрасиво. Вместо этого я бы сохранил минимальное количество полей, которые вы получаете от AJAX, которые вам нужно использовать для создания объектов.

Кроме того, для всего, что вы храните, я бы рекомендовал иметь свойство вашего объекта с именем что-то вроде "версии", и всякий раз, когда вы вводите новую функцию в свой AJAX logi c, увеличивайте ее вручную. Таким образом, если кто-то вернется на вашу страницу с данными, которые больше не имеют смысла, ваше приложение сможет их обнаружить и выбросить.

В этом примере приложения хранится очень простой массив, но, как я уже сказал, вы вы, вероятно, захотите сохранить объект, и вы также захотите выполнить проверку и очистку, как вы это делаете в AJAX.

edit

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

Из моего комментария этот сайт (которому 4 года) говорит, что 97,6% людей включили локальное хранилище, поэтому я бы обязательно использовал это, поскольку переход на более раннюю версию - это просто «только самая последняя версия», что все равно неплохой опыт.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...