Rumah >hujung hadapan web >tutorial js >Panduan untuk vanila ajax tanpa jQuery
di sini, kami membuat contoh kelas yang diperlukan untuk membuat permintaan HTTP ke pelayan. Kami kemudian memanggil kaedah terbuka, menyatakan kaedah permintaan HTTP sebagai parameter pertama dan URL halaman yang kami minta sebagai yang kedua. Akhirnya, kami memanggil kaedah hantarnya melewati null sebagai parameter. Sekiranya pasca permintaan (di sini kami menggunakan GET), parameter ini harus mengandungi sebarang data yang ingin kami hantar dengan permintaan.
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);Dan ini adalah bagaimana kita akan berurusan dengan respons dari pelayan:
OnreadyStatechange adalah asynchronous, yang bermaksud ia akan dipanggil pada bila -bila masa. Jenis -jenis fungsi ini adalah panggilan balik - yang dipanggil sekali beberapa pemprosesan selesai. Dalam kes ini, pemprosesan sedang berlaku di pelayan.
xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } };Bagi mereka yang ingin mengetahui lebih lanjut mengenai asas -asas Ajax, rangkaian MDN mempunyai panduan yang baik.
untuk jQuery atau tidak untuk jQuery?
Jadi, berita baiknya ialah kod di atas akan berfungsi di semua pelayar utama terkini. Berita buruk itu, baiklah, ia agak rumit. Yuck! Saya sudah mencabut penyelesaian yang elegan.
yang bagus. Dan sememangnya bagi ramai, termasuk anda benar -benar, jQuery telah menjadi standard de facto ketika datang ke Ajax. Tetapi, adakah anda tahu apa? Ini tidak perlu berlaku. JQuery wujud untuk mengelilingi API Dom yang hodoh. Tetapi, adakah ia benar -benar
itu$.ajax({ url: 'send-ajax-data.php', }) .done(function(res) { console.log(res); }) .fail(function(err) { console.log('Error: ' + err.status); });hodoh? Atau tidak dapat difahami?
Dalam baki artikel ini, saya ingin menyiasat penambahbaikan yang dibuat kepada AJAX API dalam vanila JavaScript. Keseluruhan spesifikasi boleh didapati di W3C. Apa yang menyerang saya mengenai spesifikasi ini adalah nama. Ia tidak lagi "XMLHTTPREQUEST LEVEL 2" tetapi "XMLHTTPREQUEST LEVEL 1" - hasil penggabungan 2011 antara kedua -dua spesifikasi. Melangkah ke hadapan, ia akan diperlakukan sebagai entiti tunggal dari perspektif piawaian dan standard hidup akan dipanggil XMLHTTPREQUEST. Ini menunjukkan bahawa terdapat komitmen oleh masyarakat untuk berpegang pada satu standard, dan ini hanya boleh bermakna berita baik bagi pemaju yang ingin membebaskan diri dari jQuery.
jadi mari mulakan ...
Untuk artikel ini, saya menggunakan node.js di back-end. Ya, akan ada JavaScript pada penyemak imbas dan pada pelayan. Back-end node.js adalah bersandar, saya menggalakkan anda untuk memuat turun keseluruhan demo di GitHub dan ikuti. Berikut adalah daging dan kentang apa yang ada di pelayan:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);
ini memeriksa URL permintaan untuk menentukan bagaimana aplikasi harus bertindak balas. Jika permintaan itu datang dari direktori skrip, maka fail yang sesuai disampaikan dengan jenis kandungan aplikasi/javascript. Jika tidak, jika permintaan X-diminta-dengan tajuk telah ditetapkan ke XMLHTTPREQUEST maka kami tahu kami berurusan dengan permintaan AJAX dan kami boleh bertindak balas dengan sewajarnya. Dan jika kedua -dua ini tidak berlaku, paparan fail/index.html dihidangkan.
Saya akan memperluaskan bahagian yang dikomentari ketika kami menyelam ke dalam respons AJAX dari pelayan. Di Node.js, saya terpaksa melakukan pengangkat berat dengan render dan httphandler:
xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } };
fungsi render secara tidak semestinya membaca kandungan fail yang diminta. Ia diluluskan rujukan kepada fungsi httphandler, yang kemudiannya dilaksanakan sebagai panggilan balik. Fungsi httphandler memeriksa untuk kehadiran objek ralat (yang akan hadir, sebagai contoh, jika fail yang diminta tidak dapat dibuka). Menyediakan segala -galanya baik, ia kemudian melayani kandungan fail dengan kod status HTTP dan jenis kandungan yang sesuai.
Seperti dengan API back-end bunyi, mari kita tulis beberapa ujian unit untuk memastikan ia berfungsi. Untuk ujian ini, saya menyeru Supertest dan Mocha untuk mendapatkan bantuan:
$.ajax({ url: 'send-ajax-data.php', }) .done(function(res) { console.log(res); }) .fail(function(err) { console.log('Error: ' + err.status); });
Ini memastikan bahawa aplikasi kami bertindak balas dengan jenis kandungan yang betul dan kod status HTTP kepada permintaan yang berbeza. Sebaik sahaja anda memasang kebergantungan, anda boleh menjalankan ujian ini dari arahan menggunakan ujian npm.
Sekarang, mari kita lihat antara muka pengguna yang kami bina di HTML:
// app.js var app = http.createServer(function (req, res) { if (req.url.indexOf('/scripts/') >= 0) { render(req.url.slice(1), 'application/javascript', httpHandler); } else if (req.headers['x-requested-with'] === 'XMLHttpRequest') { // Send Ajax response } else { render('views/index.html', 'text/html', httpHandler); } });
HTML kelihatan bagus dan kemas. Seperti yang anda lihat, semua kegembiraan sedang berlaku dalam JavaScript.
Jika anda pergi melalui mana -mana buku Ajax kanonik, anda mungkin dapati di mana -mana sahaja. Fungsi panggil balik ini dilengkapi dengan IF bersarang dan banyak bulu yang menjadikannya sukar untuk diingat dari bahagian atas kepala anda. Mari letakkan acara onreadystate dan onload kepala ke kepala.
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);
ini adalah output dalam konsol:
berjaya . Oleh itu, acara Onload adalah API moden yang boleh digunakan dengan baik dalam beberapa saat. Acara OnreadyState ada untuk menjadi serasi ke belakang. Tetapi, acara onload mestilah alat pilihan anda. Acara Onload kelihatan seperti panggilan balik kejayaan pada jQuery, bukan?
Sudah tiba masanya untuk menetapkan dumbbells 5 lb dan beralih ke keriting lengan.Menetapkan Headers Permintaan
xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } };Dengan ini, kita boleh melakukan cek di node.js:
$.ajax({ url: 'send-ajax-data.php', }) .done(function(res) { console.log(res); }) .fail(function(err) { console.log('Error: ' + err.status); });Seperti yang anda lihat, Vanilla Ajax adalah API front-end yang fleksibel dan moden. Terdapat satu tan idea yang anda boleh gunakan tajuk permintaan untuk, dan salah satu daripada mereka adalah versi. Jadi sebagai contoh, katakan saya ingin menyokong lebih daripada satu versi API web ini. Ini berguna apabila saya tidak mahu memecahkan URL dan sebaliknya menyediakan mekanisme di mana pelanggan boleh memilih versi yang mereka mahu. Kami boleh menetapkan header permintaan seperti:
// app.js var app = http.createServer(function (req, res) { if (req.url.indexOf('/scripts/') >= 0) { render(req.url.slice(1), 'application/javascript', httpHandler); } else if (req.headers['x-requested-with'] === 'XMLHttpRequest') { // Send Ajax response } else { render('views/index.html', 'text/html', httpHandler); } });dan di belakang, cuba:
// app.js function render(path, contentType, fn) { fs.readFile(__dirname + '/' + path, 'utf-8', function (err, str) { fn(err, str, contentType); }); } var httpHandler = function (err, str, contentType) { if (err) { res.writeHead(500, {'Content-Type': 'text/plain'}); res.end('An error has occured: ' + err.message); } else { res.writeHead(200, {'Content-Type': contentType}); res.end(str); } };node.js memberi anda objek tajuk yang boleh anda gunakan untuk memeriksa tajuk permintaan. Satu -satunya helah ialah membacanya dengan huruf kecil.
Kami berada di rumah dan tidak melanggar peluh! Anda mungkin tertanya -tanya, apa lagi yang ada untuk mengetahui tentang Ajax? Bagaimana dengan beberapa helah yang kemas.
Jenis Respons
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);
Awesome, bukannya menghantar teks biasa yang saya harus menghuraikan JSON, saya dapat memberitahu API apa yang diharapkan. Ciri ini tersedia di hampir semua pelayar utama terkini. JQuery, tentu saja, apakah jenis penukaran ini secara automatik. Tetapi tidakkah kita sekarang mempunyai cara yang mudah untuk melakukan perkara yang sama di JavaScript biasa? Vanilla Ajax mempunyai sokongan untuk banyak jenis tindak balas lain, termasuk XML.
Sayangnya, di Internet Explorer cerita itu tidak begitu hebat. Sehingga IE 11, pasukan belum menambah sokongan untuk XHR.ResponseType = 'JSON'. Ciri ini adalah untuk tiba di Microsoft Edge. Tetapi, pepijat telah cemerlang selama hampir dua tahun pada masa penulisan. Saya rasa adalah orang -orang di Microsoft telah bekerja keras untuk merombak penyemak imbas. Mari kita berharap Microsoft Edge, AKA Project Spartan, menyampaikan janji -janjinya.
Alas, jika anda mesti mendapatkan isu ini iaitu:
xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } };
Satu penyemak imbas ciri orang cenderung lupa ialah keupayaan permintaan Ajax caching. Sebagai contoh, Internet Explorer melakukan ini secara lalai. Saya pernah bergelut selama berjam -jam cuba memikirkan mengapa Ajax saya tidak berfungsi kerana ini. Nasib baik, jQuery membongkar cache penyemak imbas secara lalai. Nah, anda juga boleh di Ajax biasa dan ia cukup mudah:
$.ajax({ url: 'send-ajax-data.php', }) .done(function(res) { console.log(res); }) .fail(function(err) { console.log('Error: ' + err.status); });
setiap dokumentasi jQuery, semua yang dilakukan adalah menambahkan rentetan pertanyaan timestamp ke akhir permintaan. Ini menjadikan permintaan itu agak unik dan busts cache penyemak imbas. Anda dapat melihat bagaimana rupa ini ketika anda memadamkan permintaan http ajax:
Kesimpulan
Saya akan meninggalkan anda dengan cara yang ringkas untuk membuat panggilan Ajax:
// app.js var app = http.createServer(function (req, res) { if (req.url.indexOf('/scripts/') >= 0) { render(req.url.slice(1), 'application/javascript', httpHandler); } else if (req.headers['x-requested-with'] === 'XMLHttpRequest') { // Send Ajax response } else { render('views/index.html', 'text/html', httpHandler); } });dan inilah tindak balas seperti:
Jangan lupa, anda boleh mencari seluruh demo di GitHub. Saya mengalu -alukan mendengar pemikiran anda dengan dan tanpa jQuery dalam komen.
Soalan Lazim (Soalan Lazim) di Vanilla Ajax tanpa JQuery
var xhr = new xmlhttprequest ();
xhr.onreadyStateChange = function () {
console.log (json.parse (xhr.responsetext));
Pengendalian ralat dalam vanila ajax boleh dilakukan dengan menggunakan pengendali acara onError objek XMLHTTPREQUEST. Acara ini dicetuskan apabila ralat berlaku semasa membuat permintaan AJAX. Berikut adalah contoh:
var xhr = new XmlHttPrequest ();
var xhr = new XmlHttPrequest ();
Atas ialah kandungan terperinci Panduan untuk vanila ajax tanpa jQuery. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!