SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
Développement Web
Chapitre 4 : AJAX
26/12/2023 Prof. Hafida ZROURI 2
Qu’est ce que AJAX ?
♦ Le terme AJAX est apparu pour la première fois le 18 février 2005, dans un article
de James Garret intitulé "Ajax : une nouvelle approche pour les applications
Web".
♦ AJAX est un acronyme d’Asynchronous JavaScript And XML (JavaScript et XML
asynchrone) qui désigne une approche innovante dans la conception de pages
Web dont l’objectif est d’optimiser leur interactivité et leur confort d’utilisation.
♦ AJAX n’est pas une technologie nouvelle, c’est un terme synthétique qui désigne
l’utilisation conjointe dans les pages Web de différentes technologies. Ainsi
AJAX incorpore :
▪ le XHTML et les feuilles de style CSS ;
▪ le JavaScript ;
▪ le Document Object Model (DOM) ;
▪ l’objet XMLHttpRequest ;
▪ le XML et le XSL.
26/12/2023 Prof. Hafida ZROURI 3
Principe d’AJAX
♦ Dans une application Web classique, la plupart des interactions de l’utilisateur comme
le clic sur un lien ou l’envoi d’un formulaire, déclenchent une requête HTTP vers le
serveur Web. Ce dernier, après le traitement éventuel des données, retourne une
nouvelle page HTML ou XHTML au client. Donc chaque manipulation entraîne la
transmission d'une requête et l'affichage d'une nouvelle page et l'utilisateur doit
attendre l'arrivée de la réponse pour effectuer d'autres manipulations.
♦ Avec AJAX, il est possible de ne mettre à jour qu’une partie de la page. Les requêtes
HTTP sont envoyées par une instruction JavaScript en réaction à une action de
l’utilisateur. La réponse HTTP est également récupérée par JavaScript, qui peut dés
lors mettre à jour la page courante, grâce au DOM et aux CSS.
Plusieurs requêtes peuvent ainsi être émises depuis une même page, laquelle se met
à jour partiellement à chaque réponse.
♦ La deuxième caractéristique d’AJAX est que la communication avec le serveur est
asynchrone. La requête est envoyée au serveur sans attendre la réponse, le traitement
à effectuer à la réception de celle-ci étant spécifié auparavant. JavaScript se charge
d’exécuter ce traitement quand la réponse arrive. L’utilisateur peut de la sorte
continuer à interagir avec l’application, sans être bloqué par l’attente de la réponse,
contrairement au Web classique.
26/12/2023 Prof. Hafida ZROURI 4
Comment fonctionne AJAX ?
♦ Le modèle AJAX se décompose comme suit :
▪ La page Web s’affiche dans le navigateur, appelé aussi le client.
▪ La moindre interaction de l’utilisateur, par exemple l’encodage d’un formulaire
ou le clique sur un élément, est prise en charge par la gestion des événements de
JavaScript.
▪ Le code JavaScript de la page initie une requête XMLHttpRequest. Ce dernier va
permettre d'envoyer au serveur des données au format xml ou texte sous la
forme d'une requête HTTP.
▪ Le serveur interprète ces données via un langage serveur (Ex: PHP). Une fois le
traitement fini, le serveur renvoie à l'objet XMLHttpRequest une réponse au
format xml ou texte.
▪ Le fichier réponse est alors pris en charge par le DOM, et toujours par le
JavaScript, pour être traité et affiché de façon dynamique dans la page initiale.
Ce dialogue se fait de façon asynchrone, c'est à dire sans rechargement de la
page html.
26/12/2023 Prof. Hafida ZROURI 5
L'objet XMLHttpRequest
♦ Cet objet permet de faire des requêtes HTTP afin de récupérer des données au format XML
(mais aussi HTML, ou encore texte simple) qui pourront être intégrées à un document.
Cela peut être très utile pour mettre à jour des données sans pour autant recharger la page.
♦ Création d’un objet XMLHttpRequest :
if(window.XMLHttpRequest) var xhr = new XMLHttpRequest();
♦ Propriétés et méthodes de l’objet XMLHttpRequest :
1- Propriétés :
1.1- readyState : permet de connaître l’évolution de la requête. Elle renvoie un entier entre 0
et 4 :
0 → La requête n’est pas initialisée
1 → Début de transfert des données
2 → Les données sont transférées
3 → Les données reçues sont partiellement accessibles
4 → Les données sont complètement accessibles
C’est la valeur 4 qui nous intéresse car, une fois obtenue, les données transférées peuvent
alors être traitées.
26/12/2023 Prof. Hafida ZROURI 6
L'objet XMLHttpRequest
1.2- onreadystatechange : gestionnaire d’événements qui prend en charge les
changements d’état de la requête. Elle permet de positionner une fonction
de rappel, qui est appelée lorsque l’événement readystatechange se produit.
1.3- responseText : réponse du serveur sous forme de chaîne de caractères.
1.4- responseXML : réponse du serveur sous forme d’un document XML.
1.5- status : renvoie le code numérique de la réponse du serveur HTTP. Voici
quelques valeurs pour cette propriété :
200 si la requête a été exécutée avec succès
403 pour un accès interdit
404 pour un fichier non trouvé
500 pour une erreur interne au serveur
26/12/2023 Prof. Hafida ZROURI 7
L'objet XMLHttpRequest
2- Méthodes :
2.1- La méthode open :
▪ Elle initialise la requête selon une série de paramètres fournis en argument.
▪ Syntaxe : open ("méthode","url du fichier", mode)
- "méthode" contient la méthode d'envoi des données : GET pour recevoir un fichier du
serveur (les données à transmettre sont concaténées à l'URL) ou POST pour envoyer
des données vers le serveur via la méthode send. Notons l’emploi de guillemets.
- "url du fichier" est l’adresse absolue ou relative du fichier. Notons l’emploi de
guillemets.
- mode prend la valeur true (valeur par défaut) pour le mode asynchrone qui nous
intéresse dans le cadre de ce cours ou false pour une exécution en mode normal, ou
synchrone.
En mode synchrone, tant que la réponse à la requête n’est pas parvenue, le script se
met en pause et bloque le navigateur. Ce qui n’est jamais très convivial pour
l’utilisateur.
En mode asynchrone, le script poursuit son exécution sans bloquer le processus. Ce
qui permet une navigation plus fluide et plus confortable pour l’utilisateur.
26/12/2023 Prof. Hafida ZROURI 8
L'objet XMLHttpRequest
2.2- La méthode send :
▪ Effectue la requête, avec éventuellement l’envoi de données.
▪ Syntaxe : send (paramètres)
▪ Remarques :
- Si la méthode utilisée est GET le paramètre envoyé est null : send(null)
- Dans le cas de POST, la page peut envoyer des paramètres personnalisées sous
forme d’une chaîne de caractères : send("données")
Les données doivent être sous la forme d’une chaîne de requête, comme :
nom=valeur&autrenom=autrevaleur&…
▪ Exemple :
open("POST", "http://localhost/ajax/test.php", true);
send("param1=x&param2=y");
Il faut également noter que lors de l’envoi de données avec la méthode POST, il
est recommandé de changer l’entête HTTP de la requête à l’aide de la ligne
suivante :
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
26/12/2023 Prof. Hafida ZROURI 9
L'objet XMLHttpRequest
2.3- La méthode getAllResponseHeaders :
▪ Renvoie l’ensemble de l’entête HTTP de la réponse sous la forme d’une chaîne de
caractères.
▪ Syntaxe : getAllResponseHeaders()
▪ Il faut bien distinguer un entête HTTP et un entête de fichier Html. Les balises
comprises dans un entête HTML, soit entre les balises <head> ... </head> envoient des
informations concernant la page HTML, tandis que les entêtes HTTP envoient des
informations relatives au fichier.
▪ L’entête HTTP est un court message que le serveur Web envoie au navigateur juste
avant de lui transmettre le document lui même. Ce message sert par exemple à donner
la taille du document ou à indiquer qu’il a disparu (code 404). Il peut aussi servir à
préciser l’encodage du fichier grâce à la ligne Content-Type.
2.4- La méthode abort :
▪ Annule la requête courante.
▪ Syntaxe : abort()
26/12/2023 Prof. Hafida ZROURI 10
L'objet XMLHttpRequest
2.5- La méthode getResponseHeader :
▪ Renvoie la valeur d’un seul champ de l’entête HTTP sous la forme d’une chaîne de
caractères.
▪ Syntaxe : getResponseHeader("nom du paramètre d’en-tête HTTP")
▪ Exemple : xhr.getResponseHeader("Content-Type") ne retourne que les
renseignements concernant le type de contenu (ContentType).
xhr.getResponseHeader("Last-Modified") retourne la date de la
dernière modification du document.
2.6- La méthode setRequestHeader :
▪ Assigne une valeur à un champ d’entête HTTP qui est envoyée lors de la requête.
▪ Syntaxe : setRequestHeader("nomParamètreDentête","valeurParamètre")
Cette méthode doit être appelée après la méthode open mais avant la méthode send.
▪ Elle est spécialement utilisée lors d’un envoi avec la méthode POST pour spécifier
l’encodage :
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
26/12/2023 Prof. Hafida ZROURI 11
L'objet XMLHttpRequest
♦ Utilisation de l’objet XMLHttpRequest :
L’utilisation de cet objet passe par les étapes suivantes :
1. Instancier l'objet (utilisation de l’opérateur new)
2. Associer une fonction au traitement du résultat de la requête (utilisation du
gestionnaire d’événement onreadystatechange)
3. Initialiser une requête (utilisation de la méthode open)
4. Effectuer la requête (utilisation de la méthode send)
5. Traiter le résultat de la requête qui peut se présenter sous forme :
- Texte (peut aussi être du code HTML)
- XML
Le traitement consiste généralement en une modification de la page Web
courante en utilisant JavaScript, le DOM et le CSS.
26/12/2023 Prof. Hafida ZROURI 12
Lancement d’une requête
♦ Créer un objet XMLHttpRequest :
if(window.XMLHttpRequest) var xhr = new XMLHttpRequest();
♦ Associer une fonction qui traitera la réponse :
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) { /*instructions de traitement de la réponse*/ }
};
Ou : xhr.onreadystatechange = maFonctionAssociee;
function maFonctionAssociee() {
if(xhr.readyState == 4 && xhr.status == 200) { /* instructions de traitement de la réponse*/ }
}
Remarque : La requête peut avoir été effectuée mais sans succès (par exemple avec un code 404
fichier non trouvé). Ainsi, il est prudent de doubler le test readyState== 4 par status==200
qui confirme que la requête a bien été effectuée avec succès.
26/12/2023 Prof. Hafida ZROURI 13
Lancement d’une requête
♦ Effectuer la requête :
Les méthodes utilisées pour toutes les requêtes HTTP sur le serveur sont open qui
configure la requête en spécifiant divers paramètres et send qui effectue réellement la
requête et accède ainsi au serveur :
xhr.open('GET', "http://localhost/ajax/test.txt", true);
xhr.send(null);
Ou en POST :
xhr.open("POST", "http://localhost/ajax/test.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("param1=x&…&paramn=y");
26/12/2023 Prof. Hafida ZROURI 14
Traitement du résultat de la requête
1- Récupérer et traiter du texte :
▪ La propriété responseText de l’objet XMLHttpRequest contient la réponse du serveur
sous forme de chaîne de caractères.
▪ Exemple :
Affichons, de façon asynchrone, une réponse sous forme de texte dans une zone de la
page.
Soit une page HTML. Au clic de l’utilisateur sur le bouton de formulaire, la réponse
est affichée dans l’élément <div id="affichage "> ... </div>.
Le fichier texte comporte les mots : "Ceci est un exemple … ". Il est enregistré sur le
serveur sous le nom de test.txt.
26/12/2023 Prof. Hafida ZROURI 15
Traitement du résultat de la requête
▪ Le code complet :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" >
<title>Ajax</title>
<style type="text/css">
#affichage {
width: 160px;
font-weight: bold;
font-size: 16px;
margin: 5px;
padding: 5px;
background-color: lightblue;
}
</style>
<script type='text/JavaScript'>
function afficher(txtdocument) {
document.getElementById("affichage").innerHTML = txtdocument;
}
26/12/2023 Prof. Hafida ZROURI 16
Traitement du résultat de la requête
function extraire() {
if(window.XMLHttpRequest) var xhr = new XMLHttpRequest();
if(xhr) {
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
afficher(xhr.responseText);
}
};
xhr.open("GET", "test.txt", true);
xhr.send(null);
}
}
</script>
</head>
<body>
<h3>Exemple</h3>
<input type="button" value="Afficher" onclick="extraire()" />
<div id="affichage">La réponse ici !</div>
</body>
</html>
26/12/2023 Prof. Hafida ZROURI 17
Traitement du résultat de la requête
♦ Il ne faut pas s’arrêter à une interprétation limitative de la propriété responseText. En
effet, cela signifie que la réponse est renvoyée sous forme de texte au sens
informatique du terme. Tous les types de format sont acceptés ; des fichiers
XHTML, des données traitées par du PHP en passant par du code JavaScript. Le
tout dépend de l’utilisation ultérieure de ces données textuelles.
♦ Exemple :
Soit un fichier js.txt qui contient le texte :
alert("Message d’alerte provenant du serveur")
Prenons un fichier HTML (exemple.htm). Ce fichier ne contient aucune
instruction alert(). Pourtant une boîte d’alerte peut être créée en exécutant le code
JavaScript à partir de la chaîne de caractères contenue dans le fichier js.txt. Ce qui
est effectué par la méthode eval().
26/12/2023 Prof. Hafida ZROURI 18
Traitement du résultat de la requête
▪ Le code du fichier exemple.htm :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" >
<title>Ajax</title>
<script type='text/JavaScript'>
function extraire() {
if(window.XMLHttpRequest) var xhr = new XMLHttpRequest();
if(xhr) {
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) { eval(xhr.responseText); }
};
xhr.open("GET", "js.txt", true);
xhr.send(null);
}
}
26/12/2023 Prof. Hafida ZROURI 19
Traitement du résultat de la requête
</script>
</head>
<body>
<h3>Exemple</h3>
<input type="button" value="Afficher" onclick="extraire()" />
</body>
</html>
26/12/2023 Prof. Hafida ZROURI 20
Traitement du résultat de la requête
2- Récupérer et traiter du XML :
▪ La propriété responseXML de l’objet XMLHttpRequest contient la réponse du
serveur sous forme d’un document XML.
▪ Exemple :
Soit le fichier XML annuaire.xml présenté ci-dessous.
On souhaite, au clic d’un bouton, extraire les données des balises <nom>,
<prenom> et <telephone> de la troisième balise <personne>.
Le fichier HTML de départ comporte simplement un bouton de formulaire et une
balise <div id="affichage"> servant de conteneur pour la réponse.
26/12/2023 Prof. Hafida ZROURI 21
Traitement du résultat de la requête
▪ Le fichier annuaire.xml :
<?xml version="1.0"?>
<annuaire>
<personne>
<nom> Zrouri </nom>
<prenom> Hafida </prenom>
<telephone type="portable"> 0684566695 </telephone>
</personne>
<personne>
<nom> Boularcha </nom>
<prenom> Malika </prenom>
<telephone type="fixe"> 0512345678 </telephone>
</personne>
<personne>
<nom> Azais </nom>
<prenom> Mohamed </prenom>
<telephone type="portable"> 0687654321 </telephone>
</personne>
</annuaire>
26/12/2023 Prof. Hafida ZROURI 22
Traitement du résultat de la requête
▪ Le code du fichier html :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax</title>
<script type='text/JavaScript'>
function afficher(xmldocument) {
let noeudsNom = xmldocument.getElementsByTagName("nom");
let noeudsPrenom = xmldocument.getElementsByTagName("prenom");
let noeudsTelephone = xmldocument.getElementsByTagName("telephone");
let textediv = (noeudsNom[2].firstChild.nodeValue + " "
+ noeudsPrenom[2].firstChild.nodeValue + "<br />"
+ noeudsTelephone[2].firstChild.nodeValue);
let x = document.getElementById("affichage");
x.innerHTML = textediv;
}
26/12/2023 Prof. Hafida ZROURI 23
Traitement du résultat de la requête
function extraire() {
if(window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); }
if(xhr) {
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) { afficher(xhr.responseXML); }
};
xhr.open("GET", "annuaire.xml", true);
xhr.send(null);
}
}
</script>
</head>
<body>
<h3>Annuaire</h3>
<input type="button" value="Afficher la personne" onclick="extraire()" />
<div id="affichage">La réponse ici !</div>
</body>
</html>
26/12/2023 Prof. Hafida ZROURI 24
Traitement du résultat de la requête
♦ Traitement des attributs :
▪ Un document XML peut également comporter des attributs de balises. Ceux-ci
contiennent souvent des informations d’un intérêt non négligeable. Ainsi, il importe
de pouvoir également y accéder.
▪ Exemple :
Soit le fichier XML annuaire.xml (de l’exemple précédent) qui comporte des
attributs.
On souhaite, au clic d’un bouton, afficher les personnes ayant des numéros de
téléphone fixe ou portable selon le choix de l’utilisateur.
Le fichier HTML de départ comporte deux boutons radios permettant de choisir le
type de téléphone et une balise <div id="affichage"> servant de conteneur pour la
réponse.
26/12/2023 Prof. Hafida ZROURI 25
Traitement du résultat de la requête
▪ Le code du fichier html :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax</title>
<script type='text/JavaScript'>
function afficher(xmldocument) {
let div = document.getElementById("affichage");
div.innerHTML = "";
let entree = document.forms[0].entree.value;
let noeudsNom = xmldocument.getElementsByTagName("nom");
let noeudsPrenom = xmldocument.getElementsByTagName("prenom");
let noeudsTelephone = xmldocument.getElementsByTagName("telephone");
for (let i=0; i<noeudsTelephone.length; i++) {
let typeTelephone = noeudsTelephone[i].getAttribute("type");
if(typeTelephone==entree) {
div.innerHTML += noeudsNom[i].firstChild.nodeValue + " " +
noeudsPrenom[i].firstChild.nodeValue + " " +
noeudsTelephone[i].firstChild.nodeValue + "<br />";
} } }
26/12/2023 Prof. Hafida ZROURI 26
Traitement du résultat de la requête
function extraire() {
if(window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); }
if(xhr) {
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
afficher(xhr.responseXML);
}
};
xhr.open("GET", "annuaire.xml", true);
xhr.send(null);
}
}
</script>
</head>
26/12/2023 Prof. Hafida ZROURI 27
Traitement du résultat de la requête
<body>
<h3>Annuaire</h3>
<form action="">
<fieldset>
<legend>Type de téléphone : </legend>
<input type="radio" name="entree" value="fixe"/>Fixe
<input type="radio" name="entree" value="portable" />Portable
<input type="button" value="Afficher les personnes" onclick="extraire()" />
</fieldset>
</form>
<div id="affichage">La réponse ici !</div>
</body>
</html>
26/12/2023 Prof. Hafida ZROURI 28
Complément
26/12/2023 Prof. Hafida ZROURI 29
Traitement du résultat de la requête
♦ Récupérer et traiter avec XSL :
▪ La démarche se réalise toujours en trois étapes :
- Le chargement depuis le serveur du fichier XML ;
- Le chargement depuis le serveur du fichier XSL ;
- Le traitement pour associer le fichier XSL au fichier XML.
Avec les navigateurs (Edge, Firefox, Opera, Safari, chrome), JavaScript peut
exécuter des transformations XSLT à travers l’objet XSLTProcessor. Une fois
l’objet XSLTProcessor créé, il faut utiliser la méthode importStylesheet(xsl) pour
réaliser la transformation. La feuille de style xsl doit être chargée dans le document
par l’objet XMLHttpRequest avant d’appeler la méthode importStylesheet.
▪ Exemple :
Soit le fichier XML annuaire.xml (de l’exemple précédent) et le fichier de feuille
de style XSL annuaire1.xsl (vu dans le chapitre 3).
On souhaite, au clic d’un bouton, afficher toutes les personnes de annuaire.xml
dans un tableau construit dans annuaire1.xsl.
26/12/2023 Prof. Hafida ZROURI 30
Traitement du résultat de la requête
▪ Le fichier annuaire1.xsl :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title>Annuaire</title></head>
<body>
<table border="1">
<caption>Listes des personnes</caption>
<tr><th>Nom</th><th>Prénom</th><th>Téléphone</th></tr>
<xsl:for-each select="annuaire/personne">
<tr>
<td><xsl:value-of select="nom" /></td>
<td><xsl:value-of select="prenom" /></td>
<td><xsl:value-of select="telephone" /></td>
</tr>
</xsl:for-each>
</table></body></html>
</xsl:template>
</xsl:stylesheet>
Remarque : Il n’y a pas de liaison entre le fichier XML et
le fichier XSL c.à.d le fichier XML ne contient pas
l’instruction :
<?xml-stylesheet type="text/xsl" href="annuaire1.xsl"?>
26/12/2023 Prof. Hafida ZROURI 31
Traitement du résultat de la requête
▪ Le code du fichier html :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax</title>
<style type="text/css">
#affichage { background-color: lightblue; padding: 10px; }
</style>
<script type='text/JavaScript'>
function chargerXML(url) {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
if (xhr.readyState == 4 && xhr.status == 200) { return (xhr.responseXML); }
}
}
26/12/2023 Prof. Hafida ZROURI 32
Traitement du résultat de la requête
function transformer(xml, xsl, id) {
if (window.XSLTProcessor) {
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
var fragment = xsltProcessor.transformToFragment(xml, document);
var target = document.getElementById(id);
target.innerHTML = "";
target.appendChild(fragment);
document.appendChild(target);
}
}
var xml = chargerXML('annuaire.xml');
var xsl = chargerXML('annuaire1.xsl');
</script>
</head>
Pour que la transformation soit effective,
XSLTProcessor doit exécuter la méthode
transformToFragment qui retourne un
fragment de document pouvant être
facilement ajouté à un document XML
existant. Cette méthode possède deux
paramètres :
- le document XML à transformer ,
- l’objet document qui accueille le
fragment généré.
26/12/2023 Prof. Hafida ZROURI 33
Traitement du résultat de la requête
<body>
<h3>Annuaire</h3>
<div id="affichage">
<form action="">
<input type="button" value="Afficher les personnes"
onclick="transformer(xml, xsl, 'affichage')" />
</form>
</div>
</body>
</html>
26/12/2023 Prof. Hafida ZROURI 34
Traitement du résultat de la requête
♦ Application dynamique de XSL à XML :
▪ Il est possible de changer dynamiquement la feuille de style d’un document
XML pour la remplacer par une autre.
▪ Exemple :
Soit notre fichier XML annuaire.xml, utilisé auparavant dans ce chapitre.
Le fichier de style annuaire1.xsl lui est associé dans un premier temps.
Après une action de l’utilisateur, le script transforme le fichier XML de
départ avec une nouvelle feuille de style (annuaire2.xsl).
Cette feuille de style (annuaire2.xsl), tirée du chapitre 3, permet de trier la
liste des personnes par ordre alphabétique.
26/12/2023 Prof. Hafida ZROURI 35
Traitement du résultat de la requête
▪ Le fichier annuaire2.xsl :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title>Annuaire</title></head>
<body>
<table border="1">
<caption>Listes des personnes</caption>
<tr><th>Nom</th><th>Prénom</th><th>Téléphone</th></tr>
<xsl:for-each select="annuaire/personne">
<xsl:sort select="nom" order="ascending"/>
<tr>
<td><xsl:value-of select="nom" /></td>
<td><xsl:value-of select="prenom" /></td>
<td><xsl:value-of select="telephone" /></td>
</tr>
</xsl:for-each>
</table></body></html>
</xsl:template>
</xsl:stylesheet>
26/12/2023 Prof. Hafida ZROURI 36
Traitement du résultat de la requête
▪ Le code du fichier html :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax</title>
<style type="text/css">
#affichage { background-color: lightblue; padding: 10px; margin-bottom:5px }
</style>
<script type='text/JavaScript'>
function init(url1, url2, id) {
var xml = chargerXML(url1);
var xsl = chargerXML(url2);
transformer(xml, xsl, id);
}
26/12/2023 Prof. Hafida ZROURI 37
Traitement du résultat de la requête
function chargerXML(url) {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
if (xhr.readyState == 4 && xhr.status == 200) { return (xhr.responseXML); }
}
}
function transformer(xml, xsl, id) {
if (window.XSLTProcessor) {
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
var fragment = xsltProcessor.transformToFragment(xml, document);
var target = document.getElementById(id);
target.innerHTML = "";
target.appendChild(fragment);
document.appendChild(target);
}
}
</script>
26/12/2023 Prof. Hafida ZROURI 38
Traitement du résultat de la requête
</head>
<body onload="init('annuaire.xml', 'annuaire1.xsl', 'affichage')">
<div id="affichage"></div>
<form action="" style="padding-left: 60px;">
<input type="button" value="Trier par nom"
onclick="init('annuaire.xml', 'annuaire2.xsl', 'affichage')" />
</form>
</body>
</html>

