pushState
方法接受一个状态对象。 Firefox 文档称该对象的最大大小为 640kb。规范中是否定义了浏览器可以实现的最小最大尺寸是多少?我可以合理地期望主要浏览器为我提供至少 100kb 的空间吗?
编辑:我用 Chrome 对其进行了测试,它仍然适用于超过 1MB 的状态对象。
规范没有规定限制,但是各种浏览器确实有自己的限制。
Firefox 有详细的文档记录,正如您所说,它有 640kB(“任何人都需要的 RAM”)。
我找不到任何地方列出的 Chrome 或 Internet Explorer,但一些快速测试显示:
Chrome 工作空间至少可达 10MB(甚至可能更多),
IE 达到了 1MB 的限制(在 IE11 中,这是我手头上的全部)。
所以,为未来的人们总结一下: History.state 对象大小限制为: Firefox 为
640kB
,Internet Explorer 11 为 1MB
,Chrome 至少为 10Mb
。编辑:测试版本:IE:11、Chrome:33、Firefox:无关,因为它们在 MDN 上为您记录了最大大小:)。
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;
}
在通过 ajax 请求加载新内容之前,我调用 beforeNavigate 来保存用户所做的任何当前位置信息或状态更改。
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 值给 data,那么 e.state 将返回 null,我们需要通过 ajax 请求加载存储的 url。
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);
}
});
}
});