2013-03-10 74 views
28

我有一個基本頁面,頂部有一個導航欄和一個包裝體。在單頁面網站中使用jquery ajax加載頁面時顯示progressbar

只要用戶點擊導航鏈接,它就會使用.load將頁面內容加載到包裝div中。從.load返回值的

$(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();}); 
}); 

例子:

<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> 

正如你所看到的,我有一個引導進度條,我表現出對ajaxstart(),而我所說的頁面上我修改的那個值每個項目後的進度條被加載。

這很適用於Firefox,我可以在等待頁面加載時看到進度條,但它在Chrome或IE上不起作用。

有沒有更好的方法來做到這一點?我是否正確地做了這件事,還是有另一種方法來做到這一點?

例如,獲取$.ajax頁面大小(KB),並隨着數據的接收即時更新進度條?

我試圖在加載Gmail時生成類似於加載頁面的內容。

+1

這是有用的,如果你可以創建一個HTTP://的jsfiddle .net – Amir 2013-03-11 04:50:08

+0

你的jQuery版本是什麼? AJAX事件應該只附加到jquery 1.9的文檔中。 – 2013-03-15 20:05:52

+0

yp im使用1.9 – Zalaboza 2013-03-15 21:27:09

回答

68

請允許我向您推薦this page,它desribes如何添加一個progress event監聽到XHR對象(僅適用於these browsers,在舊的瀏覽器,你只需依靠您正在使用相同的基礎上)在jQuery的。

僅供參考我抄在下面的相關代碼(你只感興趣可能是「下載進度」部分):

$.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/

+2

我發現[這個庫](https://github.com/rstacruz/nprogress)對我的需求非常有用。這很棒。 – 2015-10-30 15:27:10

+0

@RNKushwaha老實說,不要在這種情況下得出結論;-)如果你無法得到工作答案,請求求助。我真誠地以爲這個答案已經過時,因此幾乎最終將其刪除。噢,好吧,以前我非常苛刻的評論道歉,很高興你的項目能夠正常工作:)。 – 2015-10-30 19:05:54

+0

請注意,它只是與'asynch:true'一起工作 – kastelli 2015-11-07 12:25:40

10

以上回答是正確的(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(); 
     } 
    }); 

});