Contenu connexe

Similaire à ajqxè_àànndkllllllllllllllllllllllllllllllllllllllllll

Similaire à ajqxè_àànndkllllllllllllllllllllllllllllllllllllllllll (20)

Services rest & jersey
Services rest & jerseyServices rest & jersey
Services rest & jersey
 
Java EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdfJava EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdf
 
Ajax GTI780 & MTI780 ETS A09
Ajax  GTI780 & MTI780  ETS  A09Ajax  GTI780 & MTI780  ETS  A09
Ajax GTI780 & MTI780 ETS A09
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 
Ajax - GTI780 & MTI780 - ETS - A08
Ajax - GTI780 & MTI780 - ETS - A08Ajax - GTI780 & MTI780 - ETS - A08
Ajax - GTI780 & MTI780 - ETS - A08
 
Introduction to prograaming using ajax PHP JS
Introduction to prograaming using ajax PHP JSIntroduction to prograaming using ajax PHP JS
Introduction to prograaming using ajax PHP JS
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
cours j2ee -présentation
cours  j2ee -présentationcours  j2ee -présentation
cours j2ee -présentation
 
Advanced html5
Advanced html5Advanced html5
Advanced html5
 
Cours 8 squid.pdf
Cours 8 squid.pdfCours 8 squid.pdf
Cours 8 squid.pdf
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open door
 
