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)

È stato utile?

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 quando readyState   è 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:

     
      
  1. Se lo stato è UNSENT o APERTO ritorno 0 e terminare la procedura.
  2.   
  3. Se il flag di errore è vero ritorno 0 e terminare la procedura.
  4.   
  5. Riportare il codice di stato HTTP.
  6.   

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top