Académique Documents
Professionnel Documents
Culture Documents
2012/2013
INTRODUCTION
Ajax:
1. 2. 3.
Communication asynchrone avec le serveur Rcupration de donnes (texte ou XML) partir du serveur Mise jours de la prsentation Web
1 et 2 XMLHttpRequest 3 DOM
INTRODUCTION
XMLHttpRequest
XMLHttpRequest est un objet ActiveX ou JavaScript qui permet d'obtenir des donnes au format XML, JSON ou texte simple l'aide de requtes HTTP. Son rle est:
1. 2.
Deffectuer des requtes HTTP internes, invisibles et asynchrones De traiter la rponse 1998: dvelopp par Microsoft, en tant qu'objet ActiveX pour Explorer 5 IE 7 sous le nom MSXML
Historique
Internet
Plusieurs versions ont ts proposes: Microsoft.XMLHTTP, MSXML2.XMLHTTP, MSXML2.XMLHTTP.3.0, MSXML2.XMLHTTP.4.0, MSXML2.XMLHTTP.5.0, MSXML2.XMLHTTP.6.0
2002: implmentation sous Mozilla sous le nom XMLHttpRequest 2004: implmentation sous Safari 2005: implmentation sous Opra et Konqueror 3 2007: Standardisation par W3C 2008: Microsoft propose XDomainRequest depuis Internet Explorer 8
XMLHTTPREQUEST
Codage JavaScript
Pour les versions dInternet Explorer antrieur 7, le constructeur est obtenu travers un composant ActiveX Microsoft.XMLHTTP ou Msxml2.XMLHTTP Pour les versions IE 7, Mozilla, Firefox, Safari, Opra, on utilise lobjet natif XMLHttpRequest
il faut toujours faire un test sur la version de lexplorateur Web avant linstanciation
XMLHTTPREQUEST
Codage JavaScript
<script type="text/javascript"> function TestXHR() { if (XMLHttpRequest) { // ou (window.XMLHttpRequest) alert("Il faut utiliser lobjet natif XMLHttpRequest"); } else if (ActiveXObject) {// ou (window.ActiveXObject) alert("Il faut utiliser le composant ActiveX Microsoft.XMLHTTP ou Msxml2.XMLHTTP"); } else { alert("Votre navigateur ne supporte pas XMLHTTPRequest"); } } 5 </script>
XMLHTTPREQUEST
Codage JavaScript
Exemple: Instanciation de lobjet <script type="text/javascript"> function TestXHR() { if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { try { var xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { var xhr = new ActiveXObject("Msxml2.XMLHTTP"); } } else { alert("Votre navigateur ne supporte pas XMLHTTPRequest"); } } </script>
XMLHTTPREQUEST
Mthodes:
Ouvre la connexion avec le serveur. mthode: GET ou POST async: TRUE si le dialogue sera asynchrone et FALSE dans le cas contraire
send(data)
Dans le cas douverture de connexion avec la mthode GET, data prend null send(null) Dans le cas douverture de connexion avec POST, data peut contenir les donnes envoyer send("param1=val2¶m2=val2")
XMLHTTPREQUEST
Mthodes (suite):
Exemples
xhr.open("GET","ajax.php",true); xhr.send(null); xhr.open("GET","ajax.php?param1=5",true); xhr.send(null); xhr.open("POST","ajax.php",true); xhr.send(null); xhr.open("POST","ajax.php",true); xhr.send("pram=5¶m2=7¶m3=Fes");
8
XMLHTTPREQUEST
Mthodes (suite):
setRequestHeader(name, value)
Assigne un entte HTTP la requte. Trs utile lors de louverture de connexion avec la mthode POST name: nom du header value: la valeur du header
Exemple:
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
abort()
Annule la requte.
XMLHTTPREQUEST
Proprits:
responseText: contient la rponse de la requte au format texte (chane de caractres) 10 responseXML: contient la rponse de la requte au format XML
XMLHTTPREQUEST
Evnement:
onreadystatechange: vnement (fonction) qui se dclenche pour chaque changement de ltat de la requte (readyState)
Exemple
<script type="text/javascript"> function TestXHR() { if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { alert("Fichier transmis"); } } xhr.open("GET", "db.xml", true); xhr.send(null); } </script>
11
XMLHTTPREQUEST
Exercice 1:
Modifier le code en bas pour afficher dans une balise DIV le changement de la proprit readyState de lobjet XMLHttpRequest
<script type="text/javascript"> function TestXHR() { if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { alert("Fichier transmis"); } } xhr.open("GET", "db.xml", true); xhr.send(null); } </script>
12
<html > <head> <title></title> <script type="text/javascript"> function TestXHR() { if (window.XMLHttpRequest) var xhr = new XMLHttpRequest(); else alert("Votre navigateur ne supporte pas XMLHTTPRequest"); var monDiv = document.getElementById("IdDiv"); xhr.onreadystatechange = function() { monDiv.innerHTML += xhr.readyState +"<br/>"; } xhr.open("GET", "db.xml", true); xhr.send(null); } </script> </head> <body> <form action=""> <input type="button" value="Envoyer" onclick="TestXHR()" /> <div id="IdDiv"> </div> </form> </body> </html>
13
XMLHTTPREQUEST
Exercice 2:
Modifier le code pour afficher le statut (status) de la requte utilisant une zone de texte. Tester avec un fichier non existant Utiliser un tableau (Array) pour afficher un message comme suit:
200: la requte est excute avec succs 403: accs interdit (refus) 404: fichier non trouv 500: erreur interne au serveur
14
<html > <head> <title></title> <script type="text/javascript"> function TestXHR() { var xhrstatus = new Array(); xhrstatus["200"]="la requte est excute avec succs"; xhrstatus["403"]="accs interdit (refus)"; xhrstatus["404"]="fichier non trouv"; xhrstatus["500"] = "erreur interne au serveur"; if (window.XMLHttpRequest) var xhr = new XMLHttpRequest(); else alert("Votre navigateur ne supporte pas XMLHTTPRequest"); var monDiv = document.getElementById("IdDiv"); var monTxt = document.getElementById("IdText"); xhr.onreadystatechange = function() { monDiv.innerHTML += xhr.readyState +"<br/>"; monTxt.value = xhrstatus[xhr.status]; } xhr.open("GET", "db.xml", true); xhr.send(null); } </script> </head> <body ><form action=""> <input type="button" value="Envoyer" onclick="TestXHR()" /> <input type="text" value="" id="IdText" size="50"/> <div id="IdDiv"> </div> </form> </body> </html>
15
XMLHTTPREQUEST
Exercice 3:
Modifier le code pour afficher en popup le contenu dun fichier texte (db.txt)
16
<html > <head> <title></title> <script type="text/javascript"> function TestXHR() { var xhrstatus = new Array(); xhrstatus["200"]="la requte est excute avec succs"; xhrstatus["403"]="accs interdit (refus)"; xhrstatus["404"]="fichier non trouv"; xhrstatus["500"] = "erreur interne au serveur"; if (window.XMLHttpRequest) var xhr = new XMLHttpRequest(); else alert("Votre navigateur ne supporte pas XMLHTTPRequest"); var monDiv = document.getElementById("IdDiv"); var monTxt = document.getElementById("IdText"); xhr.onreadystatechange = function() { monDiv.innerHTML += xhr.readyState +"<br/>"; monTxt.value = xhrstatus[xhr.status]; if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } xhr.open("GET", "db.txt", true); xhr.send(null); } </script> </head> <body ><form action=""> <input type="button" value="Envoyer" onclick="TestXHR()" /> <input type="text" value="" id="IdText" size="50"/> <div id="IdDiv"> </div>
17
XMLHTTPREQUEST
Exercice 4:
Modifier le code pour afficher en pop-up le contenu dun fichier XML (db.xml)
18
<html > <head> <title></title> <script type="text/javascript"> function TestXHR() { var xhrstatus = new Array(); xhrstatus["200"]="la requte est excute avec succs"; xhrstatus["403"]="accs interdit (refus)"; xhrstatus["404"]="fichier non trouv"; xhrstatus["500"] = "erreur interne au serveur"; if (window.XMLHttpRequest) var xhr = new XMLHttpRequest(); else alert("Votre navigateur ne supporte pas XMLHTTPRequest"); var monDiv = document.getElementById("IdDiv"); var monTxt = document.getElementById("IdText"); xhr.onreadystatechange = function() { monDiv.innerHTML += xhr.readyState +"<br/>"; monTxt.value = xhrstatus[xhr.status]; if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseXML); } xhr.open("GET", "db.xml", true); xhr.send(null); } </script> </head> <body ><form action=""> <input type="button" value="Envoyer" onclick="TestXHR()" /> <input type="text" value="" id="IdText" size="50"/> <div id="IdDiv"> </div>
19
XMLHTTPREQUEST
Autres mthodes
getAllResponseHeaders()
Permet de rcuprer lentte HTTP de la rponse sous la forme dune chane de caractres On y trouve: Nom du serveur Taille du contenu Le type du contenu
Permet de rcuprer une valeur dun paramtre dentte HTTP prcis sxhr.getResponseHeader("Content-type")
20
APPLICATIONS
Fichier Texte
Crer une page Web contenant un bouton et un lment div Sur le serveur, crer un fichier texte. Le fichier texte contient la phrase: Si jarrive afficher ceci dans la zone DIV du fichier HTML, je peux dire que jai compris le principe dAJAX Aprs clique sur le bouton, le contenu du fichier texte doit tre affich dans llment DIV
21
APPLICATIONS
Fichier XML
onChange() du contrle SELECT pour afficher les informations partir du fichier DB.xml Pour accder un nud XML, utiliser la mthode xmldocument.getElementsByTag Name("tagName")
<?xml version="1.0" encoding="ISO-8859-1"?> <categorie> <prix>Csar du meilleur acteur</prix> <nom>Michel Bouquet</nom> <film>Le promeneur du Champ de Mars</film> </categorie> <categorie> <prix>Csar du meilleur film franais</prix> <nom>Jacques Audiard</nom> <film>De battre mon coeur sest arrt</film> </categorie> <categorie> 22 <prix>Csar du meilleur film tranger</prix> <nom>Clint Eastwood</nom> <film>Million dollar baby</film> </categorie> DB.xml
XMLHTTPREQUEST ET PHP
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Premier Exemple Ajax - PHP</title> <script type="text/javascript"> function TestXHR_PHP() { var xhr = new XMLHttpRequest(); var monDiv = document.getElementById("IdDiv"); xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { monDiv.innerHTML=xhr.responseText; } } xhr.open("GET", "ajax.php", true); xhr.send(null); } </script></head> <body"> <form action=""> <input type="button" value="Tester" onclick="TestXHR_PHP()" /> <div id="IdDiv"> </div> </form></body></html>
23
XMLHTTPREQUEST ET PHP
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Premier Exemple Ajax - PHP</title> <script type="text/javascript"> function XHR_PHP() { var xhr = new XMLHttpRequest(); var monDiv = document.getElementById("IdDiv"); xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { monDiv.innerHTML=xhr.responseText; } } xhr.open("GET", "ajax.php ?val1=5&val2=10", true); xhr.send(null); } </script></head> <body"> <form action=""> <input type="button" value="Tester" onclick="XHR_PHP()" /> <div id="IdDiv"> </div> </form></body></html>
24
XMLHTTPREQUEST ET PHP
Exercice
Crer un formulaire Web, comme sur la figure en bas. Le principe est dutiliser Ajax pour calculer le produit de deux nombres saisis.
Le calcul est effectu utilisant le PHP sur le serveur Les nombres sont envoys utilisant la mthode GET
25
<html xmlns="http://www.w3.org/1999/xhtml"> <head><title> Calculatrice AJAX</title> <script type="text/javascript"> function TestXHR_PHP(val1, val2) { var xhr = new XMLHttpRequest(); var monTxt = document.getElementById("res"); xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { monTxt.value=xhr.responseText;} } //xhr.open("GET", "ajax.php?val1="+ val1 +"&val2="+ val2, true); xhr.open("POST", "ajax.php", true); xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.send("val1="+ val1 +"&val2="+ val2); }</script> </head> <body><form action=""> <input type="text" value="" id="val1" size="10" oninput="TestXHR_PHP(val1.value, val2.value)"/> * <input type="text" value="" id="val2" size="10" oninput="TestXHR_PHP(val1.value, val2.value)"/> = <input type="text" value="" id="res" size="10"/> <!--<input type="button" name="btn" value="Cal" onclick="TestXHR_PHP(val1.value, val2.value)" />--> </form></body></html>
ajax.php
26
Exercice: Crer une table MySQL perso(ID int(4), Nom varchar(25), Prenom varchar(25)) Crer un formulaire HTML qui permet de saisir dans une zone de texte le nom.
Aprs clique sur un bouton Afficher , les prnoms possibles vont tre rcuprs de la table perso et affichs dans une zone div
27
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> function GetData(nom) { var monDiv = document.getElementById("IdDiv"); monDiv.innerHTML = "<u>Prnoms:</u>" + "<br/>"; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { var monDiv = document.getElementById("IdDiv"); monDiv.innerHTML += xhr.responseText; } } xhr.open("GET", "ajax.php?nm=" + nom, true); xhr.send(null); } </script></head> <body> <form action=""> Entrer le nom: <input type="text" value="" id="val1" size="20" oninput="GetData(val1.value)" /> <input type="button" name="button1" value="Afficher" onclick="GetData(val1.value)" /> <div id="IdDiv" style="border-width: 2px; border-style: dotted; border-color: red;"> 28 <u>Prnoms:</u></div> </form></body> </html>
AjaxMySqlPhp.html
<?php //on se connecte a la BDD $dbhost="localhost"; $dbuser="root"; $dbpass=""; $nm=$_GET['nm']; $dblink=mysql_connect($dbhost,$dbuser,$dbpass); mysql_select_db("ajax",$dblink); //on lance la requte $query = "SELECT Prenom FROM perso where Nom like '%$nm%'"; $result = mysql_query($query,$dblink) or die (mysql_error($dblink));
29
ajax.php
<?php $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; $xml .= "<Ajax>"; $xml .= "<Etudiants>"; $xml .= "<ID> 1 </ID>"; $xml .= "<Nom> Hafid </Nom>"; $xml .= "<Prenom> Said </Prenom>"; $xml .= "</Etudiants>"; $xml .= "<Etudiants>"; $xml .= "<ID> 2 </ID>"; $xml .= "<Nom> Ilias </Nom>"; $xml .= "<Prenom> Mohamed </Prenom>"; $xml .= "</Etudiants>"; $xml .= "</Ajax>"; header ("Content-Type:text/xml"); echo $xml; ?>
30
Exercice:
Crer une table MySQL etudiants( ID int (5), Nom varchar(25), Prenom varchar(25), Date_Naissance date, Niveau int(2), Filiere varchar(30)) Crer un formulaire comme sur les figures:
31
<html xmlns="http://www.w3.org/1999/xhtml"> <head><title></title> <script type="text/javascript"> function GetData(nom) { var monDiv = document.getElementById("IdDiv"); monDiv.innerHTML = "Informations: <br/>"; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { treatData(xhr.responseXML); } } xhr.open("GET", "ajax.php?nm=" + nom, true); xhr.send(null); } function treatData(xmldocument) { var monDiv = document.getElementById("IdDiv"); for (var i = 0; i < xmldocument.getElementsByTagName("ID").length; i++) { var ID = "ID: " + xmldocument.getElementsByTagName("ID")[i].firstChild.nodeValue + "<br />"; var Nom = "Nom: " + xmldocument.getElementsByTagName("Nom")[i].firstChild.nodeValue + "<br />"; var Prenom = "Prnom: " + xmldocument.getElementsByTagName("Prenom")[i].firstChild.nodeValue + "<br />"; var Date_Naissance = "Date de naissance: " + xmldocument.getElementsByTagName("Date_Naissance")[i].firstChild.nodeValue + "<br />"; var Niveau = "Niveau: " + xmldocument.getElementsByTagName("Niveau")[i].firstChild.nodeValue + "<br />"; var Filiere = "Filire: " + xmldocument.getElementsByTagName("Filiere")[i].firstChild.nodeValue + "<br />"; monDiv.innerHTML += ID + Nom + Prenom + Date_Naissance + Niveau + Filiere + "<hr style=\"border-color: red;\">"; } } </script> </head> <body> <form action=""> Entrer le nom:<input type="text" value="" id="val1" size="50" oninput="GetData(val1.value)" /> 32 <div id="IdDiv" style="border-width: 2px; border-style: dotted; border-color: red;"> Infomations:</div> </form></body> </html>
AjaxMySqlPhp.html
<?php echo getXmlFromDb($_GET['nm']); function getXmlFromDb($nm) { //on se connecte a la BDD $dbhost="localhost"; $dbuser="root"; $dbpass=""; $dblink=mysql_connect($dbhost,$dbuser,$dbpass); mysql_select_db("ensat",$dblink); //on lance la requte $query = "SELECT * FROM etudiants where Nom like '%$nm%'"; $result = mysql_query($query,$dblink) or die (mysql_error($dblink)); $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; $root_element = "Ajax"; $xml .= "<$root_element>"; //On boucle sur le resultat while ($result_array = mysql_fetch_assoc($result)) { $xml .= "<etudiants>"; foreach($result_array as $key => $value) { //$key contient les noms de colonnes de la tables $xml .= "<$key> ; //utiliser un lment CDATA pour viter les problmes des entits XML $xml .= "<![CDATA[$value]]>"; //Fermer llment $xml .= "</$key>"; } $xml.="</etudiants>" ; } $xml .= "</$root_element>"; //envoyer l'entte xml au navigateur header ("Content-Type:text/xml"); return $xml; } ?>
33
ajax.php
APPLICATION
Application Chat:
Lide est de raliser une application Web pour le Chat qui doit contenir deux pas pages Web:
la premire permettant de saisir un pseudo et un bouton de validation. la saisi du pseudo, un code AJAX doit vrifier lexistence ou pas du pseudo saisi. Si oui, le bouton de validation doit tre dsactiv et activ dans le cas contraire La deuxime page, doit contenir une zone daffichage permettant dafficher pour chaque utilisateur connect un message de connexion avec lheure de connexion et dafficher aussi les messages envoys par les autres membres. Nom: ChatRoom Tables: Message (nom_user varchar(50), lst_mesg varchar(255)) Utilisateur: (nom varchar(50), last_refresh datetime)
Base de donnes:
34