Serveurs
ServeursServeurs
Serveurs
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)
 
Controller_Rest.pptx
Controller_Rest.pptxController_Rest.pptx
Controller_Rest.pptx
 
Tutoriel ajax jquery
Tutoriel ajax jqueryTutoriel ajax jquery
Tutoriel ajax jquery
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 

Dernier

GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...Institut de l'Elevage - Idele
 
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfSophie569778
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesInstitut de l'Elevage - Idele
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestionyakinekaidouchi1
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusInstitut de l'Elevage - Idele
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...Institut de l'Elevage - Idele
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...Institut de l'Elevage - Idele
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfInstitut de l'Elevage - Idele
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Ville de Châteauguay
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...Institut de l'Elevage - Idele
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfInstitut de l'Elevage - Idele
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de planchermansouriahlam
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfmia884611
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageInstitut de l'Elevage - Idele
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...Institut de l'Elevage - Idele
 
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...Institut de l'Elevage - Idele
 
DISPOSITIFS-MEDICAUX-PPT.pdf............
DISPOSITIFS-MEDICAUX-PPT.pdf............DISPOSITIFS-MEDICAUX-PPT.pdf............
DISPOSITIFS-MEDICAUX-PPT.pdf............cheddadzaineb
 
Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)Sana REFAI
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéInstitut de l'Elevage - Idele
 

