Saya mencoba sekitar tiga cara berbeda untuk mencegat konstruksi objek Ajax:
- Upaya pertama saya digunakan
xhrFields
, tetapi itu hanya memungkinkan untuk satu pendengar, hanya melampirkan untuk mengunduh (bukan mengunggah) kemajuan, dan memerlukan apa yang tampaknya seperti salin dan tempel yang tidak perlu.
- Upaya kedua saya melampirkan
progress
fungsi ke janji yang dikembalikan, tetapi saya harus mempertahankan susunan penangan saya sendiri. Saya tidak dapat menemukan objek yang baik untuk dilampirkan penangan karena satu tempat saya akan mengakses XHR dan tempat lain saya memiliki akses ke jQuery XHR, tetapi saya tidak pernah memiliki akses ke objek yang ditangguhkan (hanya janjinya).
- Upaya ketiga saya memberi saya akses langsung ke XHR untuk memasang penangan, tetapi sekali lagi memerlukan banyak kode salin dan tempel.
- Saya menyelesaikan upaya ketiga saya dan mengganti jQuery
ajax
dengan milik saya. Satu-satunya kekurangan potensial adalah Anda tidak dapat lagi menggunakan xhr()
pengaturan Anda sendiri . Anda dapat mengizinkannya dengan memeriksa apakah options.xhr
suatu fungsi.
Saya sebenarnya memanggil promise.progress
fungsi saya xhrProgress
sehingga saya dapat menemukannya dengan mudah nanti. Anda mungkin ingin menamainya dengan nama lain untuk memisahkan upload dan download listener Anda. Saya harap ini membantu seseorang meskipun poster aslinya sudah mendapatkan apa yang dia butuhkan.
(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 );