Il W3C spec suggeriscono seguente implementazione: Alcuni semplice codice per fare qualcosa con i dati da un documento XML inverosimile attraverso la rete:È possibile eseguire l'attivazione di XHR onreadystatechange più volte con readyState = DONE?
function processData(data) {
// taking care of data
}
function handler() {
if(this.readyState == this.DONE) {
if(this.status == 200 &&
this.responseXML != null &&
this.responseXML.getElementById('test').textContent) {
// success!
processData(this.responseXML.getElementById('test').textContent);
return;
}
// something went wrong
processData(null);
}
}
var client = new XMLHttpRequest();
client.onreadystatechange = handler;
client.open("GET", "unicorn.xml");
client.send();
È questa implementazione davvero corretto?
Durante il debug ho trovato casi in cui il gestore di eventi readystatechanged viene chiamato più volte di seguito con lo stesso valore di readyState == 4. Suppongo che questo comportamento sia corretto, poiché le specifiche dicono che ogni cambio di stato deve far scattare il evento, e che readyState deve sempre essere uguale allo stato corrente, quindi se molti eventi si accumulano nella coda degli eventi, è abbastanza ovvio che uno riceverà più chiamate con readyState == 4.
http://jsfiddle.net/44b3P/ - questo è il nell'esempio sopra aumentato con la chiamata debugger per sospendere l'esecuzione subito dopo l'invio della richiesta e con alert() nei processData. Dopo aver annullato l'esecuzione, riceverai 3 avvisi.
Questo esempio di w3c sembra essere una copia & incollata in più punti del Web, in particolare OpenSocial sembra gestire gli eventi xhr in questo modo. È corretto?
Proprio come un addendum - utilizzando il codice fornito originariamente, 'this.onreadystatechange = null;' è sufficiente, non è necessario il riferimento originale all'XHR ('client'). – Monchoman45
Non ha funzionato quando ho provato a usare 'delete xhr.onreadystatechange', cambiandolo in' xhr.onreadystatechange = null' ha funzionato bene. –
Ho modificato il codice per usare '= null' invece di' delete' –