110 votes

XMLHttpRequest état 0 (responseText est vide)

Ne peut pas obtenir les données avec XMLHttpRequest (état 0 et responseText est vide):

xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true);
xmlhttp.onreadystatechange=function() 
{
if(xmlhttp.readyState==4)
 alert("le statut" + xmlhttp.statut);
}
xmlhttp.send();

Il avertit "état 0".

La même situation avec le localhost demande (cd_catalog.xml est enregistré en tant que fichier local)

xmlhttp.open("GET","http://localhost/cd_catalog.xml", true);

Mais avec l'IP localhost demande

xmlhttp.open("GET","http://127.0.0.1/cd_catalog.xml", true);

et avec le fichier local demande

xmlhttp.open("GET","cd_catalog.xml", true);

tout est OK (200)

Ce qui peut provoquer le problème (statut=0) avec la demande en ligne?

PS: Live HTTP Headers montre que tout est OK dans tous les 4 cas:

 HTTP/1.1 200 OK
 Content-Length: 4742

PS2: Apache serveur web local sur VMWare (hôte OS Win7, le Guest OS Ubuntu, adaptateur Réseau – NAT). Le Navigateur Firefox.

58voto

Abhishek_8 Points 1

le statut est 0 lorsque votre fichier html contenant le script est ouvert dans le navigateur via le fichier de protocole.Assurez-vous de placer les fichiers sur votre serveur(apache ou tomcat quoi que ce soit) et ensuite de l'ouvrir via le protocole http dans le navigateur.(c'est à dire http://localhost/myfile.html) C'est la solution.

33voto

Slammer Points 81

Si vous êtes en train de faire localhost développement, vous pouvez faire de la croix-domaine appels - je le fais tout le temps.

Pour Firefox, vous devez l'activer dans les paramètres de configuration de votre

signed.applets.codebase_principal_support = true

Puis ajouter quelque chose comme ceci à votre XHR code ouvert:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

Pour IE, si je me souviens bien, tout ce que vous avez à faire est d'activer le navigateur du paramètre de Sécurité dans l'onglet "Divers → Accès aux sources de données dans les domaines" de l'obtenir pour fonctionner avec ActiveX XHRs.

IE8 et plus également ajouté de la croix-domaine des capacités pour le natif les objets XmlHttpRequest, mais je n'ai pas joué avec les enfants.

26voto

dyuan Points 61

En fait assurez-vous que votre type de bouton est pas le Bouton Soumettre, qui faisait état de conflit où j'ai rencontré récemment.

22voto

Alex Robinson Points 111

Si le serveur répond à une méthode GET et POST (celui que vous utilisez) avec un en-tête comme:

Access-Control-Allow-Origin: *

Il pourrait fonctionner. Semble dans FireFox 3.5 et rekonq 0.4.0. Apparemment, avec cet en-tête et la réponse initiale aux OPTIONS, le serveur est en train de dire au navigateur, "Aller de l'avant et de laisser cette demande de domaines."

-4voto

Gaël Points 752

Edit: Veuillez lire Malvolio les commentaires ci-dessous que cette réponse est la connaissance est obsolète.

Vous ne pouvez pas faire XMLHttpRequests entre les domaines.

L'appel à l' 127.0.0.1 fonctionne parce que votre page de test est situé à la 127.0.0.1, et le local de test fonctionne aussi depuis, et bien... c'est un test local.

Les deux autres tests échouent parce que le JavaScript ne peut pas communiquer avec un serveur distant via XMLHttpRequest.

Vous devriez plutôt envisager:

  • XMLHttp-demande de votre propre serveur pour récupérer votre télécommande contenu XML pour vous (script php, par exemple)
  • Essayez d'utiliser un service comme GoogleAppEngine si vous voulez le garder en full JavaScript.

Espère que ça aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X