jQuery, un framework javascript pour la manipulation DOM et effectuant des appels ajax, fournit deux grands crochets pour déterminer quand les appels ajax sont en cours:
$.ajaxStart()
et $.ajaxStop()
Ces deux crochets prendre une fonction de gestionnaire cela sera appelé quand un appel ajax est sur le point de démarrer, et quand tous les appels ajax auront cessé, respectivement. Ces fonctions peuvent être liées à n'importe quel élément de la page. Vous pouvez définir une valeur booléenne globale dans votre gestionnaire $.ajaxStart()
sur true et la définir sur false dans votre gestionnaire $.ajaxStop()
.
Vous pouvez ensuite vérifier ce drapeau booléen et déterminer si des appels ajax sont en cours.
Quelque chose le long de ces lignes:
$(document).ajaxStart(function() {
window.ajaxBusy = true;
});
$(document).ajaxStop(function() {
window.ajaxBusy = false;
});
En ce qui concerne la détermination lorsque le navigateur charge la page en cours, vous pouvez vérifier document.readyState
. Il renvoie une chaîne de "loading"
pendant le chargement du document et une chaîne de "complete"
une fois qu'il a été chargé. Vous pouvez lier un gestionnaire à document.onreadystatechange
et définir un booléen global qui indiquera si le document est toujours en cours de chargement ou non.
Quelque chose comme ceci:
document.onreadystatechange = function() {
switch (document.readyState) {
case "loading":
window.documentLoading = true;
break;
case "complete":
window.documentLoading = false;
break;
default:
window.documentLoading = false;
}
}
EDIT:
Il semble que $.ajaxStart()
et $.ajaxStop()
ne fonctionnent pas pour les appels ajax appelés sans jQuery. Tous les objets XMLhttprequest ont un événement appelé readystatechange
auquel vous pouvez attacher un gestionnaire. Vous pouvez utiliser cette fonctionnalité pour déterminer si cet appel individuel est effectué ou non. Vous pouvez placer toutes les références aux appels en attente sur un tableau et, dans un setInterval()
, vérifier la longueur de ce tableau. Si c'est> 1, il y a des appels ajax debout. C'est une approche approximative, et seulement une façon d'y arriver. Il y a probablement d'autres façons de le faire. Mais voici l'approche générale:
// 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);
}
}
Est-ce que ci-dessus pour chaque XMLHttpRequest()
vous enverrez, bien sûr changer le nom de la demande de chacun. Ensuite, exécutez un setInterval()
qui s'exécute toutes les x millisecondes et vérifie la propriété length de orequests
. Si elle est égale à zéro, aucune demande n'est en cours, si elle est supérieure à zéro, les demandes sont toujours en cours.Si aucune demande ne se produit, vous pouvez effacer l'intervalle par clearInterval()
ou le laisser en cours d'exécution.
Votre setInterval pourrait ressembler à ceci:
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)
});
Je pensais commenter et dire que 3 ans plus tard, nous utilisons toujours cette approche de base et cela fonctionne très bien! – Joel
C'est vraiment génial! Merci! Vraiment utile pour certains tests/grattage automatiques de sites Web. – Evers