- Documentation
- >
- Module
- >
- Ajax
Module Ajax
Ce module est dédié au chargement de données par requête HTTP asynchrone.
Il est basé sur l'API XMLHttpRequest,
en facilite l'usage en exploitant les Promise et
prépare la transition de l'API XMLHttpRequest
vers l'API Fetch.
Il peut être utilisé indépendamment de Dynamique mais est aussi prévu pour s'y intégrer en tant que module.
Le module Ajax permet:
-
La création, l'envoi de données par requête HTTP: Ajax (méthode), send, buildData;
-
La gestion de liste d'attente des requêtes: queue, createQueue, addResponseToQueue, removeResponseFromQueue, verifQueue, sortQueue;
-
La création de requête d'après un modèle: model, createModel, deleteModel;
-
La gestion particulière des méthodes HTTP: method, getMethod, addMethod.
Le module supporte un ensemble d'événements permettant de suivre l'évolution d'une requête, de traiter les erreurs éventuelles et d'analyser les résultats.
Principe de fonctionnement et terminologie
Le module permet l'envoi de requête HTTP à un serveur afin d'en obtenir un résultat.
On définit comme étant une réponse un objet créé lors de l'appel de la méthode send
et symbolisant une requête envoyée et dont le résultat est en attente.
Le statut d'une réponse précise alors quel est l'état de celle-ci dans son processus d'envoi.
On entend par une requête, un objet contenant toutes les propriétés indiquant de quelle manière une réponse doit être obtenue: son protocole, son URL... Une requête ne représente donc pas une "vraie requête HTTP" au sens réseau mais son objet contenant ses propriétés.
Une requête est soit issue d'un modèle, créé via la méthode
createModel, soit être issu d'un objet créé spontanément.
Le premier cas est utilisé afin de générer plusieurs réponses à partir d'une seule requête
et le second afin de charger une ressource ponctuellement.
L'utilisation de modèles permet d'éviter les redondances dans la création d'une requête dont seuls les arguments sont amenés à changer.
Ainsi, afin d'exploiter plusieurs fois une ressource avec des arguments différents, on pourra procéder tel que:
// Création du modèle "example"
Ajax.createModel("example", {
method : "POST", // Méthode à utiliser
async : true, // La valeur pas défaut est déjà à true
url : "test.php" // Ressource cible
});
// Envoi de la requête en utilisant le modèle et certains arguments
Ajax("example", ["arguments"]);
// Envoi de la requête en utilisant le même modèle mais d'autres arguments
Ajax.send("example", ["autres arguments"]);
On remarque que l'utilisation de modèle évite toute redondance et améliore ainsi la maintenance du code. Pour le chargement ponctuel d'une ressource, on préférera alors:
Ajax({
method : "POST", // Méthode à utiliser
async : true, // La valeur pas défaut est déjà à true
url : "image.png" // Ressource cible
});
La création du modèle se fait par l'utilisation de la méthode createModel. Un modèle est défini à partir d'un objet et/ou d'autres modèles.
Il est ainsi possible de combiner les modèles entre eux lors de leur création. Il n'y a pour autant pas de dépendance réelle entre les objets, la suppression d'un modèle utilisé précédemment
pour la création d'un nouveau modèle n'entrainera pas la suppression des deux modèles.
La création d'un modèle à partir d'un autre modèle implique aussi la copie des événements éventuels.
Le code ci-dessous crée deux modèles dont certaines propriétés étant commune, peuvent être partagées:
// Création du modèle "post"
Ajax.createModel("post", {
method : "POST", // Méthode à utiliser
async : true, // La valeur pas défaut est déjà à true
url : "test.php" // Ressource cible
});
// Création du modèle "get"
Ajax.createModel("get", "post", {
method : "GET"
});
// le modèle "get" aura les propriétés "async" et "url" issues du modèle post
L'ordre des arguments a son importance lors de l'utilisation de createModel.
Les propriétés des arguments premiers seront toujours réécrites par les propriétés des arguments suivants.
Etat d'une réponse
Une réponse est un objet possédant un ensemble de propriétés informant de l'état de chargement de la ressource demandée. Au cours de son processus d'envoi, une réponse passe par différents états en fonction du paramétrage appliqué à la requête qui l'a générée. La liste de ces états est:
-
create: la requête a été créée mais pas encore envoyée; -
init: la requête a été initialisée pour envoi. À cet état, la promesse liée à la réponse a été créée et les propriétésresolveetrejectsont disponible dans la réponse; -
queue: la requête est en attente dans une liste. Uniquement si la propriétéqueueest une chaine de caractère. -
prepare: la requête est en préparation d'envoi et les arguments doivent être préparés; -
send: la requête a été envoyée; -
receive: la requête a été envoyée; -
load: la réception des données est terminée; -
prepareData: les données reçues sont en cours de traitement avant exploitation; -
history: la réponse est en cours d'ajout à l'historique du navigateur. Uniquement sihistoryvauttrue; -
complete: la réponse est finie et les réponses prêtes à être exploitées.
A chaque état peut-être attaché un événement. Bien que ces événements soit attachés à la requête créatrice, ils sont pour autant appliqués sur les réponses générées. Consulté la section Evénements supportés pour plus de détails.
Evénements supportés
Le module propose un ensemble d'événements afin de suivre l'évolution d'une réponse, de traiter les erreurs éventuelles et d'analyser les résultats.
Ces événements sont assignables à une requête en utilisant les mêmes procédés que ceux décris par la gestion d'événements sur des objets
du module Event.
Les événements supportés sont:
- success:
- error:
- statechange:
- create:
- init:
- queue:
- prepare:
- send:
- receive:
- load:
- prepareData:
- history:
- complete:
- maxResponse:
- alreadySending:
- opened:
- headersReceived:
- loading:
- done:
- progress:
- prepareArg:
- statusUnknow:
- statusInformational:
- statusSuccess:
- statusRedirectionError:
- statusNetworkError:
- statusServerError:
- modified:
- checkData:
- queueAdd:
- queueRemove:
- queueMove:
Code d'erreur supportés
- AlreadySending: une réponse est déjà en traitement/envoie pour une requête.
- QueueNotFound: la liste auquelle la requête doit être ajoutée n'a pas été trouvée.
- NoURLSupply: aucune URL n'a été donnée.
- XHRNotSupported: les requêtes XHR ne sont pas supportés.
- XHRError: une erreur liée à la requête est survenue.
- XHRTimeout: le temps maximal d'envoi d'une requête est atteint.
- XHRUncomplete: la requête a été annulée ou a subie une erreur rendant sa réponse inexploitable.
- QueueError: la requête n'a pas pu être supprimée de la queue auquelle elle appartient.
- MethodNotSupported: la méthode HTTP fournie n'est pas supportée.
- JSONParseError: une erreur dans le parsage de la réponse est survenue.
- JSONEvalError: une erreur est survenue lors de l'éxécution de la réponse.
- JSONScriptError: une erreur est survenue dans l'éxécution par balise de la réponse.
- StyleLoadError: une erreur est survenue lors de l'interprétation de la réponse sous forme de style CSS.
- QueueAbort: la réponse à été annulée alors qu'elle était dans une liste.
Propriétés d'une requête
-
.methodFacultatif: méthode HTTP à utiliser. Valeur par défautGET. -
.asyncFacultatif: indique si la requête doit être envoyée de manière synchrone (false) ou asynchrone (true). Valeur par défauttrue. -
.url: URL de la cible de la requête. -
.userFacultatif: nom d'utilisateur à utiliser lorsqu'une authentification sur le serveur est nécessaire pour accéder à la ressource. Valeur par défautundefined. -
.passwordFacultatif: mot de passe à utiliser lorsqu'une authentification sur le serveur est nécessaire pour accéder à la ressource. Valeur par défautundefined. -
.headerFacultatif: objet contenant tous les en-têtes de la requête. Valeur par défautundefined. -
.encodeou Facultatif: détermine si les arguments doivent être encodés avant l'envoi de la requête (true). Si une fonction est fournie, elle sera utilisée afin d'encoder les arguments. Elle prend alors comme seul argument les arguments associés à la requête et doit retourner une chaine de caractère représentant les arguments encodés. Si un booléentrueest fourni, la fonction d'encodageencodeURIComponentsera utilisée. Valeur par défauttrue. -
.noCacheFacultatif: indique si la page doit être chargée sans tenir compte du cache. Dans le cas où cette option est activée, un argument supplémentaire est associé à la requête sous la formedateEnMs=0. Valeur par défautfalse. -
.useParseou Facultatif: défini si la réponse de la requête doit être parsé (true) ou non (false). Uniquement valable lorsqueContentType == "application/json". Si une fonction est fournie, elle sera appellée afin de parser le résultat de la requête. Valeur par défauttrue. -
.useEvalou Facultatif: défini si la réponse de la requête doit être évaluée (true) ou non (false). Uniquement valable lorsqueContentType == "application/javascript". Si une fonction est fournie, elle sera appellée afin d'évaluer le résultat de la requête. Valeur par défauttrue. -
.useScriptFacultatif: défini si la réponse de la requête doit être stocké dans une balise script. Uniquement valable lorsqueContentType == "application/javascript"et.useEval = false. Valeur par défautfalse. -
.useStyleFacultatif: défini si la réponse de la requête doit être stocké dans une balise. Uniquement valable lorsqueContentType == "text/css". Valeur par défauttrue. -
.useFragmentFacultatif: défini si la réponse de la requête doit être évaluée dans un fragment de document, uniquement lorsqueContentType == "text/html". Uniquement valable lorsqueContentType == "text/html". Valeur par défauttrue. -
.useDynamiqueFacultatif: défini si les éléments DOM créés doivent être stockés dans un tableauDynamique. Uniquement valable lorsque.useFragment = trueet queDynamiqueest utilisé. Valeur par défauttrue. -
.multipleFacultatif: indique si il est possible d'envoyer une requête alors qu'une autre est déjà en cours de traitement Valeur par défauttrue. -
.withCredentialsFacultatif: Indique si l'envoie des cookies est autorisés lorsque une requête est faite en crossdomain. Valeur par défauttrue. -
.multipartFacultatif: -
.formatFacultatif: indique le format de la réponse. Si il est spécifié, il remplacera la valeur de l'en-têteContent-Typerenvoyé par le serveur. Le format doit être un MIME valide. -
.historyFacultatif: indique si la réponse de la requête doit être enregistrée dans l'historique du navigateur client. Valeur par défautfalse. -
.historyURLFacultatif: indique l'URL à associer avec l'ajout de la requête à l'historique client, lorsque.history = true. Valeur par défaut"". -
.maxResponseFacultatif: indique le nombre maximale de réponse qui peuvent être stockées dans l'historique d'un modèle. Si la valeur vaut-1, aucune réponse ne sera stockée. Cette option est à privilégier si la sauvegarde du résultat d'une réponse est inutile pour la suite du programme. Valeur par défaut-1. -
.queueou Facultatif: nom d'une liste d'attente dans laquelle la réponse doit passer avant son envoi. Valeur par défautfalse. -
.priorityFacultatif: défini la priorité d'une réponse dans une liste d'attente. Plus elle est proche de 0, plus la requête est prioritaire Valeur par défaut0. -
.timeoutou Facultatif: temps maximum en millisecondes que peut prendre une réponse avant d'être terminée. Une erreurXHRTimeoutsera générée si le délai expire. Valeur par défautfalse.
Propriétés d'une réponse
-
.id: identifiant unique de la réponse issu de l'incrémentation deAjax.id. -
.arg: arguments finaux envoyés avec la réponse. -
.state[0-10]: état numérique de la réponse. -
.stateText: état textuel de la réponse. Voir la propriétéstateListpour voir la liste compléte des chaines possibles.
Propriétés d'une liste
Accessibilité
Lorsque le module Ajax est utilisé sans Dynamique, il s'initialise directement sur l'objet window.
Il est alors accessible tel que:
Ajax.send(...);
// ===
window.Ajax.send(...);
Lorsque Ajax est utilisé avec Dynamique, il s'initialise en tant que module de ce dernier.
Il est alors accessible tel que:
Dynamique.module.Ajax
Compatibilité
Le module Ajax a été réalisé sous le standard EcmaScript 6.
Dépendances
Le module Ajax utilise l'API XMLHttpRequest,
l'API Promises et la gestion d'événements sur des objets
du module Event.