Perché IE non visualizza questo alert ()?
-
20-09-2019 - |
Domanda
Ho il seguente pezzo di codice:
// 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);
Questo funziona bene in Chrome, ma IE non funziona, sputando un "errore non specificato". e che punti alla linea con l'allarme () in esso. Perché non può visualizzare l'avviso?
Edit: Ok, dopo aver chiudere la finestra di errore, mi vengono i tre avvisi come previsto ....
Edit: Ora è davvero sempre strano. Se cambio
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
a
alert('pageRequest.readyState: ' + pageRequest.readyState);
allora funziona e ottengo 5 avvisi. (1,1,2,3,4)
Soluzione
Stato è la risposta HTTP le prime due volte il metodo viene chiamato a tornare 1 e 1 come readyState. readyState 1 significa "L'oggetto è stato creato, ma l'invio metodo non è stato chiamato. ". A quel tempo non v'è alcuna risposta di stato dal server in quanto non ha ricevuto alcuna richiesta quindi utilizzando stato in vostro avviso ti ha dato un errore.
Altri suggerimenti
Chrome 4 genera un errore troppo (INVALID_STATE_ERR: DOM Exception 11). Vedrete l'errore se si apre il Javascript Console Chrome.
Firefox 3.6 solleva anche un errore, ma sembra scartare silenziosamente (non è visibile nel Error Console). Se si avvolge la funzione in un blocco try..catch
verrà visualizzato il messaggio di errore (Component restituito il codice di errore: 0x80040111 (NS_ERROR_NOT_AVAILABLE)):
pageRequest.onreadystatechange = function() {
try {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
catch (e) {
alert(e);
}
}
Il primo due volte onreadystatechange
viene richiamato in Internet Explorer, è readyState
1 (APERTO). In questo stato, la richiesta viene inviata, ma la risposta non è ancora stato ricevuto. L'errore viene generato quando si chiama la proprietà status
in questo readyState
perché non c'è risposta HTTP per leggere lo stato da.
Questo comportamento è compatibile con le vecchie versioni del W3C XMLHttpRequest specifica , in cui si afferma:
Se l'attributo non è
status
disponibili DEVE sollevare un'eccezione. Essa deve essere disponibile quandoreadyState
è 3 (ricezione) o 4 (a pieno carico). quando disponibili, deve rappresentare l'HTTP codice di stato (tipicamente 200 per un connessione riuscita).Eccezioni sul recupero
DOMException
INVALID_STATE_ERR
dovrebbe essere sollevata se questo attributo si accede quando readyState ha un valore non appropriato.
Le versioni più recenti della specifica, tuttavia, affermano che status
deve sempre restituire un valore:
L'attributo
status
deve restituire il risultato dell'esecuzione di questi passaggi:
- Se lo stato è UNSENT o APERTO ritorno 0 e terminare la procedura.
- Se il flag di errore è vero ritorno 0 e terminare la procedura.
- Riportare il codice di stato HTTP.
Credo di avere un problema di concatenazione di stringhe, in sede di valutazione PageRequest.status (che è un numero intero). Basta provare questo:
status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);