Ajax nesnesinin yapısını engellemenin üç farklı yolunu denedim:
- İlk denemem kullanıldı
xhrFields
, ancak bu yalnızca bir dinleyiciye izin veriyor, yalnızca indirme (yüklemeye değil) ilerlemesine ekliyor ve gereksiz kopyala-yapıştır gibi görünen şeyleri gerektiriyor.
- İkinci denemem
progress
döndürülen söze bir işlev ekledi, ancak kendi işleyicilerimi korumam gerekiyordu. İşleyicileri eklemek için iyi bir nesne bulamadım çünkü bir yerden XHR'ye erişebilirim ve başka bir yerde jQuery XHR'ye erişebilirdim, ancak ertelenen nesneye hiçbir zaman erişemedim (yalnızca sözünü).
- Üçüncü denemem, işleyicileri eklemek için XHR'ye doğrudan erişim sağladı, ancak yine çok fazla kopyala ve yapıştır kodu gerektirdi.
- Üçüncü denememi tamamladım ve jQuery'leri
ajax
kendi girişimimle değiştirdim . Tek potansiyel eksiklik, artık kendi xhr()
ayarınızı kullanamamanızdır . options.xhr
Bir işlev olup olmadığını kontrol ederek buna izin verebilirsiniz .
Aslında promise.progress
işlevimi çağırıyorum, xhrProgress
böylece daha sonra kolayca bulabilirim. Yükleme ve indirme dinleyicilerinizi ayırmak için başka bir ad vermek isteyebilirsiniz. Umarım bu, orijinal poster ihtiyaç duyduğu şeyi zaten almış olsa bile birisine yardımcı olur.
(function extend_jQuery_ajax_with_progress( window, jQuery, undefined )
{
var $originalAjax = jQuery.ajax;
jQuery.ajax = function( url, options )
{
if( typeof( url ) === 'object' )
{options = url;url = undefined;}
options = options || {};
// Instantiate our own.
var xmlHttpReq = $.ajaxSettings.xhr();
// Make it use our own.
options.xhr = function()
{return( xmlHttpReq );};
var $newDeferred = $.Deferred();
var $oldPromise = $originalAjax( url, options )
.done( function done_wrapper( response, text_status, jqXHR )
{return( $newDeferred.resolveWith( this, arguments ));})
.fail( function fail_wrapper( jqXHR, text_status, error )
{return( $newDeferred.rejectWith( this, arguments ));})
.progress( function progress_wrapper()
{
window.console.warn( "Whoa, jQuery started actually using deferred progress to report Ajax progress!" );
return( $newDeferred.notifyWith( this, arguments ));
});
var $newPromise = $newDeferred.promise();
// Extend our own.
$newPromise.progress = function( handler )
{
xmlHttpReq.addEventListener( 'progress', function download_progress( evt )
{
//window.console.debug( "download_progress", evt );
handler.apply( this, [evt]);
}, false );
xmlHttpReq.upload.addEventListener( 'progress', function upload_progress( evt )
{
//window.console.debug( "upload_progress", evt );
handler.apply( this, [evt]);
}, false );
return( this );
};
return( $newPromise );
};
})( window, jQuery );