Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > AJAX
AJAX Forum sur la programmation AJAX. Avant de poster : Cours AJAX, FAQ AJAX, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2011, 11h09   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Par défaut Réponse non reçue du serveur

Bonjour,

Je patauge depuis quelque temps avec un problème dans mon script Ajax. J'ai fait un code tout simple permettant d'exécuter un script PHP de manière asynchrone avec Ajax. Ce script PHP devrait tout simplement m'envoyer un petit mot ! Mais la valeur de responseText est toujours vide, responseXML toujours à 'null' et readyState toujours à 0....... Quelqu'un a une idée ? Je pense que c'est tout bête ! Mais là, je ne vois pas..... En mode synchrone, c'est Ok....

Voici mes codes :

La (ou plutôt les 2) fonction(s) Javascript

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function ajax(action)
{
	// Création de l'objet de requête HTTP
	var xhr;
	if (window.XMLHttpRequest) xhr = new XMLHttpRequest();
	else if (window.ActiveXObject) xhr = new ActiveXObject('Microsoft.XMLHTTP'); 
 
    // Appel de la page traitant le formulaire
    xhr.open('POST', "../web/"+action, true);
 
    // Définition de la fonction qui sera appelée à chaque changement d'état de l'objet xhr.readyState
    xhr.onreadystatechange = function() { alert_ajax(xhr); };
 
    // Affichage de l'image indiquant qu'il faut patienter
    document.getElementById("wait").className="waitActif";
 
    // Envoi des données
    xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    xhr.send('donnee=valeéàéèàéur');
}
 
// Cette fonction est appelée à chaque changement d'état
function alert_ajax(xhr)
{
	alert(xhr.readyState);
        alert(xhr.status)
    if (xhr.readyState == 4 && xhr.status==200) 
    {
    	alert(xhr.responseText);
    }
}

Le script PHP :

Code :
1
2
3
4
5
6
7
 
<?php
 
sleep(2);
echo 'test';
 
?>
alert(xhr.readyState) me renvoi seulement 4 avec Chrome et seulement 1 avec IE. alert(xhr.status) me renvoie 0....

Une p'tite idée ??

Merci beaucoup d'avance !
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h16   #2
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 269
Points : 7 269
Bonjour,

Citation:
alert(xhr.readyState);
alert(xhr.status)
Au moment de l'alert , le readyState et status pourrait déjà changer. Donc n'utilise pas un alert mais mets ses valeurs dans un div.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h36   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
MERCI beaucoup !!!!!!! :-)

Grâce à toi, j'ai trouvé mon problème !! En fait, la page se rechargeait à chaque fois, car j'avais mis le "onclick" sur un bouton "submit".... Donc, je n'avais jamais le temps de reçevoir la réponse renvoyée par la page PHP.

Ah là là ! Bug de débutant....
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h42   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Pendant qu'on y est, j'ai un autre petit problème. Au lieu de reçevoir du texte, j'aimerais maintenant recevoir de l'XML en retour !

Code :
1
2
3
4
// Création du fichier XML de retour, pour Ajax
header('Content-Type: text/xml; charset: UTF-8'); 
echo '<?xml version="1.0" encoding="UTF-8" ?>\n';
echo '<retour>true</retour>\n';
responseXML me retourne 'null'......

Est-ce un problème du XML mal formaté ? Ou est-ce autre-chose......

Merci d'avance !
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h46   #5
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 269
Points : 7 269
Peut-on voir ton code actuel ?
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h49   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Oui, biensûr !

J'ai uniquement modifié la fonction alert_ajax.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
 
function ajax(action)
{
	// Création de l'objet de requête HTTP
	var xhr;
	if (window.XMLHttpRequest) xhr = new XMLHttpRequest();
	else if (window.ActiveXObject) xhr = new ActiveXObject('Microsoft.XMLHTTP'); 
 
    // Appel de la page traitant le formulaire
    xhr.open('POST', "../web/"+action, true);
 
    // Définition de la fonction qui sera appelée à chaque changement d'état de l'objet xhr.readyState
    xhr.onreadystatechange = function() { alert_ajax(xhr); };
 
    // Affichage de l'image indiquant qu'il faut patienter
    document.getElementById("wait").className="waitActif";
 
    // Envoi des données
    xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    xhr.send('donnee=valeéàéèàéur');
}
 
