Ajax 객체의 구성을 가로채는 세 가지 방법을 시도했습니다.
- 내 첫 번째 시도는를 사용
xhrFields
했지만 한 명의 리스너 만 허용하고 다운로드 (업로드 아님) 진행률에만 첨부하고 불필요한 복사 및 붙여 넣기처럼 보이는 것이 필요합니다.
- 두 번째 시도
progress
는 반환 된 promise에 함수를 추가했지만, 고유 한 핸들러 배열을 유지해야했습니다. 한 곳에서는 XHR에 액세스하고 다른 곳에서는 jQuery XHR에 액세스 할 수 있었지만 지연된 객체에는 액세스 할 수 없었기 때문에 핸들러를 연결할 좋은 객체를 찾을 수 없었습니다 (그 약속 만 해당).
- 세 번째 시도로 핸들러를 첨부하기 위해 XHR에 직접 액세스 할 수 있었지만 코드 복사 및 붙여 넣기가 많이 필요했습니다.
- 세 번째 시도를 마무리하고 jQuery
ajax
를 내 것으로 교체했습니다 . 유일한 잠재적 인 단점은 더 이상 자신의 xhr()
설정을 사용할 수 없다는 것 입니다. options.xhr
함수 인지 확인하여이를 허용 할 수 있습니다 .
나중에 쉽게 찾을 수 있도록 실제로 promise.progress
함수를 호출 xhrProgress
합니다. 업로드 및 다운로드 리스너를 구분하기 위해 다른 이름을 지정할 수 있습니다. 원래 포스터가 이미 필요한 것을 얻었더라도 누군가에게 도움이되기를 바랍니다.
(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 );