Zal*_*oza 33 javascript php ajax jquery progress-bar
我有一个基本页面,顶部有一个导航栏,还有一个包装体.
每当用户点击导航链接时,它就会将.load页面内容加载到包装器div中.
$(this).ajaxStart(function(){$('.progressbar .bar').css('width','5%');$('.progressbar').fadeIn();});
$(this).ajaxEnd(function(){$('progressbar').hide();});
$('.ajaxspl').on('click',function(e){
e.preventDefault();
var url=$(this).data('url'),
wrap=$('body #wrap');
//clean the wrapper
wrap.slideUp().html('');
//load page into wrapper
wrap.load(url,function(){wrap.slideDown();});
});
Run Code Online (Sandbox Code Playgroud)
返回值的示例来自.load:
<div>
...content
</div>
<script>$('.progressbar .bar').css('width','30%');</script>
<link href="/assets/css/datepicker.css" rel="stylesheet" />
<script>$('.progressbar .bar').css('width','60%');</script>
<link href="/assets/css/main.css" rel="stylesheet" />
<script>$('.progressbar .bar').css('width','90%');</script>
<script>//blah blah</script>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我有一个我显示的Bootstrap进度条,在ajaxstart()我调用的页面上,我会在每个项目加载后修改进度条的值.
这在Firefox上运行良好,我可以在等待页面加载时看到进度条,但它在Chrome或IE上不起作用.
有一个更好的方法吗?我这样做是正确的还是有另一种方法可以做到这一点?
例如,获取$.ajax页面大小为kb并在收到数据时动态更新进度条?
我正在尝试在加载Gmail时生成与"加载"页面类似的内容.
Dav*_*der 74
请允许我引用您到这个页面,它描述了如何在jquery中progress event为xhr对象添加一个监听器(它只适用于这些浏览器,在旧版浏览器中,你只需依赖于当前使用的相同基础).
作为参考,我复制了下面的相关代码(您可能只对"下载进度"部分感兴趣):
$.ajax({
xhr: function()
{
var xhr = new window.XMLHttpRequest();
//Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with upload progress
console.log(percentComplete);
}
}, false);
//Download progress
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with download progress
console.log(percentComplete);
}
}, false);
return xhr;
},
type: 'POST',
url: "/",
data: {},
success: function(data){
//Do something success-ish
}
});
Run Code Online (Sandbox Code Playgroud)
请允许我说,虽然对于单页网站来说这是一种过度杀伤,但对大文件才真正有用.此外,图像和类似媒体不会以这种方式处理,您需要监视图像的加载(或通过ajax自己完成)以使这样的系统完美.
这是一个JSFiddle,显示了这个:http://jsfiddle.net/vg389mnv/1/
小智 11
上面的答案是正确的(upvoted).自定义xhr请求运行良好,我用你的代码测试它(以及一个更大的文件来查看实际进度),也可以在这里复制它:
$('.ajaxspl').on('click',function(e){
e.preventDefault();
var url=$(this).data('url'), wrap=$('body #wrap');
//clean the wrapper
wrap.slideUp().html('');
//load page into wrapper
console.log('starting ajax request');
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.addEventListener('progress', function(e) {
if (e.lengthComputable) {
$('.progressbar .bar').css('width', '' + (100 * e.loaded / e.total) + '%');
}
});
return xhr;
},
type: 'POST',
url: url,
data: {},
complete: function(response, status, xhr) {
console.log(response)
wrap.html(response.responseText);
wrap.slideDown();
}
});
});
Run Code Online (Sandbox Code Playgroud)