我一直在忙着一些AJAX代码。我想计算已加载了多少数据,我想用百分比显示它。
我所有预加载的信息都在“反馈”中。 我可以计算它包含多少DATA(以字节为单位),还可以查看进度吗?就像装载时一样:10kb,20kb,30kb等
我的代码:
function calc(page)
{
$('#pageLoad h2').animate({ marginTop : '0px'}, 200);
$.ajax(
{
url: './pages/page.php',
type: 'POST',
data: 'page='+page,
success: function( feedback )
{
$('#content').html( feedback );
}
});
};
抱歉我的英语很差。
答案 0 :(得分:7)
是可能的。 XHR有一个progress
event。唯一的问题是访问XHR对象 - 遗憾的是beforeSend
只接收jqXHR
对象而不是底层的XHR对象。它也不能作为包装器的属性访问。但是,您可以通过向$.ajax()
添加以下选项来挂钩XHR对象的创建过程:
xhr: function () {
var xhr = $.ajaxSettings.xhr(); // call the original function
xhr.addEventListener('progress', function (e) {
if (e.lengthComputable) {
var percentComplete = e.loaded / e.total;
// Do something with download progress
}
}, false);
return xhr;
}
这是我最初的解决方案。很难与jQuery结合使用,因为你不能轻易地挂钩到onreadystatechange处理程序,并且在设置之后无法安全地替换它:
您需要添加自定义 onreadystatechange
处理程序。当XHR对象的readyState
变为2
(* HEADERS_RECEIVED *)时,您可以访问Content-Length
标头以获取总大小,然后等待{{1}触发事件}( LOADING )。
然后您可以通过查看 xhr.readyState == 3
来计算进度
但是,这只会发射一次。所以你需要启动一个计时器(使用xhr.responseText.length
),它将检查就绪状态和响应大小,例如每100毫秒。请求完成后,您可以使用setInterval()
再次停止间隔。