Question

Je le morceau de code suivant:

// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest)     pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");

// callback
pageRequest.onreadystatechange = function() {

    alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);
}

pageRequest.open('POST','ajax.php',true);

// q_str contains something like 'data=value...'

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");

pageRequest.send(q_str);

Cela fonctionne bien dans Chrome, mais IE selfs sur elle, crachant une « erreur non spécifiée ». et il pointe à la ligne avec l'alerte () en elle. Pourquoi ne peut-il afficher l'alerte?

Edit: D'accord, après que je rejette la boîte de dialogue d'erreur, je reçois trois alertes comme prévu ....

Edit: Maintenant, il est vraiment obtenir bizarre. Si je change

alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);

à

alert('pageRequest.readyState: ' + pageRequest.readyState);

il fonctionne et je reçois 5 alertes. (1,1,2,3,4)

Était-ce utile?

La solution

État est la réponse HTTP les deux premières fois la méthode est appelée vous rentrerez 1 et 1 comme readyState. readyState 1 signifie "L'objet a été créé, mais l'envoi méthode n'a pas été appelé. ". A cette époque, il n'y a pas de réponse d'état du serveur car il n'a pas reçu de demandes en utilisant donc le statut de votre alerte vous a donné une erreur.

Autres conseils

4 Chrome génère une erreur trop (INVALID_STATE_ERR: Exception DOM 11). Vous verrez l'erreur si vous ouvrez le Javascript Chrome Console.

Firefox 3.6 soulève également une erreur, mais semble se défaire en silence (ce n'est pas visible dans la console d'erreur). Si vous enveloppez la fonction dans un bloc de try..catch vous verrez le message d'erreur (composant a renvoyé le code d'échec: 0x80040111 (NS_ERROR_NOT_AVAILABLE)):

pageRequest.onreadystatechange = function() {
  try {
    alert('pageRequest.readyState: ' + pageRequest.readyState
          + '\npageRequest.status: ' + pageRequest.status);
  }
  catch (e) { 
    alert(e); 
  }
}

Les deux premières fois onreadystatechange est invoquée dans Internet Explorer, readyState est 1 (ouvert). Dans cet état, la demande est envoyée, mais la réponse n'a pas encore été reçu. L'erreur est soulevée lors de l'appel de la propriété status dans ce readyState parce qu'il n'y a pas de réponse HTTP pour lire l'état de.

Ce comportement est compatible avec les anciennes versions du W3C spécification XMLHttpRequest , qui stipulent:

  

Si l'attribut status n'est pas   disponible, il doit soulever une exception.   Il doit être disponible lorsque readyState   est 3 (réception) ou 4 (chargé). Quand   disponible, il doit représenter le HTTP   code d'état (typiquement 200 pour un   connexion réussie).

     

Exceptions sur la récupération

     

INVALID_STATE_ERR DOMException DEVRAIT être élevé si cet attribut est accessible   lorsque readyState a une valeur inappropriée.

versions plus récentes de la spécification, cependant, que l'état status doit toujours retourner une valeur:

  

L'attribut status doit retourner le   résultat de l'exécution de ces étapes:

     
      
  1. Si l'état est le retour UNSENT ou d'ouverture 0 et mettre fin à ces étapes.
  2.   
  3. Si l'indicateur d'erreur est vrai retour 0 et terminer ces étapes.
  4.   
  5. Retourne le code d'état HTTP.
  6.   

Je pense que vous avez un problème de concaténation de chaîne, lors de l'évaluation PageRequest.status (qui est un entier). Essayez ceci:

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top