Dernier (20)

GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
 
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentes
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestion
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdf
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de plancher
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdf
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
 
JTC 2024 Bâtiment et Photovoltaïque.pdf
JTC 2024  Bâtiment et Photovoltaïque.pdfJTC 2024  Bâtiment et Photovoltaïque.pdf
JTC 2024 Bâtiment et Photovoltaïque.pdf
 
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
 
DISPOSITIFS-MEDICAUX-PPT.pdf............
DISPOSITIFS-MEDICAUX-PPT.pdf............DISPOSITIFS-MEDICAUX-PPT.pdf............
DISPOSITIFS-MEDICAUX-PPT.pdf............
 
Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversité
 

ajqxè_àànndkllllllllllllllllllllllllllllllllllllllllll

  • 2. 26/12/2023 Prof. Hafida ZROURI 2 Qu’est ce que AJAX ? ♦ Le terme AJAX est apparu pour la première fois le 18 février 2005, dans un article de James Garret intitulé "Ajax : une nouvelle approche pour les applications Web". ♦ AJAX est un acronyme d’Asynchronous JavaScript And XML (JavaScript et XML asynchrone) qui désigne une approche innovante dans la conception de pages Web dont l’objectif est d’optimiser leur interactivité et leur confort d’utilisation. ♦ AJAX n’est pas une technologie nouvelle, c’est un terme synthétique qui désigne l’utilisation conjointe dans les pages Web de différentes technologies. Ainsi AJAX incorpore : ▪ le XHTML et les feuilles de style CSS ; ▪ le JavaScript ; ▪ le Document Object Model (DOM) ; ▪ l’objet XMLHttpRequest ; ▪ le XML et le XSL.
  • 3. 26/12/2023 Prof. Hafida ZROURI 3 Principe d’AJAX ♦ Dans une application Web classique, la plupart des interactions de l’utilisateur comme le clic sur un lien ou l’envoi d’un formulaire, déclenchent une requête HTTP vers le serveur Web. Ce dernier, après le traitement éventuel des données, retourne une nouvelle page HTML ou XHTML au client. Donc chaque manipulation entraîne la transmission d'une requête et l'affichage d'une nouvelle page et l'utilisateur doit attendre l'arrivée de la réponse pour effectuer d'autres manipulations. ♦ Avec AJAX, il est possible de ne mettre à jour qu’une partie de la page. Les requêtes HTTP sont envoyées par une instruction JavaScript en réaction à une action de l’utilisateur. La réponse HTTP est également récupérée par JavaScript, qui peut dés lors mettre à jour la page courante, grâce au DOM et aux CSS. Plusieurs requêtes peuvent ainsi être émises depuis une même page, laquelle se met à jour partiellement à chaque réponse. ♦ La deuxième caractéristique d’AJAX est que la communication avec le serveur est asynchrone. La requête est envoyée au serveur sans attendre la réponse, le traitement à effectuer à la réception de celle-ci étant spécifié auparavant. JavaScript se charge d’exécuter ce traitement quand la réponse arrive. L’utilisateur peut de la sorte continuer à interagir avec l’application, sans être bloqué par l’attente de la réponse, contrairement au Web classique.
  • 4. 26/12/2023 Prof. Hafida ZROURI 4 Comment fonctionne AJAX ? ♦ Le modèle AJAX se décompose comme suit : ▪ La page Web s’affiche dans le navigateur, appelé aussi le client. ▪ La moindre interaction de l’utilisateur, par exemple l’encodage d’un formulaire ou le clique sur un élément, est prise en charge par la gestion des événements de JavaScript. ▪ Le code JavaScript de la page initie une requête XMLHttpRequest. Ce dernier va permettre d'envoyer au serveur des données au format xml ou texte sous la forme d'une requête HTTP. ▪ Le serveur interprète ces données via un langage serveur (Ex: PHP). Une fois le traitement fini, le serveur renvoie à l'objet XMLHttpRequest une réponse au format xml ou texte. ▪ Le fichier réponse est alors pris en charge par le DOM, et toujours par le JavaScript, pour être traité et affiché de façon dynamique dans la page initiale. Ce dialogue se fait de façon asynchrone, c'est à dire sans rechargement de la page html.
  • 5. 26/12/2023 Prof. Hafida ZROURI 5 L'objet XMLHttpRequest ♦ Cet objet permet de faire des requêtes HTTP afin de récupérer des données au format XML (mais aussi HTML, ou encore texte simple) qui pourront être intégrées à un document. Cela peut être très utile pour mettre à jour des données sans pour autant recharger la page. ♦ Création d’un objet XMLHttpRequest : if(window.XMLHttpRequest) var xhr = new XMLHttpRequest(); ♦ Propriétés et méthodes de l’objet XMLHttpRequest : 1- Propriétés : 1.1- readyState : permet de connaître l’évolution de la requête. Elle renvoie un entier entre 0 et 4 : 0 → La requête n’est pas initialisée 1 → Début de transfert des données 2 → Les données sont transférées 3 → Les données reçues sont partiellement accessibles 4 → Les données sont complètement accessibles C’est la valeur 4 qui nous intéresse car, une fois obtenue, les données transférées peuvent alors être traitées.
  • 6. 26/12/2023 Prof. Hafida ZROURI 6 L'objet XMLHttpRequest 1.2- onreadystatechange : gestionnaire d’événements qui prend en charge les changements d’état de la requête. Elle permet de positionner une fonction de rappel, qui est appelée lorsque l’événement readystatechange se produit. 1.3- responseText : réponse du serveur sous forme de chaîne de caractères. 1.4- responseXML : réponse du serveur sous forme d’un document XML. 1.5- status : renvoie le code numérique de la réponse du serveur HTTP. Voici quelques valeurs pour cette propriété : 200 si la requête a été exécutée avec succès 403 pour un accès interdit 404 pour un fichier non trouvé 500 pour une erreur interne au serveur
  • 7. 26/12/2023 Prof. Hafida ZROURI 7 L'objet XMLHttpRequest 2- Méthodes : 2.1- La méthode open : ▪ Elle initialise la requête selon une série de paramètres fournis en argument. ▪ Syntaxe : open ("méthode","url du fichier", mode) - "méthode" contient la méthode d'envoi des données : GET pour recevoir un fichier du serveur (les données à transmettre sont concaténées à l'URL) ou POST pour envoyer des données vers le serveur via la méthode send. Notons l’emploi de guillemets. - "url du fichier" est l’adresse absolue ou relative du fichier. Notons l’emploi de guillemets. - mode prend la valeur true (valeur par défaut) pour le mode asynchrone qui nous intéresse dans le cadre de ce cours ou false pour une exécution en mode normal, ou synchrone. En mode synchrone, tant que la réponse à la requête n’est pas parvenue, le script se met en pause et bloque le navigateur. Ce qui n’est jamais très convivial pour l’utilisateur. En mode asynchrone, le script poursuit son exécution sans bloquer le processus. Ce qui permet une navigation plus fluide et plus confortable pour l’utilisateur.
  • 8. 26/12/2023 Prof. Hafida ZROURI 8 L'objet XMLHttpRequest 2.2- La méthode send : ▪ Effectue la requête, avec éventuellement l’envoi de données. ▪ Syntaxe : send (paramètres) ▪ Remarques : - Si la méthode utilisée est GET le paramètre envoyé est null : send(null) - Dans le cas de POST, la page peut envoyer des paramètres personnalisées sous forme d’une chaîne de caractères : send("données") Les données doivent être sous la forme d’une chaîne de requête, comme : nom=valeur&autrenom=autrevaleur&… ▪ Exemple : open("POST", "http://localhost/ajax/test.php", true); send("param1=x&param2=y"); Il faut également noter que lors de l’envoi de données avec la méthode POST, il est recommandé de changer l’entête HTTP de la requête à l’aide de la ligne suivante : setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  • 9. 26/12/2023 Prof. Hafida ZROURI 9 L'objet XMLHttpRequest 2.3- La méthode getAllResponseHeaders : ▪ Renvoie l’ensemble de l’entête HTTP de la réponse sous la forme d’une chaîne de caractères. ▪ Syntaxe : getAllResponseHeaders() ▪ Il faut bien distinguer un entête HTTP et un entête de fichier Html. Les balises comprises dans un entête HTML, soit entre les balises <head> ... </head> envoient des informations concernant la page HTML, tandis que les entêtes HTTP envoient des informations relatives au fichier. ▪ L’entête HTTP est un court message que le serveur Web envoie au navigateur juste avant de lui transmettre le document lui même. Ce message sert par exemple à donner la taille du document ou à indiquer qu’il a disparu (code 404). Il peut aussi servir à préciser l’encodage du fichier grâce à la ligne Content-Type. 2.4- La méthode abort : ▪ Annule la requête courante. ▪ Syntaxe : abort()
  • 10. 26/12/2023 Prof. Hafida ZROURI 10 L'objet XMLHttpRequest 2.5- La méthode getResponseHeader : ▪ Renvoie la valeur d’un seul champ de l’entête HTTP sous la forme d’une chaîne de caractères. ▪ Syntaxe : getResponseHeader("nom du paramètre d’en-tête HTTP") ▪ Exemple : xhr.getResponseHeader("Content-Type") ne retourne que les renseignements concernant le type de contenu (ContentType). xhr.getResponseHeader("Last-Modified") retourne la date de la dernière modification du document. 2.6- La méthode setRequestHeader : ▪ Assigne une valeur à un champ d’entête HTTP qui est envoyée lors de la requête. ▪ Syntaxe : setRequestHeader("nomParamètreDentête","valeurParamètre") Cette méthode doit être appelée après la méthode open mais avant la méthode send. ▪ Elle est spécialement utilisée lors d’un envoi avec la méthode POST pour spécifier l’encodage : xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  • 11. 26/12/2023 Prof. Hafida ZROURI 11 L'objet XMLHttpRequest ♦ Utilisation de l’objet XMLHttpRequest : L’utilisation de cet objet passe par les étapes suivantes : 1. Instancier l'objet (utilisation de l’opérateur new) 2. Associer une fonction au traitement du résultat de la requête (utilisation du gestionnaire d’événement onreadystatechange) 3. Initialiser une requête (utilisation de la méthode open) 4. Effectuer la requête (utilisation de la méthode send) 5. Traiter le résultat de la requête qui peut se présenter sous forme : - Texte (peut aussi être du code HTML) - XML Le traitement consiste généralement en une modification de la page Web courante en utilisant JavaScript, le DOM et le CSS.
  • 12. 26/12/2023 Prof. Hafida ZROURI 12 Lancement d’une requête ♦ Créer un objet XMLHttpRequest : if(window.XMLHttpRequest) var xhr = new XMLHttpRequest(); ♦ Associer une fonction qui traitera la réponse : xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { /*instructions de traitement de la réponse*/ } }; Ou : xhr.onreadystatechange = maFonctionAssociee; function maFonctionAssociee() { if(xhr.readyState == 4 && xhr.status == 200) { /* instructions de traitement de la réponse*/ } } Remarque : La requête peut avoir été effectuée mais sans succès (par exemple avec un code 404 fichier non trouvé). Ainsi, il est prudent de doubler le test readyState== 4 par status==200 qui confirme que la requête a bien été effectuée avec succès.
  • 13. 26/12/2023 Prof. Hafida ZROURI 13 Lancement d’une requête ♦ Effectuer la requête : Les méthodes utilisées pour toutes les requêtes HTTP sur le serveur sont open qui configure la requête en spécifiant divers paramètres et send qui effectue réellement la requête et accède ainsi au serveur : xhr.open('GET', "http://localhost/ajax/test.txt", true); xhr.send(null); Ou en POST : xhr.open("POST", "http://localhost/ajax/test.php", true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("param1=x&…&paramn=y");
  • 14. 26/12/2023 Prof. Hafida ZROURI 14 Traitement du résultat de la requête 1- Récupérer et traiter du texte : ▪ La propriété responseText de l’objet XMLHttpRequest contient la réponse du serveur sous forme de chaîne de caractères. ▪ Exemple : Affichons, de façon asynchrone, une réponse sous forme de texte dans une zone de la page. Soit une page HTML. Au clic de l’utilisateur sur le bouton de formulaire, la réponse est affichée dans l’élément <div id="affichage "> ... </div>. Le fichier texte comporte les mots : "Ceci est un exemple … ". Il est enregistré sur le serveur sous le nom de test.txt.
  • 15. 26/12/2023 Prof. Hafida ZROURI 15 Traitement du résultat de la requête ▪ Le code complet : <!DOCTYPE html> <html> <head> <meta charset="UTF-8" > <title>Ajax</title> <style type="text/css"> #affichage { width: 160px; font-weight: bold; font-size: 16px; margin: 5px; padding: 5px; background-color: lightblue; } </style> <script type='text/JavaScript'> function afficher(txtdocument) { document.getElementById("affichage").innerHTML = txtdocument; }
  • 16. 26/12/2023 Prof. Hafida ZROURI 16 Traitement du résultat de la requête function extraire() { if(window.XMLHttpRequest) var xhr = new XMLHttpRequest(); if(xhr) { xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { afficher(xhr.responseText); } }; xhr.open("GET", "test.txt", true); xhr.send(null); } } </script> </head> <body> <h3>Exemple</h3> <input type="button" value="Afficher" onclick="extraire()" /> <div id="affichage">La réponse ici !</div> </body> </html>
  • 17. 26/12/2023 Prof. Hafida ZROURI 17 Traitement du résultat de la requête ♦ Il ne faut pas s’arrêter à une interprétation limitative de la propriété responseText. En effet, cela signifie que la réponse est renvoyée sous forme de texte au sens informatique du terme. Tous les types de format sont acceptés ; des fichiers XHTML, des données traitées par du PHP en passant par du code JavaScript. Le tout dépend de l’utilisation ultérieure de ces données textuelles. ♦ Exemple : Soit un fichier js.txt qui contient le texte : alert("Message d’alerte provenant du serveur") Prenons un fichier HTML (exemple.htm). Ce fichier ne contient aucune instruction alert(). Pourtant une boîte d’alerte peut être créée en exécutant le code JavaScript à partir de la chaîne de caractères contenue dans le fichier js.txt. Ce qui est effectué par la méthode eval().
  • 18. 26/12/2023 Prof. Hafida ZROURI 18 Traitement du résultat de la requête ▪ Le code du fichier exemple.htm : <!DOCTYPE html> <html> <head> <meta charset="UTF-8" > <title>Ajax</title> <script type='text/JavaScript'> function extraire() { if(window.XMLHttpRequest) var xhr = new XMLHttpRequest(); if(xhr) { xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { eval(xhr.responseText); } }; xhr.open("GET", "js.txt", true); xhr.send(null); } }
  • 19. 26/12/2023 Prof. Hafida ZROURI 19 Traitement du résultat de la requête </script> </head> <body> <h3>Exemple</h3> <input type="button" value="Afficher" onclick="extraire()" /> </body> </html>
  • 20. 26/12/2023 Prof. Hafida ZROURI 20 Traitement du résultat de la requête 2- Récupérer et traiter du XML : ▪ La propriété responseXML de l’objet XMLHttpRequest contient la réponse du serveur sous forme d’un document XML. ▪ Exemple : Soit le fichier XML annuaire.xml présenté ci-dessous. On souhaite, au clic d’un bouton, extraire les données des balises <nom>, <prenom> et <telephone> de la troisième balise <personne>. Le fichier HTML de départ comporte simplement un bouton de formulaire et une balise <div id="affichage"> servant de conteneur pour la réponse.
  • 21. 26/12/2023 Prof. Hafida ZROURI 21 Traitement du résultat de la requête ▪ Le fichier annuaire.xml : <?xml version="1.0"?> <annuaire> <personne> <nom> Zrouri </nom> <prenom> Hafida </prenom> <telephone type="portable"> 0684566695 </telephone> </personne> <personne> <nom> Boularcha </nom> <prenom> Malika </prenom> <telephone type="fixe"> 0512345678 </telephone> </personne> <personne> <nom> Azais </nom> <prenom> Mohamed </prenom> <telephone type="portable"> 0687654321 </telephone> </personne> </annuaire>
  • 22. 26/12/2023 Prof. Hafida ZROURI 22 Traitement du résultat de la requête ▪ Le code du fichier html : <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ajax</title> <script type='text/JavaScript'> function afficher(xmldocument) { let noeudsNom = xmldocument.getElementsByTagName("nom"); let noeudsPrenom = xmldocument.getElementsByTagName("prenom"); let noeudsTelephone = xmldocument.getElementsByTagName("telephone"); let textediv = (noeudsNom[2].firstChild.nodeValue + " " + noeudsPrenom[2].firstChild.nodeValue + "<br />" + noeudsTelephone[2].firstChild.nodeValue); let x = document.getElementById("affichage"); x.innerHTML = textediv; }
  • 23. 26/12/2023 Prof. Hafida ZROURI 23 Traitement du résultat de la requête function extraire() { if(window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } if(xhr) { xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { afficher(xhr.responseXML); } }; xhr.open("GET", "annuaire.xml", true); xhr.send(null); } } </script> </head> <body> <h3>Annuaire</h3> <input type="button" value="Afficher la personne" onclick="extraire()" /> <div id="affichage">La réponse ici !</div> </body> </html>
  • 24. 26/12/2023 Prof. Hafida ZROURI 24 Traitement du résultat de la requête ♦ Traitement des attributs : ▪ Un document XML peut également comporter des attributs de balises. Ceux-ci contiennent souvent des informations d’un intérêt non négligeable. Ainsi, il importe de pouvoir également y accéder. ▪ Exemple : Soit le fichier XML annuaire.xml (de l’exemple précédent) qui comporte des attributs. On souhaite, au clic d’un bouton, afficher les personnes ayant des numéros de téléphone fixe ou portable selon le choix de l’utilisateur. Le fichier HTML de départ comporte deux boutons radios permettant de choisir le type de téléphone et une balise <div id="affichage"> servant de conteneur pour la réponse.
  • 25. 26/12/2023 Prof. Hafida ZROURI 25 Traitement du résultat de la requête ▪ Le code du fichier html : <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ajax</title> <script type='text/JavaScript'> function afficher(xmldocument) { let div = document.getElementById("affichage"); div.innerHTML = ""; let entree = document.forms[0].entree.value; let noeudsNom = xmldocument.getElementsByTagName("nom"); let noeudsPrenom = xmldocument.getElementsByTagName("prenom"); let noeudsTelephone = xmldocument.getElementsByTagName("telephone"); for (let i=0; i<noeudsTelephone.length; i++) { let typeTelephone = noeudsTelephone[i].getAttribute("type"); if(typeTelephone==entree) { div.innerHTML += noeudsNom[i].firstChild.nodeValue + " " + noeudsPrenom[i].firstChild.nodeValue + " " + noeudsTelephone[i].firstChild.nodeValue + "<br />"; } } }
  • 26. 26/12/2023 Prof. Hafida ZROURI 26 Traitement du résultat de la requête function extraire() { if(window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } if(xhr) { xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { afficher(xhr.responseXML); } }; xhr.open("GET", "annuaire.xml", true); xhr.send(null); } } </script> </head>
  • 27. 26/12/2023 Prof. Hafida ZROURI 27 Traitement du résultat de la requête <body> <h3>Annuaire</h3> <form action=""> <fieldset> <legend>Type de téléphone : </legend> <input type="radio" name="entree" value="fixe"/>Fixe <input type="radio" name="entree" value="portable" />Portable <input type="button" value="Afficher les personnes" onclick="extraire()" /> </fieldset> </form> <div id="affichage">La réponse ici !</div> </body> </html>
  • 28. 26/12/2023 Prof. Hafida ZROURI 28 Complément
  • 29. 26/12/2023 Prof. Hafida ZROURI 29 Traitement du résultat de la requête ♦ Récupérer et traiter avec XSL : ▪ La démarche se réalise toujours en trois étapes : - Le chargement depuis le serveur du fichier XML ; - Le chargement depuis le serveur du fichier XSL ; - Le traitement pour associer le fichier XSL au fichier XML. Avec les navigateurs (Edge, Firefox, Opera, Safari, chrome), JavaScript peut exécuter des transformations XSLT à travers l’objet XSLTProcessor. Une fois l’objet XSLTProcessor créé, il faut utiliser la méthode importStylesheet(xsl) pour réaliser la transformation. La feuille de style xsl doit être chargée dans le document par l’objet XMLHttpRequest avant d’appeler la méthode importStylesheet. ▪ Exemple : Soit le fichier XML annuaire.xml (de l’exemple précédent) et le fichier de feuille de style XSL annuaire1.xsl (vu dans le chapitre 3). On souhaite, au clic d’un bouton, afficher toutes les personnes de annuaire.xml dans un tableau construit dans annuaire1.xsl.
  • 30. 26/12/2023 Prof. Hafida ZROURI 30 Traitement du résultat de la requête ▪ Le fichier annuaire1.xsl : <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title>Annuaire</title></head> <body> <table border="1"> <caption>Listes des personnes</caption> <tr><th>Nom</th><th>Prénom</th><th>Téléphone</th></tr> <xsl:for-each select="annuaire/personne"> <tr> <td><xsl:value-of select="nom" /></td> <td><xsl:value-of select="prenom" /></td> <td><xsl:value-of select="telephone" /></td> </tr> </xsl:for-each> </table></body></html> </xsl:template> </xsl:stylesheet> Remarque : Il n’y a pas de liaison entre le fichier XML et le fichier XSL c.à.d le fichier XML ne contient pas l’instruction : <?xml-stylesheet type="text/xsl" href="annuaire1.xsl"?>
  • 31. 26/12/2023 Prof. Hafida ZROURI 31 Traitement du résultat de la requête ▪ Le code du fichier html : <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ajax</title> <style type="text/css"> #affichage { background-color: lightblue; padding: 10px; } </style> <script type='text/JavaScript'> function chargerXML(url) { if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); if (xhr.readyState == 4 && xhr.status == 200) { return (xhr.responseXML); } } }
  • 32. 26/12/2023 Prof. Hafida ZROURI 32 Traitement du résultat de la requête function transformer(xml, xsl, id) { if (window.XSLTProcessor) { var xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); var fragment = xsltProcessor.transformToFragment(xml, document); var target = document.getElementById(id); target.innerHTML = ""; target.appendChild(fragment); document.appendChild(target); } } var xml = chargerXML('annuaire.xml'); var xsl = chargerXML('annuaire1.xsl'); </script> </head> Pour que la transformation soit effective, XSLTProcessor doit exécuter la méthode transformToFragment qui retourne un fragment de document pouvant être facilement ajouté à un document XML existant. Cette méthode possède deux paramètres : - le document XML à transformer , - l’objet document qui accueille le fragment généré.
  • 33. 26/12/2023 Prof. Hafida ZROURI 33 Traitement du résultat de la requête <body> <h3>Annuaire</h3> <div id="affichage"> <form action=""> <input type="button" value="Afficher les personnes" onclick="transformer(xml, xsl, 'affichage')" /> </form> </div> </body> </html>
  • 34. 26/12/2023 Prof. Hafida ZROURI 34 Traitement du résultat de la requête ♦ Application dynamique de XSL à XML : ▪ Il est possible de changer dynamiquement la feuille de style d’un document XML pour la remplacer par une autre. ▪ Exemple : Soit notre fichier XML annuaire.xml, utilisé auparavant dans ce chapitre. Le fichier de style annuaire1.xsl lui est associé dans un premier temps. Après une action de l’utilisateur, le script transforme le fichier XML de départ avec une nouvelle feuille de style (annuaire2.xsl). Cette feuille de style (annuaire2.xsl), tirée du chapitre 3, permet de trier la liste des personnes par ordre alphabétique.
  • 35. 26/12/2023 Prof. Hafida ZROURI 35 Traitement du résultat de la requête ▪ Le fichier annuaire2.xsl : <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title>Annuaire</title></head> <body> <table border="1"> <caption>Listes des personnes</caption> <tr><th>Nom</th><th>Prénom</th><th>Téléphone</th></tr> <xsl:for-each select="annuaire/personne"> <xsl:sort select="nom" order="ascending"/> <tr> <td><xsl:value-of select="nom" /></td> <td><xsl:value-of select="prenom" /></td> <td><xsl:value-of select="telephone" /></td> </tr> </xsl:for-each> </table></body></html> </xsl:template> </xsl:stylesheet>
  • 36. 26/12/2023 Prof. Hafida ZROURI 36 Traitement du résultat de la requête ▪ Le code du fichier html : <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ajax</title> <style type="text/css"> #affichage { background-color: lightblue; padding: 10px; margin-bottom:5px } </style> <script type='text/JavaScript'> function init(url1, url2, id) { var xml = chargerXML(url1); var xsl = chargerXML(url2); transformer(xml, xsl, id); }
  • 37. 26/12/2023 Prof. Hafida ZROURI 37 Traitement du résultat de la requête function chargerXML(url) { if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); if (xhr.readyState == 4 && xhr.status == 200) { return (xhr.responseXML); } } } function transformer(xml, xsl, id) { if (window.XSLTProcessor) { var xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); var fragment = xsltProcessor.transformToFragment(xml, document); var target = document.getElementById(id); target.innerHTML = ""; target.appendChild(fragment); document.appendChild(target); } } </script>
  • 38. 26/12/2023 Prof. Hafida ZROURI 38 Traitement du résultat de la requête </head> <body onload="init('annuaire.xml', 'annuaire1.xsl', 'affichage')"> <div id="affichage"></div> <form action="" style="padding-left: 60px;"> <input type="button" value="Trier par nom" onclick="init('annuaire.xml', 'annuaire2.xsl', 'affichage')" /> </form> </body> </html>