W3C spec Proponuję następujący realizacji: Niektóre prosty kod coś zrobić z danymi z dokumentu XML idącą przez sieć:Czy wyzwalacz XHR może się uruchamiać kilkakrotnie z 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();
Czy ta implementacja naprawdę poprawna?
Podczas debugowania Znalazłem przypadki, gdy readystatechanged obsługi zdarzeń jest wywoływana częściej niż raz z rzędu o tej samej wartości readyState == 4. Myślę, że to zachowanie jest poprawne, jak specyfikacje mówi, że każda zmiana stanu musi odpalić zdarzenie, i to, że parametr readyState musi zawsze być równy bieżącemu, więc jeśli w kolejce zdarzeń pojawi się kilka zdarzeń, jest oczywiste, że jeden otrzyma wiele połączeń z readyState == 4.
http://jsfiddle.net/44b3P/ - to jest powyżej przykład rozszerzony o wywołanie debuggera, aby wstrzymać wykonywanie zaraz po wysłaniu żądania, oraz z alertem() w processData. Po wznowieniu wykonania otrzymasz 3 alerty.
Ten przykład z w3c wydaje się być kopiowany & wklejony w wielu miejscach w Internecie - w szczególności OpenSocial wydaje się obsługiwać zdarzenia XHR w ten sposób. Czy to jest poprawne?
Podobnie jak dodatek - przy użyciu pierwotnie podanego kodu, 'this.onreadystatechange = null;' jest wystarczające, nie potrzebujesz oryginalnego odniesienia do XHR ('client'). – Monchoman45
Nie działało, gdy próbowałem używać 'delete xhr.onreadystatechange', zmiana na' xhr.onreadystatechange = null' działała dobrze. –
Edytowałem kod, aby użyć '= null' zamiast' delete' –