En javascript simple es muy simple: solo necesita adjuntar la devolución de llamada a {XMLHTTPRequest}.onprogress
var xhr = new XMLHttpRequest();
xhr.onprogress = function(e){
if (e.lengthComputable)
var percent = (e.loaded / e.total) * 100;
};
xhr.open('GET', 'http://www...', true);
xhr.onreadystatechange = function() {
...
};
xhr.send(null);
pero estoy haciendo un sitio ajax que descarga datos html con JQuery ( $.get()
o $.ajax()
) y me preguntaba cuál es la mejor manera de obtener el progreso de una solicitud para mostrarla con una pequeña barra de progreso, pero curiosamente, no estoy encontrar algo útil en la documentación de JQuery ...
javascript
ajax
jquery
xmlhttprequest
guari
fuente
fuente
jqXHR
objeto (la envoltura del objeto devuelto por xhr$.ajax()
) y encontré unprogress
atributo en ella (junto conabort
,complete
,success
, etc.), pero en los documentos de JQuery, falta esto: api.jquery.com/jQuery.ajax/#jqXHRRespuestas:
Algo como esto para
$.ajax
(aunque solo HTML5):fuente
jQuery ya ha implementado promesas, por lo que es mejor usar esta tecnología y no mover la lógica de eventos al
options
parámetro. Hice un complemento jQuery que agrega una promesa de progreso y ahora es fácil de usar al igual que otras promesas:Compruébalo en github
fuente
TypeError: $.ajax(...).progress(...).progressUpload is not a function
.... ¿Cuál es el problema?Probé tres formas diferentes de interceptar la construcción del objeto Ajax:
xhrFields
, pero eso solo permite un oyente, solo se adjunta al progreso de la descarga (no de la carga) y requiere lo que parece ser copiar y pegar innecesario.progress
función a la promesa devuelta, pero tuve que mantener mi propia matriz de controladores. No pude encontrar un buen objeto para adjuntar los controladores porque en un lugar accedería al XHR y en otro tendría acceso al jQuery XHR, pero nunca tuve acceso al objeto diferido (solo su promesa).ajax
con el mío. El único defecto potencial es que ya no puede utilizar su propioxhr()
entorno. Puede permitirlo comprobando sioptions.xhr
es una función.De hecho, llamo a mi
promise.progress
funciónxhrProgress
para poder encontrarla fácilmente más tarde. Es posible que desee nombrarlo de otra manera para separar sus oyentes de carga y descarga. Espero que esto ayude a alguien incluso si el póster original ya tiene lo que necesitaba.fuente
$.ajax({ ... }).progress(function(evl) { console.log(evl); });
pero no sucedió nada. ¿Me puedes ayudar? :)jQuery tiene una
AjaxSetup()
función que le permite registrar manejadores ajax globales comobeforeSend
ycomplete
para todas las llamadas ajax, así como también permitirle acceder alxhr
objeto para hacer el progreso que está buscandofuente
.ajaxStart()
,.ajaxStop()
,.ajaxComplete()
,.ajaxError()
,.ajaxSuccess()
,.ajaxSend()
-en lugar dentro de las opciones objeto de$.ajaxSetup()
. < api.jquery.com/jQuery.ajaxSetup/#entry-longdesc >http://www.htmlgoodies.com/beyond/php/show-progress-report-for-long-running-php-scripts.html
Estaba buscando una solución similar y encontré este uso completo.
}
y las salidas de su servidor
fuente
Siga los pasos para mostrar el progreso de la solicitud Ajax:
Para que sea más fácil, le recomiendo que utilice JS Classes para mostrar y ocultar dinámicamente la ruleta para este propósito.
¡Espero que esto ayude!
fuente