Menganalisis dan memanipulasi atribut responsexml
Jika Anda menggunakan XMLHTTPREQUEST untuk mendapatkan konten dokumen XML jarak jauh, properti ResponseXML akan menjadi objek DOM yang diuraikan dari dokumen XML, yang sulit untuk dimanipulasi dan dianalisis. Berikut adalah lima cara utama untuk menganalisis dokumen XML:
1. Gunakan XPath untuk menemukan bagian formulasi dari dokumen.
2. Gunakan JXon untuk mengubahnya menjadi pohon objek JavaScript.
3. Secara manual menguraikan dan membuat serialisasi XML menjadi string atau objek.
4. Gunakan xmlserializer untuk membuat serial pohon DOM menjadi string atau file.
5. Jika Anda tahu konten dokumen XML terlebih dahulu, Anda dapat menggunakan RegExp. Jika Anda terpengaruh oleh Newline saat memindai dengan RegExp, Anda mungkin ingin menghapus semua Newline. Namun, pendekatan ini adalah "last hand" karena jika kode XML sedikit berubah, pendekatan mungkin gagal.
Parse dan memanipulasi properti responsetext yang berisi dokumen HTML
Catatan: HTML diizinkan untuk diuraikan melalui atribut XMLHTTPREQUEST.RESPONSEXML dalam spesifikasi W3C XMLHTTPREQuest. Untuk detail lebih lanjut, silakan baca HTML di XMLHTTPREQUEST.
Jika Anda menggunakan XMLHTTPREQUEST untuk mendapatkan halaman HTML dari ujung jarak jauh, semua tag HTML disimpan dalam properti responsetext sebagai string, sehingga sulit untuk memanipulasi dan menguraikan tag ini. Ada tiga cara utama untuk mengurai tag HTML ini:
1. Gunakan properti xmlhttpRequest.responsexml.
2. Suntikkan konten ke dalam fragmen dokumen melalui fragment.body.innerhtml dan beralih melalui fragmen di DOM.
3. Jika Anda tahu konten dokumen HTML terlebih dahulu, Anda dapat menggunakan RegExp. Jika Anda terpengaruh oleh Newline saat memindai dengan RegExp, Anda mungkin ingin menghapus semua Newline. Namun, pendekatan ini adalah "last hand" karena jika kode HTML sedikit berubah, pendekatan mungkin gagal.
Menangani data biner
Meskipun XMLHTTPREQUEST umumnya digunakan untuk mengirim dan menerima data teks, itu benar -benar dapat mengirim dan menerima konten biner. Ada banyak cara yang teruji dengan baik untuk memaksa data biner untuk dikirim menggunakan XmlHttpRequest. Metode .OverridemimeType () dari XmlHttpRequest adalah solusi, meskipun ini bukan metode standar.
var oreq = new xmlhttpRequest (); oreq.open ("get", url, true); // mengambil data yang tidak diproses sebagai stringoreq biner.overridemimetype ("Teks/polos; charset = x-user-defined");/ *Properti responsetype telah ditambahkan ke spesifikasi XMLHTTPRequest Level 2, membuatnya lebih mudah untuk mengirim dan menerima data biner.
var oreq = new XmlHttPRequest (); oreq.onload = function (e) {var arrayBuffer = xhr.response; // bukan responsetext/ * ... */} oreq.open ("get", url, true); oreq.responsetype = "arrayBuffer"; oreq.send ();Terima data biner menggunakan array tipe JavaScript
Anda dapat mengubah tipe data dari respons yang dikembalikan dari server dengan mengatur properti responsetype dari objek XMLHTTPREQUEST. Nilai atribut yang tersedia adalah string kosong (default), "ArrayBuffer", "Blob", "Document", dan "Text". Nilai atribut respons akan bervariasi tergantung pada nilai properti responsetype, yang mungkin merupakan arraybuffer, gumpalan, dokumen, string, atau nol (jika permintaan tidak selesai atau gagal)
Contoh berikut membaca file gambar biner, dan array bilangan bulat tanpa tanda 8-bit dibuat dari byte asli biner dari file.
var oreq = new xmlhttpRequest (); oreq.open ("get", "/myfile.png", true); oreq.responsetype = "arrayBuffer"; oreq.onload = fungsi (oevent) {var arraybuffer = oreq.response; // Catatan: bukan Oreq.Responsetext if (arrayBuffer) {var bytearray = new UInt8Array (arrayBuffer); untuk (var i = 0; i <bytearray.bytelength; i ++) {// operasi untuk setiap byte dalam array}}}; oreq.send (null);Selain metode di atas, Anda juga dapat menggunakan API Blobbuilder untuk secara langsung menambahkan data ArrayBuffer ke objek Blob. Karena API masih dalam tahap eksperimental, awalan tertentu perlu ditambahkan:
var blobbuilder = window.mozblobbuilder || window.webkitblobbuilder || window.msblobbuilder || window.blobbuilder; var oreq = new xmlHttpRequest (); oreq.open ("get", "/myfile.png", true); oreq.responsetype = "arraybuffer"; oreq.onload function (oevent) {var blobbuilder = blobuilder = oreq.onload = function (oevent) {var blobbuilder = blobuilder = oreq.onload = function (oevent) {var blobbuilder = blobuilder = oreq.onload = function (oEvent) {var blobbuilder = bro); blobbuilder.append (oreq.response); var blob = blobbuilder.getBlob ("gambar/png"); // ...}; oreq.send ();Terima data biner di browser lama
Metode load_binary_resource () berikut ini dapat memuat data biner dari URL yang ditentukan dan mengembalikan data ke penelepon.
function load_binary_resource (url) {var req = new xmlHttpRequest (); req.open (/'get/', url, false); // XHR Binary Charset opt oleh Marcus Granado 2006 [http://mgran.blogspot.com] req.overridemimetype (/'text/polos; charset = x-user-defined/'); req.send (null); if (req.status! = 200) return /' /'; return req.Responsetext;}Operasi yang paling indah adalah di baris kelima, yang menulis ulang tipe MIME default, memaksa browser untuk memperlakukan respons sebagai file teks biasa, menggunakan set karakter yang ditentukan pengguna. Ini memberi tahu browser untuk tidak menguraikan data dan secara langsung mengembalikan bytecode yang belum diproses.
var filestream = load_binary_resource (url); var abyte = filestream.charcodeat (x) & 0xff; // membuang byte bit tinggi (F7)
Contoh di atas memperoleh byte pada x dari data biner yang dikembalikan oleh permintaan. Kisaran offset yang valid adalah 0 ke filestream.length-1.
Lihatlah file unduhan menggunakan XMLHTTPREQUEST untuk detailnya dan lihat file unduhan.
Kirim data biner
Metode Kirim Objek XMLHTTPREQUEST telah ditingkatkan, dan data biner dapat dikirim hanya dengan meneruskan objek arraybuffer, gumpalan, atau file.
Contoh berikut membuat file teks dan mengirim file ke server menggunakan metode POST. Anda juga dapat menggunakan tipe data biner lainnya selain dari file teks.
var oreq = xmlhttpRequest baru (); oreq.open ("post", url, true); oreq.onload = function (oevent) {// Setelah mengunggah selesai.}; var bb = blobbuilder baru (); // awalan yang sesuai diperlukan: window.mozblobbuilder atau window.webkitblobbuilderbb.append (/'abc123/'); oreq.send (bb.getblob (/'text/polos/'));Kirim serangkaian jenis sebagai data biner
Anda dapat mengirim array tipe JavaScript sebagai data biner.
var myArray = ArrayBuffer baru (512); var longInt8view = uint8Array baru (myArray); for (var i = 0; i <longint8view.length; i ++) {longInt8view [i] = i % 255;} var xhr = new xmlhtest; xhr. xhr. " false); xhr.send (myArray);Contoh di atas menciptakan array integer 812-byte 8-bit dan mengirimkannya. Tentu saja, Anda juga dapat mengirim data biner apa pun.
Memantau kemajuan
Pemantauan Acara Kemajuan yang mendukung DOM adalah untuk transmisi XMLHTTPREQUEST dan mengikuti Spesifikasi Acara Kemajuan API Web: Acara ini menerapkan antarmuka ProgressEvent.
var req = new XMLHttpRequest();//Upload listen req.addEventListener("progress", updateProgress, false);req.addEventListener("load", transferComplete, false);req.addEventListener("error", transferFailed, false);req.addEventListener("abort", transferCanceled, false); req.open (...); ... // Kemajuan transfer dari server ke klien (unduhan) function updateProgress (evt) {if (evt.lengthcomputable) {var persentComplete = evt.Loaded/ evt.total; ...} else {// Tidak dapat menghitung informasi kemajuan karena ukuran total tidak diketahui}}Catatan: Anda perlu menambahkan acara mendengarkan sebelum meminta untuk menelepon terbuka (). Kalau tidak, peristiwa kemajuan tidak akan dipicu.
Dalam contoh sebelumnya, acara kemajuan ditentukan untuk diproses oleh fungsi UpdateProgress () dan menerima jumlah total byte yang ditransmisikan total dan sudah ditransmisikan dimuat, yang merupakan panjang keseluruhan (byte) dari data yang dikirimkan dari header "panjang konten". Namun, jika nilai properti panjang yang dapat dikalahkan salah, maka jumlah total byte tidak diketahui dan nilainya adalah 0. Jika panjangnya diketahui, properti panjang yang dapat dikalahkan adalah benar
Acara kemajuan ada dalam transmisi unduhan dan unggah. Acara terkait unduhan dipicu pada objek XMLHTTPREQUEST, seperti contoh di atas. Unggah acara terkait dipicu pada objek xmlhttpRequest.upload, seperti ini:
var req = new xmlHttpRequest (); // Unduh pendengar req.upload.addeventListener ("progress", updateProgress); req.upload.addeventListener ("load", transferComplete); req.uPload.addeventEnter ("kesalahan", transferfleting); REQ. ditransferceled); req.open ();Catatan: Acara Progress tidak valid saat menggunakan file: Protokol.
Gunakan acara LoadEnd untuk mendeteksi ketiga kondisi ujung beban (abort, beban, kesalahan):
req.addeventListener ("LoadEnd", LoadEnd, false);
Perlu dicatat bahwa tidak ada cara untuk mengetahui persis apa kondisi informasi yang diterima oleh acara LoadEnd disebabkan oleh pengakhiran operasi; Namun, Anda dapat menggunakan acara ini untuk menanganinya di akhir semua transmisi.
Objek XMLHTTPREQUEST memicu berbagai jenis acara pada berbagai tahap permintaan, sehingga tidak perlu memeriksa properti ReadyState.
Ketika Send () dipanggil, acara LoadStart tunggal dipicu. Ketika respons server memuat, objek XMLHTTPREQUEST akan mengalami peristiwa kemajuan, biasanya setiap 50 milidetik, sehingga acara ini dapat digunakan untuk memberikan umpan balik kepada pengguna tentang kemajuan permintaan.
Jika permintaan selesai dengan cepat, itu mungkin tidak akan pernah memicu peristiwa kemajuan. Ketika acara selesai, acara muat akan dipicu.
Ada 3 kasus di mana permintaan HTTP tidak dapat diselesaikan, sesuai dengan 3 acara. Jika permintaan waktu, acara batas waktu akan dipicu. Jika permintaan dibatalkan, acara abort akan dipicu. Kesalahan jaringan seperti terlalu banyak pengalihan mencegah permintaan menyelesaikan, tetapi ketika ini terjadi, peristiwa kesalahan dipicu.
Untuk permintaan spesifik apa pun, browser hanya akan memicu salah satu peristiwa beban, dibatalkan, batas waktu, dan kesalahan, serta peristiwa kemajuan.
if (/'onprogress/' in (new XmlHttpRequest ())) {// deteksi apakah peristiwa kemajuan didukung var request = new xmlhttpRequest (); request.onprogress = function (e) {if (e.lengthComputable) {progress.innerHtml = math.round (100* e.Loaded/e.total) +/'%/'; }}}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.