¿Por qué no se muestra esta alerta IE ()?
-
20-09-2019 - |
Pregunta
Tengo el siguiente fragmento de código:
// 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);
Esto funciona bien en Chrome, pero IE ahoga en él, escupiendo un "error no especificado." y apunta a la línea con la alerta () en ella. Por qué no puede mostrar la alerta?
Edit: Bueno, después de cerrar el diálogo de error, consigo las tres alertas como se esperaba ....
Edit: Ahora que es realmente raro conseguir. Si cambio
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
a
alert('pageRequest.readyState: ' + pageRequest.readyState);
entonces funciona y me da 5 alertas. (1,1,2,3,4)
Solución
Estado es la respuesta HTTP las dos primeras veces se llama al método que vuelvas 1 y 1 como el readyState. readyState 1 significa "El objeto se ha creado, pero el envío método no ha sido llamado. ". En ese momento no hay respuesta de estado del servidor, ya que no ha recibido ninguna solicitud por lo tanto, el uso de estado en su alerta que dio un error.
Otros consejos
Chrome 4 genera un error demasiado (INVALID_STATE_ERR: DOM Excepción 11). Usted verá el error si se abre la consola de Javascript Chrome.
Firefox 3.6 también genera un error, pero parece desprenderse que en silencio (no es visible en la Consola de errores). Si se coloca la función en un bloque try..catch
verá el mensaje de error (Componente devolvió el código de error: 0x80040111 (NS_ERROR_NOT_AVAILABLE)):
pageRequest.onreadystatechange = function() {
try {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
catch (e) {
alert(e);
}
}
El primero dos veces onreadystatechange
se invoca en Internet Explorer, readyState
se 1 (abierto). En este estado, la solicitud se envía, pero la respuesta aún no se ha recibido. se eleva el error cuando se llama a la propiedad status
en este readyState
porque no hay una respuesta HTTP para leer el estado de.
Este comportamiento es compatible con las versiones anteriores de la W3C XMLHttpRequest especificación , que estado:
Si el atributo no es
status
disposición que deberá elevar una excepción. Debe estar disponible cuandoreadyState
se 3 (Recibir) o 4 (cargado). Cuando disponible, se debe representar la HTTP código de estado (típicamente 200 para una conexión con éxito).Excepciones en la recuperación
INVALID_STATE_ERR
DOMException debe elevarse si se accede a este atributo cuando readyState tiene un valor apropiado.
Las versiones más recientes de la especificación, sin embargo, el estado que status
siempre debe devolver un valor:
El atributo debe devolver el
status
resultado de ejecutar estos pasos:
- Si el estado es ENVIADO o abierto de retorno 0 y terminar estos pasos.
- Si el indicador de error es verdadero retorno 0 y terminar estos pasos.
- Vuelta el código de estado HTTP.
Creo que tienes un problema de concatenación de cadenas, al evaluar PageRequest.status (que es un entero). Intenta esto:
status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);