// Cette fonction est appelée à chaque changement d'état
function alert_ajax(xhr)
{
    if (xhr.readyState == 4 && xhr.status==200) 
    {
    	alert(xhr.responseXML);
    	var docXML = xhr.responseXML;
    	var items = docXML.getElementsByTagName("retour")
 
    	// Désactivation du "sablier" 
    	document.getElementById("wait").className="waitNonActif";
 
    	// Pour chaque élment "retour"
    	for (i=0;i<items.length;i++)
    	{
    		alert (items.item(i).firstChild.data);
    	}
    }
}
alert(xhr.responseXML) me renvoi 'null'....

Et le code XML créé par PHP :

Code :
1
2
3
4
// Création du fichier XML de retour, pour Ajax
header('Content-Type: text/xml; charset: UTF-8'); 
echo '<?xml version="1.0" encoding="UTF-8" ?>\n';
echo '<retour>true</retour>\n';
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 12h11   #7
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 269
Points : 7 269
Je pense bien que tu auras plusieurs nœuds "retour", donc ton structure xml n'est pas correcte. Tu dois avoir un noeud racine.
Essaye avec
Code :
1
2
3
4
5
6
7
8
// Création du fichier XML de retour, pour Ajax
header('Content-Type: text/xml; charset: UTF-8'); 
echo '<?xml version="1.0" encoding="UTF-8" ?>\n';
echo '<xml>';
echo '<retour>true</retour>\n';
echo '<retour>true</retour>\n';
echo '<retour>true</retour>\n';
echo '</xml>';
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 13h52   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Merci pour ta réponse !

J'ai essayé avec ton code XML, mais c'est exactement pareil.....

Avec responseText il me sort bien la chaine XML, mais avec responseXML, il me sort 'null'.......
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h01   #9
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 269
Points : 7 269
Pourquoi tu faits des alert à chaque instant? essaye de virer alert(xhr.responseXML). Ton fichier php est bien encodé en UTF-8 ?

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h15   #10
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Ok, j'ai viré les alert ! Mais c'est pareil ! Pourquoi je les mets ? Ben pour débugger...... Mais tu as raison, je vais utiliser le débogueur de Chrome....

Non, le fichier PHP était codé en Ansi... Je l'ai transformé en UTF-8, mais c'est pareil. Je l'ai remis en Ansi et ai écrit le copde XML de cette façon :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
sleep(1);
 
// Création du fichier XML de retour, pour Ajax
header('Content-Type: text/xml;'); 
echo '<?xml version="1.0" ?>\n';
echo '<xml>\n';
echo '<retour>true</retour>\n';
echo '<retour>true</retour>\n';
echo '<retour>true</retour>\n';
echo '</xml>';
 
?>
C'est toujours pareil ! Par contre, j'ai remarqué qu'avec FireFox, il me sort bien "[object XMLDocument]" au lieu de 'null' pour responseXML. Mais items.length vaut 0.....

Par contre, même problème avec IE qu'avec Chrome....

Problèmes d'encodage ?? Je ne m'y connais malheureusement pas trop......

Merci d'avance !!
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h22   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Voila, c'est bon !!! Tout marche maintenant niquel avec les 3 navigateurs ! Il fallait juste enlever le \n après "<?xml version="1.0" encoding="UTF-8" ?>". C'est le débogueur de Firefox qui m'a aidé !!!

Avec ça, ça marche :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
sleep(1);
 
// Création du fichier XML de retour, pour Ajax
header('Content-Type: text/xml; charset: UTF-8'); 
echo '<?xml version="1.0" encoding="UTF-8" ?>';
echo '<xml>\n';
echo '<retour>true</retour>\n';
echo '<retour>true</retour>\n';
echo '<retour>true</retour>\n';
echo '</xml>';
 
?>
MERCI beaucoup !!!
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h25   #12
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 269
Points : 7 269
1-C'est plus sûr de travailler avec UTF-8, donc encode tes fichiers en UTF-8 sans BOM avec notepad++.
2-Si je ne me trompe pas, les \n ne sont pas interprété dans des echo avec un single quote donc vire les.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h52   #13
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 70
Points : 12
Points : 12
Merci !
rafmos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h51.


 
 
 
 
Partenaires

Hébergement Web