HTML5 History API - каков максимальный размер объекта состояния?

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

EDIT: я протестировал его с помощью Chrome, и он все еще работал для объектов состояния более 1 МБ.

4 ответов


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

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

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


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

Firefox хорошо документирован, и, как вы сказали, это 640kB ("столько ОЗУ, сколько кому-либо понадобится").

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

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

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

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

EDIT: проверенные версии: IE: 11, Chrome: 33, Firefox: не имеет значения, поскольку они документируют максимальный размер MDN для вас:).


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


кропотливо, у меня есть страница, которая превышает лимит символов в 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. Если мы передали нулевое значение для данных, то e.состояние вернет null, и нам нужно загрузить сохраненный url-адрес через запрос ajax.

window.addEventListener('popstate', function (e) {
    if (e.state!=null) {
        $("#container").html(e.state);
    }
    else {
        //load the partialpage into the container(a full html page is not returned by the ajax query for my site)
        $.ajax({
            url: location.href,
            type: "GET",
            success: function (data) {
                $('#container').html(data);
            }
         });
    }
});