HTML5 History API - Каков максимальный размер объекта состояния? - PullRequest
13 голосов
/ 24 июня 2011

Метод pushState принимает объект состояния. Документы Firefox говорят, что максимальный размер этого объекта составляет 640 КБ. Определено ли в спецификации, какой наименьший максимальный размер может реализовать браузер? Могу ли я ожидать, что основные браузеры предоставят мне по крайней мере 100 КБ?

РЕДАКТИРОВАТЬ: я протестировал его с Chrome, и он все еще работал для объектов состояния более 1 МБ.

Ответы [ 4 ]

11 голосов
/ 06 марта 2014

Спецификация не устанавливает ограничения, однако различные браузеры имеют свои собственные ограничения.

Firefox хорошо документирован и, как вы сказали, это 640 КБ ("столько оперативной памяти, сколько кому-либо когда-либо понадобится").

Я не смог найти Chrome или Internet Explorer в списке, но некоторые быстрые тесты показывают:

Chrome, работающий по крайней мере до 10 МБ (и, возможно, далее),

IE достигает предела в 1 МБ (в IE11, что все, что мне удобно).

Итак, подведем итог для людей будущего: ограничение размера объекта history.state равно: 640kB для Firefox, 1MB для Internet Explorer 11 и минимум 10Mb для Chrome.

РЕДАКТИРОВАТЬ: протестированные версии: IE: 11, Chrome: 33, Firefox: не имеет значения, поскольку они документируют максимумРазмер на MDN для вас:).

7 голосов
/ 24 июня 2011

Нет. Нормативный документ здесь - http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#dom-history-pushstate, и в нем даже не упоминается ограничение размера данных. Однако предлагается другой предел:

Пользовательские агенты могут ограничивать количество объекты состояния, добавленные в сеанс истории на страницу.

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

0 голосов
/ 27 июля 2018

Кропотливо, у меня есть страница, которая превышает ограничение на количество символов в IE11.Я сделал операцию с подстрокой, чтобы получить точное количество символов, так как я нигде не мог его найти.Ответ в том, что (по крайней мере, в IE11) 524282 символа разрешено передавать в pushState / replaceState.
Я обработал это с помощью следующего кода:

function pushState(data, title, url) {
  if (data.length > 524282) {
      //can't push the data to the History API--pass null
      history.pushState(null, title, url);
      history.replaceState(null, title, url);
  }
  else {
    history.pushState(data, title, url);
    history.replaceState(data, title, url);
  }
    document.title = title;
}

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

function beforeNavigate(){
    if ($("#container").html().length <= 524282) {
        //save current state to history before navigating via ajax
        history.replaceState($("#container").html(), document.title, window.location.pathname);
    }
}

Обрабатывайте нажатие кнопок «назад» и «вперед», прослушивая popstate.Если мы передали значение NULL для данных, то e.state вернет значение NULL, и нам нужно загрузить сохраненный URL через запрос AJAX.

0 голосов
/ 03 апреля 2013

только посмотрите, что MDN сообщает, что FireFox устанавливает ограничение размера до 640 КБ, не знаю других браузеров. https://developer.mozilla.org/en-US/docs/DOM/Manipulating_the_browser_history

...