jQuery, un gran marco de JavaScript para la manipulación DOM y que realizan llamadas ajax, ofrece dos grandes ganchos para determinar cuándo las llamadas ajax están en curso:
$.ajaxStart()
y $.ajaxStop()
Ambos ganchos tener una función de controlador se llamará cuando esté a punto de comenzar una llamada ajax, y cuando hayan cesado todas las llamadas ajax, respectivamente. Estas funciones se pueden vincular a cualquier elemento en la página. Puede establecer un valor booleano global en su manejador $.ajaxStart()
en true y establecerlo de nuevo en false en su controlador $.ajaxStop()
.
A continuación, puede comprobar que la bandera booleana y determinar si las llamadas ajax están en curso.
Algo a lo largo de estas líneas:
$(document).ajaxStart(function() {
window.ajaxBusy = true;
});
$(document).ajaxStop(function() {
window.ajaxBusy = false;
});
En cuanto a la determinación de cuando el navegador carga la página actual, se puede comprobar document.readyState
. Devuelve una cadena de "loading"
mientras se carga el documento y una cadena de "complete"
una vez que se ha cargado. Puede vincular un controlador al document.onreadystatechange
y establecer un booleano global que indicará si el documento aún se está cargando o no.
Algo como esto:
document.onreadystatechange = function() {
switch (document.readyState) {
case "loading":
window.documentLoading = true;
break;
case "complete":
window.documentLoading = false;
break;
default:
window.documentLoading = false;
}
}
EDIT:
Parece que $.ajaxStart()
y $.ajaxStop()
no trabajo para las llamadas ajax invocados sin jQuery. Todos los objetos XMLhttprequest tienen un evento llamado readystatechange
al que puede adjuntar un controlador. Puede utilizar esta funcionalidad para determinar si se realiza o no esa llamada individual. Puede insertar todas las referencias a llamadas pendientes en una matriz, y en un setInterval()
verificar la longitud de la matriz. Si es> 1, hay llamadas ajax abiertas. Es un enfoque rudo y solo una forma de resolverlo. Probablemente haya otras formas de hacer esto. Pero aquí está el enfoque general:
// declare array to hold references to outstanding requets
window.orequets = [];
var req = XMLHttpRequest();
// open the request and send it here....
// then attach a handler to `onreadystatechange`
req.onreadystatechange = function() {
if (req.readyState != 4 || req.readyState != 3) {
// req is still in progress
orequests.push(req);
window.reqPos = orequests.length -1
} else {
window.orequests = orequests.slice(reqPos, reqPos + 1);
}
}
hacer lo anterior para cada XMLHttpRequest()
va a enviar, por supuesto, cambiar el nombre de solicitud para cada uno. A continuación, ejecute un setInterval()
que se ejecuta cada x cantidad de milisegundos y comprueba la propiedad de longitud de orequests
. Si es igual a cero, no hay solicitudes, si es mayor que cero, las solicitudes siguen ocurriendo.Si no hay solicitudes, puede borrar el intervalo a través del clearInterval()
o seguir ejecutándolo.
Su setInterval podría ser algo como esto:
var ajaxInterval = setInterval(function() {
if (orequests.length > 0) {
// ajax calls are in progress
window.xttpBusy = true;
} else {
// ajax calls have ceased
window.xttpBusy = false;
// you could call clearInterval(ajaxInterval) here but I don't know if that's your intention
},
3000 // run every 3 seconds. (You can decide how often you want to run it)
});
¡Pensé en comentar y decir que 3 años después, todavía estamos usando este enfoque básico y funciona de maravilla! – Joel
¡Esto es realmente asombroso! ¡Gracias! Realmente útil para algunas pruebas/raspado automáticos de sitios web. – Evers