2013-02-18 12 views
38

Ho bisogno di supportare i principali browser moderni solo (IE10 +, FF, Chrome, Safari)Si può sostituire xhr.onreadystatechange con xhr.onload per le chiamate AJAX?

Posso fare questa sostituzione come voglio semplificare la mia base di codice:

Da:

xhr.onreadystatechange = function() { 
    if (this.readyState === 4) { 
     if (this.status === 200) { 
      o.callback(xhr.responseText); 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 
}; 

A:

xhr.onload = function (test) { 
    o.callback(xhr.responseText); 
}; 

Non credo che lo MDN documentation sia chiaro a questo riguardo.

Chiarimento:

ho scelto di non usare un quadro.

+1

Dal momento che sono essi sono funzionalmente equivalenti in quanto non si fa nulla, se la richiesta non riesce. – Musa

+10

@ elias94xx "Provarlo" non è fattibile in questo caso. Uno dovrebbe provarlo su tutte le versioni di tutti i principali browser, e non ci sarebbe ancora nessun supporto garantito. Inoltre alcuni browser potrebbero non supportare effettivamente le specifiche che sostengono di supportare, quindi anche la ricerca potrebbe non essere ragionevole. –

+3

possibile duplicato di [È onload uguale a readyState == 4 in XMLHttpRequest?] (Http://stackoverflow.com/questions/9181090/is-onload-equal-to-readystate-4-in-xmlhttprequest) – olibre

risposta

14

forse dai uno sguardo a this one e uno sguardo a W3C: XMLHttpRequest è lo stesso se il tuo browser supporta xhr.onload. Richiede XMLHttpRequest 2)

È anche possibile scrivere una funzione di wrapping che emula xhr.onload se non è presente. (penso che sia necessario ignorare lo XMLHttpRequest.prototype.onload = function(args){//calling onreadystatechanges somehow}). Se si supportano solo i browser moderni che utilizzano xhr.onload dovrebbe essere disponibile -. La soluzione migliore sta usando una quadro (come o che fornisce funzionalità per il confezionamento che

+6

xhr2 è supportato da IE10 + e, naturalmente, l'altro 3. http://caniuse.com/#search=xhr2 –

+1

Aggiornamento: è 2017 - I quadri sono opzionali ora che ES6 esiste> _ < – ChristoKiwi

12

Nella documentazione MDN che affermare quanto segue

Eventi

onreadystatechange come una proprietà sull'oggetto XHR è supportato in tutti i browser .

Da allora, un numero di gestori di eventi aggiuntivi sono stati implementati nei vari browser (onload, onerror, onprogress, ecc.). Questi sono supportati in Firefox. In particolare, vedere nsIXMLHttpRequestEventTarget e Uso di XMLHttpRequest.

più recenti browser, tra cui Firefox, supportano anche ascoltando i eventi XMLHttpRequest tramite API addEventListener standard, oltre a fissare sulla * oggetti da una funzione del gestore.

Quindi penso che si possa presumere che onreadystatechange è la strada da percorrere e onload è un'aggiunta che può essere utilizzata se il browser lo supporta. La risposta di @ mr.VVoo è quella corretta, per rimanere in w3c in caso di dubbio.

-1

Dal momento che il richiedente originale ha dichiarato: "Ho bisogno di sostenere importante solo browser moderni (IE10 +, FF, Chrome, Safari) "è ovvio che onload, onerror, ecc. sono le strade da percorrere. Inoltre, ad oggi, onreadystatechange è praticamente obsoleto, poiché ovviamente non supporterai nulla vecchio che supporta solo onreadystatechange.

Per riassumere, dimenticare onreadystatechange.

1

È possibile ripulire il primo esempio in questo modo

xhr.onreadystatechange = function() { 
    if (this.readyState === 4 && this.status === 200) { 
     o.callback(xhr.responseText); 
    } else { 
     return false; 
    } 
}; 

nota, probabilmente desidera controllare onload troppo con this.status === 200 se si sta facendo qualcosa con l'istruzione else. Anche se, se si sta verificando per errori, c'è anche onerror, che si può scrivere qualcosa di simile

xhr.onerror = function(){ 
    console.log('Error: Do something else...'); 
} 
Problemi correlati