Pourquoi pas IE affiche cette alerte ()?
-
20-09-2019 - |
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)
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 lorsquereadyState
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:
- Si l'état est le retour UNSENT ou d'ouverture 0 et mettre fin à ces étapes.
- Si l'indicateur d'erreur est vrai retour 0 et terminer ces étapes.
- Retourne le code d'état HTTP.
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);