Saya bingung tentang event pengembalian xhr, seperti yang saya tahu, tidak banyak perbedaan antara onreadystatechange -> readyState == 4 dan onload, apakah itu benar?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
atau
xhr.onload = function() { /* do something */ }
javascript
ajax
xmlhttprequest
Huang
sumber
sumber
Jawaban:
Seharusnya sama saja.
onload
telah ditambahkan di XMLHttpRequest 2 sedangkanonreadystatechange
telah ada sejak spesifikasi aslinya.sumber
Ini hampir selalu benar. Satu perbedaan yang signifikan, bagaimanapun, adalah bahwa
onreadystatechange
pengendali kejadian juga dipicureadyState==4
dalam kasus di manaonerror
pengendali biasanya dipicu (biasanya masalah konektivitas jaringan). Ini mendapat status 0 dalam kasus ini. Saya telah memverifikasi ini terjadi di Chrome, Firefox, dan IE terbaru.Jadi, jika Anda menggunakan
onerror
dan menargetkan browser modern, Anda tidak boleh menggunakanonreadystatechange
tetapi harus menggunakanonload
, yang tampaknya dijamin hanya akan dipanggil ketika permintaan HTTP berhasil diselesaikan (dengan respons nyata dan kode status). Jika tidak, Anda mungkin akan mendapatkan dua event handler yang dipicu jika terjadi kesalahan (begitulah cara saya menemukan secara empiris tentang kasus khusus ini.)Berikut ini tautan ke program uji Plunker yang saya tulis yang memungkinkan Anda menguji URL yang berbeda dan melihat urutan kejadian dan
readyState
nilai yang sebenarnya seperti yang terlihat oleh aplikasi JavaScript dalam berbagai kasus. Kode JS juga tercantum di bawah ini:sumber
onload
,readyState === 4
dijamin benar kan?readyState
4 kasuserror
atauabort
kasus juga. Keadaan ini pada dasarnya berarti proses pemuatan telah selesai, apakah berhasil atau tidak. Untuk pemuatan normal dan berhasil, urutan kejadian terakhir adalah:progress
(dengan semua data dimuat),readystatechange
(denganreadyState == 4
)load
,,loadend
.onload
juga tidak akan memicu ifNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
pawang.Tidak, mereka tidak sama. Jika Anda mengalami kesalahan jaringan atau membatalkan operasi,
onload
tidak akan dipanggil. Sebenarnya, acara terdekatreadyState === 4
adalahloadend
. Alurnya terlihat seperti ini:sumber