Page 1 sur 1
Objet XMLHTTPREQUEST et PHP
Posté : 06 oct. 2010, 10:17
par Aureusms
Bonjour à Tous,
Je suis confronté à un problème particulier. Je lance des applications en AJAX qui répondent toutes correctement. Seulement de temps en temps, elles se lancent deux fois : la première ne se termine que lorsque le délai d'exécution maximum est atteint (qui est très grand vu que c'est en mode asynchrone) et la seconde se termine normalement (quelque ms ~60 ms). Néanmoins tant que la première n'indique pas dans le readystatechnage qu'elle est terminée, je n'ai pas de résultats affichable. ca mouline, ca mouline et c'est tout... Savez vous quelles pistes je dois explorer ?
Re: Objet XMLHTTPREQUEST et PHP
Posté : 06 oct. 2010, 20:00
par Cyrano
Faute de plus d'éléments, je suggèrerais peut-être :
- Si les url vers les fichiers PHP appelés aboutissent via un routage dans une architecture MVC, vérifier que l'appel arrive bien au fichier : un var_dump() des paramètres avec un simple die(); après ça juste pour vérifier que tous les appels arrivent normalement;
- Sinon, ben même processus de toutes façons pour vérifier quels paramètres arrivent et sont valides;
- Dans le fichier PHP, un if sans le else qui ne devrait jamais arriver mais dans lequel aboutiraient pourtant certains appels;
- retour non conforme ? Si en retour tu attends par exemple du JSON et que c'Est autre chose qui est renvoyé, ça peut patiner longtemps parce que le retour ne peut pas être parsé et encore moins affiché;
Qu'est-ce que te raconte Firebug sur les appels Ajax ? indique-t-il des urls conformes à ce que tu as programmé ?
Re: Objet XMLHTTPREQUEST et PHP
Posté : 06 oct. 2010, 22:40
par Aureusms
Déjà un super merci de l'aide.
La console de Firebug me retourne deux fois la fonction : la première mouline et la seconde donne le résultat. Tant que la première mouline : pas d'affichage. Si je déplie la seconde, le résultat est bon et correct. Je suppose que c'est peut être côté JS que cela cale. Je poste mes deux fonctions JS dans le prochain POST. Enfin, ce n'est que de temps en temps que ce phénomène se produit.
Re: Objet XMLHTTPREQUEST et PHP
Posté : 06 oct. 2010, 22:46
par Aureusms
Voici mes code côté JS :
L'obet XMLHTTP REQUEST :
Code : Tout sélectionner
var xmlHttp = createXmlHttpRequestObject ();
function createXmlHttpRequestObject ()
{
var xmlHttp;
try
{
xmlHttp = new XMLHttpRequest ();
}
catch(e)
{
//pour IE 6 et plus ancien
var XmlHttpVersions = new array ("MSXML2.XMLHTTP.6.0",
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP");
for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
{
try
{
xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
}
catch(e) {}
}
}
if (!xmlHttp)
alert ("Erreur dans la création de l'objet XMLHttpRequest");
else
return xmlHttp;
}
Les fonctions de retour (onready state change et ....)
Code : Tout sélectionner
var objetXHR = new Object();
function objectTextResponse ()
{
if (objetXHR)
{
try
{
if (objetXHR["lienGet"] && objetXHR["lienGet"].length != 0)
objetXHR["XMLHttpRequest"].open("GET", "index.php"+objetXHR["lienGet"], true);
if (objetXHR["lienPost"] && objetXHR["lienPost"].length != 0)
objetXHR["XMLHttpRequest"].open("POST", "index.php"+objetXHR["lienPost"], true);
if (objetXHR["lienPost"] && objetXHR["lienGet"] && objetXHR["lienGet"].length == 0 && objetXHR["lienPost"].length == 0)
return false;
if (objetXHR["lienPost"] && objetXHR["lienGet"] && objetXHR["lienGet"].length != 0 && objetXHR["lienPost"].length != 0)
return false;
if (getObj("ajax_loader"))
{
montreFenetre ("ajax_loader");
}
objetXHR["XMLHttpRequest"].onreadystatechange =
function ()
{
if (objetXHR["XMLHttpRequest"].readyState == 4)
{
if (objetXHR["XMLHttpRequest"].status == 200)
{
try
{
var textResponse = objetXHR["XMLHttpRequest"].responseText;
if (objetXHR["simuleXML"] == true)
{
if (textResponse)
{
var idAModifier = simule_xml (objetXHR["simlueXmlTableauDonnee"][0],textResponse);
idAModifier = idAModifier[1];
var valueAModifier = simule_xml (objetXHR["simlueXmlTableauDonnee"][1],textResponse);
valueAModifier = valueAModifier[1];
if (getObj(idAModifier))
{
getObj(idAModifier).innerHTML = valueAModifier;
}
if (getObj ("ajax_loader"))
cacheFenetre ("ajax_loader");
if (getObj(objetXHR["nomFenetreEnfant"]) && objetXHR["nomFenetreEnfant"] != false)
cacheFenetre(objetXHR["nomFenetreEnfant"]);
}
}
else
{
if (objetXHR["nomFenetreEnfant"] != false)
creeFenetreSimple (textResponse,objetXHR["nomFenetreEnfant"],objetXHR["nomFenetreParent"],objetXHR["positionXEnfant"],objetXHR["positionYEnfant"]);
if (getObj ("ajax_loader"))
cacheFenetre ("ajax_loader");
if (objetXHR["nomFenetreEnfant"] != false && getObj(objetXHR["nomFenetreEnfant"]))
{
if (getObj(objetXHR["nomFenetreEnfant"]).style.visibility == "hidden")
objetVisible (objetXHR["nomFenetreEnfant"]);
if (getObj(objetXHR["nomFenetreEnfant"]).style.display == "none")
montreFenetre(objetXHR["nomFenetreEnfant"]);
}
}
}
catch(e)
{
alert ("Erreur lors de la lecture de la réponse : " + e.toString());
}
}
else
{
alert ("Il y a un problème de réception des données:\n" + objetXHR["XMLHttpRequest"].statusText);
}
}
}
if (objetXHR["lienPost"] && objetXHR["lienPost"].length != 0)
objetXHR["XMLHttpRequest"].setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
if (objetXHR["lienPost"] && objetXHR["lienPost"].length != 0)
objetXHR["XMLHttpRequest"].send(objetXHR["dataPost"]);
else
objetXHR["XMLHttpRequest"].send(null);
}
catch(e)
{
alert ("Impossible de se connecter au serveur : \n"+e.toString());
}
}
}
une fonction au hazard :
Code : Tout sélectionner
function afficheArticle(idArticle)
{
if (!idArticle)
{
alert ("Erreur_aucune_selection");
return false;
}
positionTopSouris = ord;
if (objetXHR["XMLHttpRequest"])
objetXHR["XMLHttpRequest"].abort();
objetXHR["XMLHttpRequest"] = createXmlHttpRequestObject ();
objetXHR["lienGet"] = "?affiche=affiche_article&id_article="+idArticle+"&article_action="+articleAction+"&langue_article="+articleLangue;
objetXHR["lienPost"] = "";
objetXHR["dataPost"] = "";
objetXHR["nomFenetreParent"] = "commun_boite";
objetXHR["nomFenetreEnfant"] = "boiteAfficheArticle";
objetXHR["positionXEnfant"] = 120;
objetXHR["positionYEnfant"] = ord-400;
objetXHR["simuleXML"] = faux;
objetXHR["simlueXmlTableauDonnee"] = new Array ();
objectTextResponse();
}
Ce sont mes premiers pas en JS, soyez indulgent...
Je n'ai pas mis certiane fonction comme montreFenetre et cacheFentre car je pense qu'elles n'apporterons pas grand chose : elles servent à interagir avec les CSS.
Re: Objet XMLHTTPREQUEST et PHP
Posté : 07 oct. 2010, 07:43
par Cyrano
Déjà un super merci de l'aide.
La console de Firebug me retourne deux fois la fonction : la première mouline et la seconde donne le résultat. Tant que la première mouline : pas d'affichage. Si je déplie la seconde, le résultat est bon et correct. Je suppose que c'est peut être côté JS que cela cale. Je poste mes deux fonctions JS dans le prochain POST. Enfin, ce n'est que de temps en temps que ce phénomène se produit.
Et dans l'onglet Console de Firebug, pas d'erreur signalée ? Sinon, si tu as installé la barre WebDeveloper (Sous Firefox), il y a aussi en haut à droite deux petites icônes, soit un rond vert avec une coche blanche, soit un rond rouge avec un point d'exclamation blanc : en cas d'erreur dans le JavaScript, ça passe au rouge et en cliquant dessus, ça t'ouvre une fenêtre avec la liste de toutes les erreurs et tous les avertissements. Il peut s'y trouver des indications utiles.
En tous cas dans tes codes, je n'ai pas relevé d'erreur flagrante. As-tu songé à te simplifier la vie en utilisant jQuery ? Tu n'aurais plus à développer que les fonctions de gestion du retour, ce serait nettement plus simple.
Re: Objet XMLHTTPREQUEST et PHP
Posté : 07 oct. 2010, 09:27
par Aureusms
En tous cas dans tes codes, je n'ai pas relevé d'erreur flagrante. As-tu songé à te simplifier la vie en utilisant jQuery ? Tu n'aurais plus à développer que les fonctions de gestion du retour, ce serait nettement plus simple.
Là tu m'intéresse...
Re: Objet XMLHTTPREQUEST et PHP
Posté : 07 oct. 2010, 09:38
par Cyrano
Dans ce cas, je te propose un peu de lecture :
http://api.jquery.com/jQuery.ajax/
Si tu as des difficultés, ben reviens poser des questions. N'oublie pas de
télécharger Jquery parce qu'il faudra l'ajouter dans ton en-tête HTML, juste avant don script actuel qui sera amaigri en conséquence.
Re: Objet XMLHTTPREQUEST et PHP
Posté : 07 oct. 2010, 12:58
par Nours312
jQuery ou
Prototype (perso je préfère ^^) sont trés bien mais ne vont pas fair bien plus que ce que tu fais actuellement, si ce n'est vérifier que tu n'as pas réalisé d'erreur dans ton code (leur leur ne comportant pas de faute de frappe, si ça marche c'est que le pb viens bien de toi ;D
Sinon, tu fais une vérif :
[javascript]
if (objetXHR["XMLHttpRequest"].readyState == 4)
{
...
} else { console.log(objetXHR, objetXHR["XMLHttpRequest"], objetXHR["XMLHttpRequest"].readyState) ; }
[/javascript]
en ajoutant ce débug ça peux te donner une indication sur ce qui se passe durant ce bug !...
sinon, tu peux aussi planter dans toutes tes boucles / conditions des console.log("Jusqu'ici tout vas bien !"); et mieux comprendre l'interruption de "bon fonctionnement"
/* NOTA : console.log() permet d'ajouter dans la console (fireBug en l'occurrence) une info/un objet / ... */
@++
Re: Objet XMLHTTPREQUEST et PHP
Posté : 08 oct. 2010, 12:41
par Aureusms
Ok danke sehr à tous les deux, je suis sur le coup ...