Frage

Ich habe das folgende Stück Code:

// 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);

Dies funktioniert in Chrome, aber IE Drosseln Sie darauf spuckt einen „Fehler nicht angab.“ und es zeigt auf die Zeile mit der alert () darin. Warum kann es nicht die Warnung angezeigt werden?

Edit: Okay, nachdem ich den Fehler Dialogfeld schließen, ich die drei Benachrichtigungen erhalten, wie erwartet ....

Edit: Jetzt ist es wirklich seltsam zu bekommen. Wenn ich ändern

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

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

dann funktioniert es und ich 5 Warnungen. (1,1,2,3,4)

War es hilfreich?

Lösung

Status ist die HTTP-Antwort die ersten beiden Male die Methode, die Sie wieder 1 und 1 als Readystate genannt wird. Readystate 1 bedeutet "das Objekt erstellt wurde, aber die Sende Methode nicht aufgerufen wurde. ". Zu diesem Zeitpunkt gibt es keine Status Antwort vom Server, da es keine Anfragen erhalten hat deshalb in Ihrer Warnung gab einen Fehler mit Status.

Andere Tipps

Chrome 4 löst einen Fehler zu (INVALID_STATE_ERR: DOM Exception 11). Sie werden die Fehler sehen, ob Sie die Chrome JavaScript-Konsole öffnen.

Firefox 3.6 wirft auch einen Fehler, aber scheint still zu verwerfen (es ist in dem Fehler nicht sichtbar ist Console). Wenn Sie die Funktion in einem try..catch Block wickeln wird die Fehlermeldung angezeigt wird (Komponente zurückgegeben Fehlercode: 0x80040111 (NS_ERROR_NOT_AVAILABLE)):

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

Die ersten beiden Male onreadystatechange in Internet Explorer aufgerufen wird, readyState 1 (GEÖFFNET). In diesem Zustand wird die Anfrage gesendet, aber die Antwort noch nicht empfangen worden ist. Der Fehler wird ausgelöst, wenn die status Eigenschaft in diesem readyState Aufruf, weil es keine HTTP-Antwort ist von dem Status zu lesen.

Dieses Verhalten ist kompatibel mit älteren Versionen des W3C XMLHttpRequest Spezifikation , die besagen:

  

Wenn das status Attribut nicht ist   verfügbar es muss eine Ausnahme ausgelöst.   Es muss verfügbar sein, wenn readyState   3 (Empfangen) oder 4 (geladen). Wann   zur Verfügung, es muss die HTTP repräsentieren   Statuscode (in der Regel 200 für ein   erfolgreiche Verbindung).

     

Ausnahmen auf Wieder

     

DOMException INVALID_STATE_ERR sollte erhöht werden, wenn dieses Attribut zugegriffen wird   wenn Readystate hat einen ungeeigneten Wert.

Neuere Versionen die Spezifikation jedoch fest, dass status muss immer einen Wert zurückgeben:

  

Das status Attribut muss die Rückkehr   führen diese Schritte ausgeführt werden:

     
      
  1. Wenn der Zustand UNSENT oder GEÖFFNET return 0 und diese Schritte beenden.
  2.   
  3. Wenn der Fehler-Flag gilt return 0 und diese Schritte beenden.
  4.   
  5. Bringen Sie den HTTP-Statuscode.
  6.   

Ich glaube, Sie ein String-Verkettung Problem haben, bei der Bewertung PageRequest.status (das ist eine ganze Zahl). Probieren Sie dies:

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top