pushState: для чего именно нужен объект состояния?

Я уже дюжину раз читал, что объект состояния может состоять из нескольких пар ключ|значение и что он связан с новой записью в истории. Но может ли кто-нибудь привести мне пример преимуществ государственного объекта? Какая от него практическая польза? Я не могу представить, почему бы просто не ввести {}


person campari    schedule 12.07.2013    source источник
comment
Мне кажется, что это полезно (используется) только в том случае, если у вас есть код в обработчике событий popstate. Я просто использую это впервые, и мне не нужен обработчик событий popstate. Поэтому я выбираю {}, потому что это наиболее подходящее значение. Нет ничего плохого в пустом объекте.   -  person jamess    schedule 15.01.2020


Ответы (2)


Возьмем этот небольшой пример - запустить скрипт:

У вас есть страница, на которой пользователь может выбрать цвет. Каждый раз, когда они это делают, мы создаем новую запись в истории:

function doPushState (color) {
    var state = {},
        title = "Page title",
        path  = "/" + color;
    
    history.pushState(state, title, path);
};

Мы пока оставляем объект состояния пустым и устанавливаем URL-адрес на название цвета (не перезагружайте страницу — такого URL-адреса не существует, поэтому вы получите 404).

Теперь нажмите на красный, зеленый и синий по одному разу. Обратите внимание, что URL-адрес меняется. Что произойдет, если вы нажмете кнопку «Назад»?

Браузер действительно возвращается в историю, но наша страница этого не замечает - URL-адрес меняется с «/ blue» обратно на «/ green», но наша страница остается на «Вы выбрали синий». Наша страница не синхронизирована с URL-адресом.

Вот для чего нужны событие window.onpopstate и объект состояния:

  1. Мы включаем выбранный нами цвет в наш объект состояния
function doPushState (color) {
    var state = { selectedColor: color }, // <--- here
        title = "Page title",
        path  = "/" + color;
    
    history.pushState(state, title, path);
};
  1. Затем мы прослушиваем событие popstate, чтобы знать, когда нам нужно обновить выбранный цвет, а именно:
window.addEventListener('popstate', function (event) {
    var state = event.state;
    
    if (state) {
        selectColor( state.selectedColor );
    }
});

Попробуйте обновленный пример: запустить скрипт: наша страница теперь обновляется соответствующим образом, когда пользователь перемещается назад по истории.

person janfoeh    schedule 12.12.2013
comment
Спасибо за наглядный пример - person Alvaro; 13.12.2013
comment
Это все хорошо, но что происходит, когда мой пользователь делится uri myawesomewebsite.com/blue со своим другом, говоря, посмотрите, какая классная синяя тема на этом веб-сайте, и эта тема не применяется, потому что у друга нет состояние, хранящееся в их браузере, у меня все еще должен быть какой-то другой механизм в моем приложении для восстановления состояния для первых посетителей uri, что делает эту функциональность избыточной, или я что-то здесь упускаю? - person Helder Roem; 18.03.2014
comment
@HelderRoem вы правы в том, что ваше приложение должно предоставлять начальное состояние, но оно не является избыточным, потому что с состоянием на клиенте приложение может избежать обращения к серверу каждый раз, когда пользователь возвращается к / blue - person Vinicius Pinto; 07.09.2014
comment
Почему бы просто не использовать путь, например, selectColor(location.pathname), вместо объекта состояния? - person ma11hew28; 17.09.2015
comment
@MattDiPasquale просто для того, чтобы показать, что объект состояния поддерживает сложные объекты, а не только примитивы. - person janfoeh; 17.09.2015
comment
@janfoeh: когда я пробую это в Firefox v42.0, состояние сохраняется, но URL-адрес не обновляется. - person Joshua Frank; 07.12.2015
comment
URL больше не обновляется. Хром 51 на Ubuntu. - person Elijah Lynn; 17.06.2016
comment
@ElijahLynn работает у меня на Chrome 52 / OS X. Вы имеете в виду мою фальшивую строку URL или настоящую? Какие-нибудь подозрительные сообщения об ошибках в консоли разработчика? - person janfoeh; 17.06.2016
comment
Я имею в виду настоящую строку URL. Ошибок в консоли разработчика нет. - person Elijah Lynn; 17.06.2016
comment
@ElijahLynn настоящая строка URL не меняется, потому что jsFiddle изменили свои настройки через некоторое время после того, как я написал пример. Полноэкранное отображение теперь работает в <iframe>, поэтому вы больше не можете видеть URL-адрес дочерних элементов — только URL-адрес встроенных родителей. Вот почему я впоследствии добавил фальшивую строку URL. - person janfoeh; 18.06.2016
comment
Является ли состояние по URL-адресу? Я имею в виду, доступно ли состояние для всех URL-адресов или только для связанного URL-адреса? - person ANewGuyInTown; 06.07.2018
comment
@ANewGuyInTown состояние доступно только для документа, который его создал. Раздел "Примечания" в статье MDN о Window.history может ответить на ваш вопрос. - person janfoeh; 10.07.2018
comment
Я просто хочу сказать, что ваш код не работает, если вы нажмете на цвет, а затем вернетесь, он все еще говорит, что вы выбрали зеленый, а не Вы выбрали не цвет, есть ли у вас какое-либо исправление? - person 0ddlyoko; 16.09.2018
comment
Пожалуйста, наймите MDN. У тебя уже 103 голоса :D - person aderchox; 13.10.2020

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

Представьте себе сетку из 64 блоков в качестве вашего представления, на большом экране блоки составляют 147 ^ 2 за штуку.

URL-адрес представляет собой 64 / идентификатор пользователя и связанные с ним данные пользователя.

Затем веб-приложение может заполнить свою сетку данными о состоянии пользователя.

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

Используя предыдущие состояния истории и связанные с ними 650 000 данных

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

Это круто

person Jason Frazzano    schedule 14.09.2016