XMLHTTP et Javascript

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

31 oct. 2005, 17:53

En utilisant l'objet XMLHTTP, javascript communique dynamiquement avec un serveur Web sans recharger la page du client.
Du DHTML orienté objet.

Dans le cas d'une page contenant un script côté serveur, ce dernier est exécuté et les résultats affichés sont retournés par l'objet XMLHTTP Request.

Voici un exemple de paginateur rapide :
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Paginateur-AJAX</title>

<script type="text/javascript">
//Mémoire des pages à paginer
var pages = new Array("p1.htm","p2.htm","p3.htm");

//Afficheur dynamique
function afficher(texte){
document.all["afficheur"].innerHTML = texte;
}

//Pagination
function aller_à(sens){
//Si la mémoire des pages n'existe pas ou vide : rien à faire
if (!pages || pages.length <=0) return false;
//index de la page actuelle
var index_actuel = document.all["index_actuel"].value;
//Recalculer l'index actuel selon le sens
if(sens == 'précédent') index_actuel --; 
if (index_actuel < 0) index_actuel = 0; //Correction de l'index : borne inf.
if(sens == 'suivant') index_actuel ++;
if (index_actuel >= pages.length) index_actuel = pages.length -1; //Correction de l'index : borne sup.
//Mémoriser l'index actuel
document.all["index_actuel"].value = index_actuel;
//Et en afficher la page
afficher(contenu(pages[index_actuel]));
return true;
}

//Lecture du contenu d'un fichier
function contenu(fichier){
if(window.XMLHttpRequest) // FIREFOX
	xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
	xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
	return(false);

xhr_object.open("GET", fichier, true);
xhr_object.send(null);
if(xhr_object.readyState == 4) return(xhr_object.responseText);else return(false);
}
</script>

</head>
<body>

<form>
<input type=button value="<" onClick="aller_à('précédent')" />
<input type=button value=">" onClick="aller_à('suivant')" />
<input type=hidden name="index_actuel" value="0" />
<div id="afficheur"></div>
</form>
<script>
//Par défaut afficher la première page
aller_à(0);
</script>
</body>
</html>
Pour tester ce programme créer les 3 pages à paginer par le test :
p1.htm, p2.htm et p3.htm
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 493 Messages

31 oct. 2005, 18:18

Bonjour

Je ne trouve pas ton code spécialement OO ... Je pense qu'il serait bien si tu évitais les caractères accentués dans tes lignes de code, et le français dans une moindre mesure (question de goût, et comme on le sait, les goûts et les couleurs ... ).

Il serait interressant de suivre des normes de programmations dans ton code. Je dis cela en pensant à
if(sens == 'précédent')
// et
if (index_actuel < 0)
Un code plus unifié (au niveau des espaces par exemple) donnerait une meilleure visibilité, ainsi que par l'utilisation d'une indentation. Je te suggère aussi de mettre les { et les } même si ces dernières sont inutiles.

Je ne pense pas que le code ci-dessous soit portable sur tous les navigateurs
document.all["afficheur"].innerHTML
Je pense qu'il aurait été bien d'avoir un code HTML propre, pas un mélange d'HTML 4 et de XHTML 1.

Pour ce qui est du code OO, je te suggère d'aller voir du coté de prototype.

J'espère t'avoir aidé et avoir effectué une bonne critique.
bonne continuation !

Eléphant du PHP | 353 Messages

31 oct. 2005, 18:19

En utilisant l'objet XMLHTTP, javascript communique dynamiquement avec un serveur Web sans recharger la page du client.
Du DHTML orienté objet.
En voilà une belle phrase mais au final ça ne veut rien dire.

"javascript communique dynamiquement" ? Ca veut dire quoi ? Quelle est la différence entre une communication dynamique et une communication non dynamique. Je veux bien par parenthèses la définition d'une communication dynamique.

C'est quoi du dhtml orienté objet ?

J'ai la nette impression que tu emploies plein de terme sans en comprendre la signification.
//Afficheur dynamique
function afficher(texte){
document.all["afficheur"].innerHTML = texte;
}
tu fais du code portabl e ou pas ?
//Lecture du contenu d'un fichier
function contenu(fichier){
if(window.XMLHttpRequest) // FIREFOX
tiens ici tu testes autre chose que MSIE ?

Quel est l'intérêt de la chose mise à part le fait de penser être dans le vent ?

Ce que je comprends du truc c'est que tu réinventes la pagination avec des bêtes liens (a href) mais en rendant le tout inaccessible à grand coup de javascript intrusif et non portable.

Mammouth du PHP | 1311 Messages

31 oct. 2005, 18:24

moi mon avis c'est que sadeq apporte une solution a de nombreux poste(dernierement) sur la pagination en limitant les acces serveur

et je trouve certaines remarques deplacées
Modifié en dernier par jeff le 31 oct. 2005, 18:30, modifié 1 fois.

Eléphant du PHP | 353 Messages

31 oct. 2005, 18:26

moi mon avis c'est que sadeq apporte une solution de nombreux poste(dernierement) sur la pagination en limitant les acces serveur
Montre moi quel est le gain ? Je t'écoute attentivement.

Eléphant du PHP | 493 Messages

31 oct. 2005, 18:28

Citation:
//Lecture du contenu d'un fichier
function contenu(fichier){
if(window.XMLHttpRequest) // FIREFOX
tiens ici tu testes autre chose que MSIE ?
Je voudrais te signler que cette partie est tout à fait portable ... Il s'agit de la méthode couramment employée, IE préfère les activeX et ne supporte pas windows.XMLHttpRequest.

nicolas, je trouve tes attaques peu argumentées ... La méchanceté gratuite ne sert à rien et le fait de rabesser les autres ne te met pas en valeur, bien au contraire !

Edit: Jeff +1

Eléphant du PHP | 493 Messages

31 oct. 2005, 18:30

Le gaim se fait sur des appli dynamiques codées pour XUL par exemple...

Eléphant du PHP | 353 Messages

31 oct. 2005, 18:44

Pas de chance Vaedan, tu as lu en diagonale, c'est au dessus que le code n'est pas portable:

Code : Tout sélectionner

document.all["afficheur"].innerHTML = texte;
> Le gaim se fait sur des appli dynamiques codées pour XUL par exemple...

Je ne suis pas d'accord et c'est nettement discutable lorsqu'on sait que soap est natif dans firefox. A moins d'être maso, on fait des requêtes soap plutôt que de parser des réponses du type xmlhttprequest!

Et pour le gain je parle de cet exemple la: pagination. Je demande toujours que l'on me montre le gain. Bonne chance.

Eléphant du PHP | 493 Messages

31 oct. 2005, 18:59

Pas de chance Vaedan, tu as lu en diagonale, c'est au dessus que le code n'est pas portable:

Code : Tout sélectionner

document.all["afficheur"].innerHTML = texte;
Autant pour moi, mais je n'ai pas lu en diagonale :)

Il est clair que SOAP est mieux (et recommandé par le W3C) mais JS et SOAP ... moins efficace que HttpRequest. Je ne suis meme pas sur que JS supporte SOAP !

Eléphant du PHP | 353 Messages

31 oct. 2005, 19:22

Autant pour moi, mais je n'ai pas lu en diagonale :)
On écrirait ici "au temps pour moi" et pas "autant pour moi".
Il est clair que SOAP est mieux (et recommandé par le W3C) mais JS et SOAP ... moins efficace que HttpRequest. Je ne suis meme pas sur que JS supporte SOAP !
Je parle en connaissance de cause. Il y a une api soap pour mozilla accessible en javascript.
Et je ne parle pas d'éfficacité, je parle de facilité d'utilisation, de maintenabilité, d'accessibilité...

Eléphant du PHP | 55 Messages

31 oct. 2005, 19:54

Mouais. Y'a pas que mozilla. IE doit être pris en compte dés qu'on s'adresse a une audience un peu large.

J'utilise pour le moment xmlhttprequest en long et en large. Ce qu'il permet ? le gain ? il permet de modifier dynamiquement le contenu même de mes pages, sans avoir a les recharger. (d'ailleurs, même pas obligé de faire passer que du xml, du simple texte passe aussi, et donc du html).

Le clou du spectacle ? tu peux ainsi communiquer avec d'autres scripts php. Dans mon cas, j'effectue des requetes sur plusieurs moteurs de recherches en même temps, et je récupère les infos qu'ils renvoyent. Plutôt que de faire tout en php, un à un, ce qui prendrait des plombes, je fais ma page, je lance autant de connexions que je veux, en même temps, vers les différents scripts php. La page s'affiche, et les petits bouts d'information avec, au fur et a mesure qu'il arrive.

L'ajax de google en est un bel exemple. C'est pas encore ce qu'il y a de plus sexy comme méthode, mais c'est vachement chouette.
Mais qu'importe..

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

31 oct. 2005, 22:50

Modération : Les pinailleurs sont priés de se calmer, comme nicolas et pour tout le monde : mettez donc des exemples appliqués (pas forcément votre script) afin de montrer pourquoi Ajax lave plus blanc...ou pas !
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 353 Messages

01 nov. 2005, 00:04

Mouais. Y'a pas que mozilla. IE doit être pris en compte dés qu'on s'adresse a une audience un peu large.
on parlait de xul!!! Xul dans IE ce n'est pas encore gagné!
J'utilise pour le moment xmlhttprequest en long et en large. Ce qu'il permet ? le gain ? il permet de modifier dynamiquement le contenu même de mes pages, sans avoir a les recharger. (d'ailleurs, même pas obligé de faire passer que du xml, du simple texte passe aussi, et donc du html).
je ne parle pas d'ajax en général mais de cet exemple en particulier et j'attends toujours qu'on me montre ou m'explique le gain.

Eléphant du PHP | 55 Messages

01 nov. 2005, 14:06

awii.. xul, le fameux. tiens, ça m'apprendra de poster des messages a 18h54,dslé.

Ca a l'air super, mais je ne m'y intérresserais que quand mozilla aura 15% des parts du marché. Par contre, le projet XUL/PHP gtk à l'air vachement cool.
Mais qu'importe..

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

01 nov. 2005, 14:51

Sans vouloir en remettre une couche, XMLHttpRequest n'a pas la même utilité que SOAP.

SOAP est fait pour offrir la possibilité d'appeler un programme/une procédure sur un serveur distant, et définir un protocole de communication répondant à cet objectif. En contrepartie comme il utilise XML les messages échangés sont souvent lourds : pour un simple appel à une procédure prenant deux arguments et qui renvoie un nombre (genre une fonction de conversion de devises) les messages pourront atteindre plusieurs ko.

XMLHttpRequest est fait pour palier à une limitation du Javascript : l'impossibilité de dialoguer dans les deux sens. SOAP ne serait absolument pas adapté dans l'exemple de sadeq, alors qu'XHR est tout à fait recommandé.

L'intérêt ? Je clique sur le lien "page suivante" (par exemple, pour être dans le cadre du script de sadeq, puisque tu veux une explication sur ce cas précis) et au lieu de rafraichir toute la page, JS va chercher juste les données nécessaires, dans un format compact déterminé par le développeur, et réaffiche uniquement la table (avec DOM ou du DHTML un peu plus trash). Le gain en bande passante est énorme, et seul ce qui doit être calculé l'est : c'est tout l'intérêt de la chose, et il me parait évident.