2010-03-15 13 views
2

je le morceau de code suivant:Pourquoi IE n'affiche-t-il pas cette alerte()?

// 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 vers la ligne avec l'alerte() dedans. Pourquoi ne peut-il pas 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)

+0

Êtes-vous sûr que pageRequest est construit correctement? Si vous l'exécutez localement, IE refuse l'utilisation d'ActiveX aux pages locales par défaut. –

+0

Je l'utilise sur mon serveur Web local. –

+1

Vous pourriez supporter un; après votre}. Peut-être que c'est lié. –

Répondre

1

L'état est la réponse HTTP les deux premières fois que la méthode est appelée, vous récupérez 1 et 1 en tant que readyState. readyState 1 signifie "The object has been created, but the send method has not been called.". À ce moment-là, il n'y a pas de réponse d'état du serveur car il n'a reçu aucune demande. Par conséquent, l'utilisation du statut dans votre alerte vous a donné une erreur. Chrome 4 génère également une erreur (INVALID_STATE_ERR: DOM Exception 11)

+0

Merci d'expliquer enfin pourquoi cette alerte génère des erreurs. Je me demande pourquoi cela fonctionne dans Chrome et FF ... –

+3

[Hors-sujet] A été légèrement déçu de voir l'avatar Paper Clippy sans avoir la réponse commence par "On dirait que vous essayez de ..." :( – akamike

+0

Deep down Tout le monde aime Clippy. (OK, très bas) – Adam

1

Vous verrez l'erreur si vous ouvrez la console JavaScript Chrome. Firefox 3.6 génère également une erreur, mais semble la rejeter silencieusement (elle n'est pas visible dans la console d'erreur). Si vous enveloppez la fonction dans un bloc 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 appelé dans Internet Explorer, readyState est 1 (OpenED). Dans cet état, la demande est envoyée, mais la réponse n'a pas encore été reçue. L'erreur est déclenchée lors de l'appel de la propriété status dans ce readyState car il n'y a pas de réponse HTTP à partir de laquelle lire l'état.

Ce comportement est compatible avec les anciennes versions du W3C XMLHttpRequest specification, quel état:

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é). Lorsque disponible, il DOIT représenter le code d'état HTTP (généralement 200 pour une connexion réussie ).

Exceptions à l'utilisation

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

Newer versions de la spécification, cependant état que 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 UNSENT ou OPENED renvoie 0 et termine ces étapes.
  2. Si l'indicateur d'erreur est vrai, renvoyez 0 et terminez ces étapes.
  3. Renvoie le code d'état HTTP.
+0

Bon, j'ai oublié la console d'erreur de Chrome, mais aussi les erreurs de modification des en-têtes, donc j'ai simplement ignoré la console, mon mauvais –

0

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); 
+0

not, faire de même avec readyState – Sergi

+1

Ceci n'est pas lié à la concaténation de chaînes Le résultat de 'string + integer' est de convertir' integer' en une chaîne, puis de le concaténer.En outre, Javascript ne nécessite pas d'échappement pour les lignes de continuation La barre oblique inverse à la fin de votre troisième ligne entraîne une erreur de syntaxe (caractère non valide). –