Problème de calcaire

Je teste depuis peu les fonctionnalités d’AJAX, et, bien que dans les grandes lignes, ca marche (j’envoie des variables dans un .php qui traite les informations et dont le resultat est retourné dans un div), il y a cependant des choses plus complexe… mais bien plus intéressantes, que je n’arrive pas a faire fonctionner =[

Description de l’environnement
J’ai 2 fichiers : « test.html » et « test.php »
Contenu de test.html =>

  • le script ajax
  • des liens « onclick » qui executent ajax
  • un div id=menu
  • un div id=contenuajax

Probleme n°1 :
Contenu de test.php =>

  • déclaration d’une function JS
  • execution de cette function

CA, ca ne marche pas… et je ne vois pas pourquoi…
En principe, le fonctionnement est le suivant : ajax appelle le fichier, qui s’execute, et return le code final et le place dans « contenuajax »… Or, la function ne semble pas avoir été executée, et ne semble pas déclarée en fait, une fois le contenu de mon test.php integré dans le « contenuajax » de test.html @_@

Probleme n°2 :
Contenu de test.php =>

  • code JS qui modifie le div « menu »

Ca ne marche pas non plus… mais ca me semble logique, puisque le script est executé indépendament de la page dans laquelle elle va etre integrée. Alors question : Comment fait-on si je dois absolument modifier mes 2 divs ?

Probleme n°3 :
Il y a un truc que je ne saisis pas dans la propriété « onreadystatechange ».
Dans les exemples, ils assignent a une fonction cette propriété. Cette fonction est chargée de traiter les données recues.
Cependant, je suis dans l’impossibilité d’envoyer des variables dans cette fonction, ce qui m’aurait arrangé pour diverses raisons :
onreadystatechange = drawresultat(mondiv, blabla);
Ceci me renvoi un « type incompatible »
Moi j’veux bien mais bon ca m’aide pas a faire c’que j’veux :confused:

Et j’en ai lu des trucs sur ajax… mais ils dépassent jamais le simple exemple de j’envoie des variables vers une page et pouf c’te page m’est retournée et on l’affiche dans un div (ou attention les gars… dans un alert(); XD) … YOUPI

RTFM ? Blah =’(

Vous ne savez pas ou vous vous en foutez ? ;p
ou les 2 >_<

Ben je vias pas etre super constructif desole (si ce n’est pour expliquer le manque d’enthousiame a te repondre quand meme…) mais « AJAX » en php… pas sur qu’on ait beaucoup des specialistes ici… A la limite ca serait en ASP.Net t’aurais boudin pour t’expliquer comment marche le fameux framework ATLAS en long en large et en travers vu que c’est un peu son taf de le faire :stuck_out_tongue:

Quel que soit le langage qui soit utilisé en tache de fond, la n’etait pas le probleme… Ca aurait meme pu etre du html+js pur, on s’en bat les reins.

Bon je me sens pas d’étudier ton problème de près mais juste un petit rappel de ce qu’est AJAX pour que tu gagnes du temps.
En fait c’est ubër-simple, voire simpliste. Il faut prendre AJAX comme une “technique” qui se résume à :

  • j’ai une page avec du JS qui fait un xmlhttprequest
  • ce xmlhttprequest appelle une autre page qui va générer du XML (ça peut être fait avec n’importe quel langage)
  • une fois que la page a été générée et renvoyée, une callback lié à l’objet xmlhttprequest est appelée. Cette callback arrive avec un paramètre qui permet de déterminer si tout s’est bien passé.
  • et vala…

Exemple :
toto.html

[code]xml = new XMLHttpRequest();
xml.open(“GET”,“http://www.toto.com/genere_xml.php”,true);
xml.send(null);
xml.onreadystatechange = OnLoadStateChange;

function OnLoadStateChange()
{
if ( xml.readyState == 4 )
{
if ( xml.status == 200 )
{
racine = xml.responseXML.documentElement;
kekchose_nodes = racine.getElementsByTagName(“kekchose”);
for(i=0; i<kekchose_nodes.length; i++)
{
nom = kekchose_nodes[i].getAttribute(“nom”);
val = kekchose_nodes[i].firstChild.nodeValue,


}
}
}[/code]
genere_xml.php

<?php echo "<"."?"."xml version='1.0' encoding='ISO8859-1' "."?".">"; echo "<racine>"; echo "<kekchose nom='titi'>groar</kekchose>"; echo "<kekchose nom='tutu'>vroum</kekchose>"; echo "</racine>"; ?>

Tu dois juste retenir que tu obtiens tu XML à l’arrivée et tu en fais ce que tu veux.
L’AJAX c’est juste ça.
Le problème c’est qu’en ce moment y a une guéguerre à propos de l’expression Web 2.0 et une tonne d’avis techniques divers et variés viennent embrouiller les esprits. On commence notamment à présenter AJAX comme un framework à grands coups d’exemples que les uns et les autres reproduisent sans savoir où se trouve la “base” et “l’ajouté”. Avec le buzz, la polémique, etc. ça devient une soupe incompréhensible truffée d’acronymes.
So, back to basic : une page HTML communique avec un serveur, reçoit des données XML et elle en fait ce qu’elle veut à grands coups de JS. Point.

Antoine

Ouais j’avais compris le principe mais c’est toujours bon de le rappeler…
Ceci dit jusqu’à y’a quelques jours, je ne récupérais pas mes informations sous la forme d’un xml et par conséquent, et bien je tombais sur quelques soucis… Niveau traitement on peut pas faire grand chose (enfin si on peut mais c’est vraiment pas fait pour, et c’est d’une lourdeur ^^) lorsqu’on récupère un gros bloc unique d’html.

Du coup je m’amuse depuis hier a renvoyer le contenu sous forme XML et c’est déjà bien mieux pour effectuer les traitements dont j’ai besoin : )

[quote name=‘Terenas’ date=’ 8 Oct 2005, 04:08’]Quel que soit le langage qui soit utilisé en tache de fond, la n’etait pas le probleme… Ca aurait meme pu etre du html+js pur, on s’en bat les reins.
[right][post=“405740”]<{POST_SNAPBACK}>[/post][/right][/quote]
Ben je vois que tu t’en sors, tant mieux.

Cela dit, je pense que t’as super mal pose ta question d’origine et que c’est pour ca que les reponses manquent ce que j’essayais de te dire gentiement… Parceque c’est pas les competences technique qui manquent dans ce domaine sur le forum. Sans aller jusqu’a boudin et meme si j’en ai pas fait depuis un petit moment je crois que j’ai de bon restes moi meme. Je t’explique juste pourquoi t’as pas de reponses en presentant le truc comme ca… Ton message est pas clair et la maniere dont tu en parles par rapport a PHP prete a confusion… Quand tu dit “AJAX execute ci, AJAX fait ca” dans ton message d’origine ca veut rien dire, on sait pas si tu parles d’un framework en particulier que qqn a construit, ou direct de xmlhttprequest. Je pense qu’il va falloir que tu sois plus clair sur ce qui se passe.

Et encore une fois, si t’envoies un gentil PM a boudin ou Kinik en leur indiquant le thread il pourront surement venir t’aider si tu expliques mieux ton probleme sachant que l’un bosse directement tous les jours sur un framework AJAX en collaboration directe avec les gens qui ont inventé xmlhttprequest (chez MS/Asp.Net) et que l’autre l’utilise regulierement pour des sites avec des centaines de millions de pages vues par mois (chez MS/MSN)…

Sinon, plus generalement, la partie interessante actuellement c’est pas xmlhttprequest, ca fait juste depuis IE5 que ca existe, c’est toute l’infrastructure qui va autour (framework) pour le rendre utilisable facilement, que ca soit ATLAS ou d’autres. Apres si tu veux faire du xmlhttprequest “to the metal” en direct, y a moins de monde que ca va toucher. Fin 2005, en dehors du bases pour comprendre comment ca marche dessous, toute personne saine d’esprit utilise ou developpe un framework ou un autre pour pas se casser les dents.

[quote name=‹ Terenas › date=’ 7 Oct 2005, 13:05’][/quote]

Bon, je sais pas si tu as toujours des problèmes, mais je vais quand même tenter ma chance pour te filer un coup de pouce.

Problème N°1 :
Le fait de placer du code javascript dans ton div ne l’exécutera pas. Le seul moyen pour arriver à tes fins est de faire un « eval » sur le javascript récupéré.

Problème N°2 :
Ca ça marche très bien normalement. Un truc du style « parent.document.all[« divmenu »].innerHTML = toncode » fonctionne s’il est exécuté depuis ton test.php.

Problème N°3 :
Ce problème là je l’ai tout le temps. En fait l’exécution de ta fonction se fait de manière asynchrone, donc si la variable que tu passes à drawresultat est déclarée localement dans le fonction qui contient le « onreadystatechange = drawresultat(mondiv, blabla); » (appelons la « toto »), au moment de l’exécution de drawresultat tu est déjà sorti de toto, donc la variable locale n’existe plus. Tu dois donc avoir une variable globale. Mais alors gare en cas de requêtes simultanées, il peut y avoir des mélanges de pinceaux. :stuck_out_tongue:

Edit> Après réflexion, je crois que ton problème vient plutôt de là : il faudrait écrire onreadystatechange = function () {drawresultat(mondiv, blabla);}. Mais mon blabla ci-dessus reste valable…

@ Glop : Le probleme est que je ne voulais pas copy/paste du code car ca fait un thread immense pour 3 pov’ questions… Donc non je n’utilise aucun framework, j’met les mains dans le vieu camboui :]
Donc forcément j’ai du faire de l’abus de langage ~

@tonitonio : Le probleme n°1 rejoint le probleme n°2… En effet, le probleme n°2 est du code JS qui modifie mon div “menu”, mais le code n’est pas executé lorsque récupéré, donc on en revient au probleme n°1, résolu en effectuant un eval.
Le probleme c’est qu’on n’a pas forcément QUE du JS importé dans le probleme n°2, donc eval sera pas tiptop~
En résumé, “responseText” c’est caca des qu’on veut faire des trucs qui sortent de la normale :]

Mais bon, en passant par XML ca va beaucoup mieux, on récupère nos éléments séparément avec un callback dédié à la requete…

En fait actuellement je procede ainsi :

[code]/*
  Lavar : variable ou array envoyé à la page distante
  Method : ‘GET’ / ‘POST’ / ‘HEAD’ / whatever~
  Action : URL de la page distante
  Callback : nom de la function pour le callback
*/

Openpage(Lavar, Method, Action, Callback) {
  // detection du browser gnia gnia
  [on s’en fout]

  // La ou ca nous interesse
  http_request.onreadystatechange = eval(Callback);
  http_request.open(Method, Action, true);

  // traitement de Lavar & encodeURIComponent (réécrit sous la forme v0=plic&v1=ploc&v2=plouc)
  sending=TraitementVariable(Lavar);

  // Et le reste, le header, l’envoie de la variable ou pas, etc…
  [on s’en fout]
  }

// ------- Et la toutes les functions de callback ------------ début
function OnlyExec() {
  // Quand 4 & 200 => rien faire
  }

function DrawContentHTML() {
  // Quand 4 & 200 => Afficher dans le div prévu pour
  document.getElementById(‘mydiv’).innerHTML=http_request.responseText;
  }

// callback pour un script particulier
function Traitement_XML_MaPage() {
  // Quand 4 & 200 & script == MaPage => On traite avec XML
  var xmldoc = http_request.responseXML;

  var mondivmenu = xmldoc.getElementsByTagName(‘divmenu’).item(0);
  document.getElementById(‘ledivquimesaoulait’).innerHTML=mondivmenu.firstChild.data;

  var div2 = xmldoc.getElementsByTagName(‘gni2’).item(0);
  document.getElementById(‘div2’).innerHTML=div2.firstChild.data;

  //etc etc
  }
[etc etc]
// ------- Et la toutes les functions de callback ------------ fin[/code]
Du coup j’code une function par callback et voila… Quand j’ai juste besoin d’enregistrer une information je passe par

sinon

etc etc~

J’ai codé à la volée donc hin, il y aura ptetre des erreurs mais bon, on s’en fout, c’était pas la syntaxe qui importait ! :]