Rumah >hujung hadapan web >tutorial js >Panduan untuk vanila ajax tanpa jQuery

Panduan untuk vanila ajax tanpa jQuery

Christopher Nolan
Christopher Nolanasal
2025-02-19 11:58:10697semak imbas

Panduan untuk vanila ajax tanpa jQuery

Takeaways Key

    Ajax, pendek untuk JavaScript dan XML Asynchronous, membolehkan kemas kini halaman separa, mengurangkan keperluan untuk menyegarkan halaman penuh dan membolehkan lebih banyak pengalaman pengguna cecair. Anatomi asas permintaan AJAX melibatkan membuat contoh kelas yang diperlukan untuk permintaan HTTP, menyatakan kaedah permintaan HTTP dan URL halaman, dan menghantar permintaan.
  • Walaupun jQuery dapat memudahkan permintaan Ajax, ia tidak selalu diperlukan. AJAX API dalam vanila JavaScript telah mengalami penambahbaikan yang ketara, dan spesifikasi XMLHTTPREQUEST kini dianggap sebagai entiti tunggal dari perspektif piawaian, yang menunjukkan komitmen oleh masyarakat untuk berpegang pada satu standard.
  • Vanilla Ajax menyediakan API front-end yang fleksibel dan moden. Ia membolehkan menetapkan tajuk permintaan, menyatakan jenis tindak balas yang diharapkan dari pelayan, dan menghancurkan cache penyemak imbas. Walaupun Ajax pernah menjadi proses yang kompleks, ia menjadi lebih mudah dan mesra pengguna.
  • Pendek untuk JavaScript dan XML Asynchronous, Ajax adalah mekanisme untuk membuat kemas kini halaman separa. Ia membolehkan anda mengemas kini bahagian halaman dengan data yang datang dari pelayan, sambil mengelakkan keperluan untuk menyegarkan penuh. Membuat kemas kini separa dengan cara ini boleh menjadi berkesan dalam mewujudkan pengalaman pengguna cecair dan dapat mengurangkan beban yang diletakkan pada pelayan.
Ini adalah anatomi permintaan Ajax asas:

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.

Menggunakan jQuery, seseorang boleh mengekang keseluruhan coretan ke:

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 ...

persediaan

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.

Menguji API

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.

antara muka

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.

onreadystate vs onload

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:

Panduan untuk vanila ajax tanpa jQuery

Acara OnreadyState kebakaran di seluruh tempat. Ia kebakaran pada permulaan setiap permintaan, pada akhirnya, dan kadang -kadang hanya kerana ia benar -benar suka dipecat. Tetapi menurut spec, peristiwa onload kebakaran hanya apabila permintaan

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

JQuery menetapkan pengepala permintaan di bawah penutup supaya teknologi back-end anda tahu ia adalah permintaan Ajax. Secara umum, back-end tidak peduli di mana permintaan GET datang selagi ia menghantar respons yang betul. Ini berguna apabila anda ingin menyokong Ajax dan HTML dengan API Web yang sama. Oleh itu, mari kita lihat cara menetapkan tajuk permintaan di Vanilla Ajax:

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

Anda mungkin tertanya -tanya mengapa responsetext mengandungi respons pelayan apabila semua yang saya bekerjasama adalah JSON lama biasa. Ternyata, itu kerana saya tidak menetapkan reponsetype yang betul. Atribut Ajax ini sangat bagus untuk memberitahu API depan apa jenis tindak balas yang diharapkan dari pelayan. Jadi, mari kita gunakan dengan baik:

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.
    }
  }
};

Cache busting

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:

Panduan untuk vanila ajax tanpa jQuery

tada! Semua tanpa drama.

Kesimpulan

Saya harap anda telah menikmati 300lb Bench Press Vanilla Ajax dulu. Satu pada suatu masa, Ajax adalah binatang yang mengerikan, tetapi tidak lagi. Sebenarnya, kami telah merangkumi semua asas Ajax tanpa tongkat, belenggu, jQuery.

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:

Panduan untuk vanila ajax tanpa jQuery 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

Apakah vanila ajax dan bagaimanakah ia berbeza dari jQuery Ajax? Walaupun JQuery Ajax menyediakan kaedah yang serasi dengan silang, penyemak imbas untuk mengendalikan Ajax, Vanilla Ajax memberi anda lebih banyak kawalan dan pemahaman tentang proses yang mendasari. Ia juga merupakan pilihan yang hebat jika anda ingin mengurangkan kebergantungan pada perpustakaan luaran seperti jQuery.

Bagaimana saya membuat permintaan Ajax asas menggunakan vanila JavaScript? Objek ini membolehkan anda menghantar permintaan HTTP atau HTTPS ke pelayan web dan memuatkan data respons pelayan kembali ke skrip anda. Berikut adalah contoh mudah:

var xhr = new xmlhttprequest (); xhr.open ("get", 'https://api.example.com/data', true);
xhr.onreadyStateChange = function () { if (xhr.readystate == 4 && xhr.status == 200)
console.log (json.parse (xhr.responsetext)); xhr.send (); 🎜>
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 (); xhr.open ("get", 'https://api.example.com/data', benar); .onerror = function () { console.log ("Permintaan gagal "); ; xhr.send (); Kaedah terbuka objek XMLHTTPREQUEST menerima kaedah HTTP sebagai hujah pertama. Jadi, anda boleh menggantikan "Dapatkan" dengan "Pos". Ingatlah untuk menetapkan tajuk jenis kandungan menggunakan kaedah setRequestheader sebelum menghantar permintaan. Permintaan, anda perlu mengawal objek JSON dan menghantarnya sebagai badan permintaan. Juga, tetapkan tajuk jenis kandungan ke Aplikasi/JSON. Berikut adalah contoh:

var xhr = new XmlHttPrequest (); xhr.open ("pos", 'https://api.example.com/data', benar); .setRequestHeader ("kandungan-jenis", "Permohonan/JSON"); Anda boleh membatalkan permintaan AJAX dengan memanggil kaedah abort objek XMLHTTPREQUEST. Ini akan segera menamatkan permintaan. . Untuk membuat permintaan segerak, lulus palsu sebagai hujah ketiga dengan kaedah terbuka. Pengendali acara ONPROGRESS objek XMLHTTPREQUEST. Acara ini dicetuskan beberapa kali, memberikan maklumat kemajuan semasa. . Ia adalah ciri JavaScript asli dan tidak bergantung kepada mana -mana perpustakaan luaran.

Adakah vanila ajax disokong oleh semua penyemak imbas? Walau bagaimanapun, versi lama Internet Explorer (iaitu 6 dan lebih awal) menggunakan objek ActiveX untuk Ajax.

Atas ialah kandungan terperinci Panduan untuk vanila ajax tanpa jQuery. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn