33

我有一个基本页面,顶部有一个导航栏,还有一个包装体。

每当用户单击导航链接时,它都会将.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();});
});

来自的返回值示例.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>

如您所见,我有一个显示在的 Bootstrap 进度条,ajaxstart()在我调用的页面上,我会在加载每个项目后修改进度条的值。

这在 Firefox 上运行良好,我可以在等待页面加载时看到进度条,但它不适用于 Chrome 或 IE。

有一个更好的方法吗?我这样做是正确的还是有另一种方法可以做到这一点?

例如,$.ajax以 kb 为单位获取页面大小并在收到数据时即时更新进度条?

我正在尝试在加载 Gmail 时生成类似于加载页面的内容。

4

2 回答 2

75

请允许我向您介绍此页面,它描述了如何在 jqueryprogress 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
  }
});

请允许我说,这对于单页网站来说太过分了,而且只有对大文件才真正有用。此外,图像和类似媒体不是以这种方式处理的,您需要监控图像的加载(或通过 ajax 自己完成)以使这样的系统完美。

这是一个 JSFiddle 展示了这一点:http: //jsfiddle.net/vg389mnv/1/

于 2013-03-14T09:27:20.537 回答
11

上面的答案是正确的(赞成)。自定义 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();
        }
    });

});
于 2013-03-19T11:47:48.197 回答