问题描述
|
pushState
方法接受状态对象。 Firefox文档说该对象的最大大小为640kb。规范中定义了浏览器可以实现的最小最大大小是多少?我是否可以合理地期望主流浏览器至少为我提供100kb?
编辑:我用Chrome进行了测试,它仍可用于1MB以上的状态对象。
解决方法
否。此处的规范性文件为http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#dom-history-pushstate,甚至没有提及限制数据大小。但是,建议使用其他限制:
用户代理可能会限制
状态对象添加到会话中
每页的历史记录。
在该示例中可以看到,该规范通常避免提及任何硬性限制,而是由浏览器制造商自行决定。因此,即使规范在将来的某个时刻进行了修订,以考虑数据大小限制的可能性,也不太可能为您提供真实的数字。取而代之的是,它“对于普通用例来说足够大”。
, 规范没有设置限制,但是各种浏览器都有其自身的限制。
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的最大大小:)。
, 仅看到MDN告知FireFox施加了640K的大小限制,不知道其他浏览器。
https://developer.mozilla.org/zh-CN/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,url);
history.replaceState(null,url);
}
else {
history.pushState(data,url);
history.replaceState(data,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值,则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);
}
});
}
});