日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分别使用 XHR、jQuery 和 Fetch 实现 AJAX

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分别使用 XHR、jQuery 和 Fetch 实现 AJAX 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文詳細講述如何使用原生 JS、jQuery 和 Fetch 來實現 AJAX。

AJAX 即 Asynchronous JavaScript and XML,異步的 JavaScript 和 XML。使用 AJAX 可以無刷新地向服務端發送請求接收服務端響應,并更新頁面。

一、原生 JS 實現 AJAX

JS 實現 AJAX 主要基于瀏覽器提供的 XMLHttpRequest(XHR)類,所有現代瀏覽器(IE7+、Firefox、Chrome、Safari 以及 Opera)均內建 XMLHttpRequest 對象。

1. 獲取XMLHttpRequest對象

// 獲取XMLHttpRequest對象var xhr = new XMLHttpRequest();

如果需要兼容老版本的 IE (IE5, IE6) 瀏覽器,則可以使用 ActiveX 對象:

var xhr;if (window.XMLHttpRequest) { // Mozilla, Safari...xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IEtry {xhr = new ActiveXObject('Msxml2.XMLHTTP');} catch (e) { ? ?try {xhr = new ActiveXObject('Microsoft.XMLHTTP');} catch (e) {}} }

2. 發送一個 HTTP 請求

接下來,我們需要打開一個URL,然后發送這個請求。分別要用到 XMLHttpRequest 的 open() 方法和 send() 方法。

// GETvar xhr;if (window.XMLHttpRequest) { // Mozilla, Safari...xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IEtry {xhr = new ActiveXObject('Msxml2.XMLHTTP');} catch (e) { ? ?try {xhr = new ActiveXObject('Microsoft.XMLHTTP');} catch (e) {}} }if (xhr) {xhr.open('GET', '/api?username=admin&password=root', true);xhr.send(null); }// POSTvar xhr;if (window.XMLHttpRequest) { // Mozilla, Safari...xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IEtry {xhr = new ActiveXObject('Msxml2.XMLHTTP');} catch (e) { ? ?try {xhr = new ActiveXObject('Microsoft.XMLHTTP');} catch (e) {}} }if (xhr) {xhr.open('POST', '/api', true); ?// 設置 Content-Type 為 application/x-www-form-urlencoded// 以表單的形式傳遞數據xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send('username=admin&password=root'); }

open() 方法有三個參數:

  • open() 的第一個參數是 HTTP 請求方式 – GET,POST,HEAD 或任何服務器所支持的您想調用的方式。按照HTTP規范,該參數要大寫;否則,某些瀏覽器(如Firefox)可能無法處理請求。有關HTTP請求方法的詳細信息可參考?https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

  • 第二個參數是請求頁面的 URL。由于同源策略(Same origin policy)該頁面不能為第三方域名的頁面。同時一定要保證在所有的頁面中都使用準確的域名,否則調用 open() 會得到 permission denied 的錯誤提示。

  • 第三個參數設置請求是否為異步模式。如果是 TRUE ,JavaScript 函數將繼續執行,而不等待服務器響應。這就是 AJAX 中的 A。

如果第一個參數是 GET ,則可以直接將參數放在 url 后面,如: http://nodejh.com/api?name=admint&password=root 。

如果第一個參數是 POST ,則需要將參數寫在 send() 方法里面。send() 方法的參數可以是任何想送給服務器的數據。這時數據要以字符串的形式送給服務器,如: name=admint&password=root 。或者也可以傳遞 JSON 格式的數據:

// 設置 Content-Type 為 application/jsonxhr.setRequestHeader('Content-Type', 'application/json');// 傳遞 JSON 字符串xhr.send(JSON.stringify({ username:'admin', password:'root' }));

如果不設置請求頭,原生 AJAX 會默認使用 Content-Type 是 text/plain;charset=UTF-8 的方式發送數據。

關于 Content-Type 更詳細的內容,將在以后的文章中解釋說明。

3. 處理服務器的響應

當發送請求時,我們需要指定如何處理服務器的響應,我們需要用到 onreadystatechange 屬性來檢測服務器的響應狀態。使用 onreadystatechange 有兩種方式,一是直接 onreadystatechange 屬性指定一個可調用的函數名,二是使用一個匿名函數:

// 方法一 指定可調用的函數xhr.onreadystatechange = onReadyStateChange;function onReadyStateChange() { ?// do something}// 方法二 使用匿名函數xhr.onreadystatechange = function(){ ? ?// do the thing};

接下來我們需要在內部利用 readyState 屬性來獲取當前的狀態,當 readyState 的值為 4,就意味著一個完整的服務器響應已經收到了,接下來就可以處理該響應:

// readyState的取值如下// 0 (未初始化)// 1 (正在裝載)// 2 (裝載完畢)// 3 (交互中)// 4 (完成)if (xhr.readyState === 4) { ? ?// everything is good, the response is received} else { ? ?// still not ready}

完整代碼如下:

// POSTvar xhr;if (window.XMLHttpRequest) { // Mozilla, Safari...xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IEtry {xhr = new ActiveXObject('Msxml2.XMLHTTP');} catch (e) { ? ?try {xhr = new ActiveXObject('Microsoft.XMLHTTP');} catch (e) {}} }if (xhr) {xhr.onreadystatechange = onReadyStateChange;xhr.open('POST', '/api', true); ?// 設置 Content-Type 為 application/x-www-form-urlencoded// 以表單的形式傳遞數據xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send('username=admin&password=root'); }// onreadystatechange 方法function onReadyStateChange() { ?// 該函數會被調用四次console.log(xhr.readyState); ?if (xhr.readyState === 4) { ? ?// everything is good, the response is receivedif (xhr.status === 200) { ? ? ?console.log(xhr.responseText);} else { ? ? ?console.log('There was a problem with the request.');}} else { ? ?// still not readyconsole.log('still not ready...');} }

當然我們可以用onload來代替onreadystatechange等于4的情況,因為onload只在狀態為4的時候才被調用,代碼如下:

xhr.onload = function () { ? ?// 調用onloadif (xhr.status === 200) { ? ?// status為200表示請求成功console.log('執行成功');} else { ? ? ? ?console.log('執行出錯');} }

然而需要注意的是,IE對 onload 屬性的支持并不友好。除了 onload 還有以下幾個屬性也可以用來監測響應狀態:

  • onloadstart

  • onprogress

  • onabort

  • ontimeout

  • onerror

  • onloadend

二、 jQuery 實現 AJAX

jQuery 作為一個使用人數最多的庫,其 AJAX 很好的封裝了原生 AJAX 的代碼,在兼容性和易用性方面都做了很大的提高,讓 AJAX 的調用變得非常簡單。下面便是一段簡單的 jQuery 的 AJAX 代碼:

$.ajax({method: 'POST',url: '/api',data: { username: 'admin', password: 'root' } }).done(function(msg) {alert( 'Data Saved: ' + msg );});

對比原生 AJAX 的實現,使用 jQuery 就異常簡單了。當然我們平時用的最多的,是下面兩種更簡單的方式:

// GET$.get('/api', function(res) { ?// do something});// POSTvar data = {username: 'admin',password: 'root'}; $.post('/api', data, function(res) { ?// do something});

三、Fetch API

使用 jQuery 雖然可以大大簡化 XMLHttpRequest 的使用,但 XMLHttpRequest 本質上但并不是一個設計優良的 API:

  • 不符合關注分離(Separation of Concerns)的原則

  • 配置和調用方式非常混亂

  • 使用事件機制來跟蹤狀態變化

  • 基于事件的異步模型沒有現代的 Promise,generator/yield,async/await 友好

Fetch API 旨在修正上述缺陷,它提供了與 HTTP 語義相同的 JS 語法,簡單來說,它引入了 fetch() 這個實用的方法來獲取網絡資源。

Fetch 的瀏覽器兼容圖如下:

?

原生支持率并不高,幸運的是,引入下面這些 polyfill 后可以完美支持 IE8+:

  • 由于 IE8 是 ES3,需要引入 ES5 的 polyfill:?es5-shim, es5-sham

  • 引入 Promise 的 polyfill:?es6-promise

  • 引入 fetch 探測庫:?fetch-detector

  • 引入 fetch 的 polyfill:?fetch-ie8

  • 可選:如果你還使用了 jsonp,引入?fetch-jsonp

  • 可選:開啟 Babel 的 runtime 模式,現在就使用 async/await

1. 一個使用 Fetch 的例子

先看一個簡單的 Fetch API 的例子 :chestnut: :

fetch('/api').then(function(response) { ?return response.json(); }).then(function(data) { ?console.log(data); }).catch(function(error) { ?console.log('Oops, error: ', error); });

使用 ES6 的箭頭函數后:

fetch('/api').then(response => response.json()).then(data => console.log(data)).catch(error => console.log('Oops, error: ', error))

可以看出使用Fetch后我們的代碼更加簡潔和語義化,鏈式調用的方式也使其更加流暢和清晰。但這種基于 Promise 的寫法還是有 Callback 的影子,我們還可以用 async/await 來做最終優化:

async function() { ?try { ? ?let response = await fetch(url); ? ?let data = response.json(); ? ?console.log(data);} catch (error) { ? ?console.log('Oops, error: ', error);} }

使用 await 后,寫代碼就更跟同步代碼一樣。 await 后面可以跟 Promise 對象,表示等待 Promise resolve() 才會繼續向下執行,如果 Promise 被 reject() 或拋出異常則會被外面的 try...catch 捕獲。

Promise,generator/yield,await/async 都是現在和未來 JS 解決異步的標準做法,可以完美搭配使用。這也是使用標準 Promise 一大好處。

2. 使用 Fetch 的注意事項

  • Fetch 請求默認是不帶 cookie,需要設置 fetch(url, {credentials: 'include'}) `

  • 服務器返回 400,500 錯誤碼時并不會 reject,只有網絡錯誤這些導致請求不能完成時,fetch 才會被 reject

接下來將上面基于 XMLHttpRequest 的 AJAX 用 Fetch 改寫:

var options = {method: 'POST',headers: { ? ? ?'Accept': 'application/json', ? ? ?'Content-Type': 'application/json'},body: JSON.stringify({ username: 'admin', password: 'root' }),credentials: 'include'};fetch('/api', options).then(response => response.json()).then(data => console.log(data)).catch(error => console.log('Oops, error: ', error))


總結

以上是生活随笔為你收集整理的分别使用 XHR、jQuery 和 Fetch 实现 AJAX的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久亚洲AV无码专区成人国产 | 人人搞人人干 | 国产av一区精品 | 射久久| 男生女生操操操 | 亚洲自拍p | 少妇一边呻吟一边说使劲视频 | 91国产丝袜播放在线 | 99久久亚洲精品日本无码 | 一级伦理农村妇女愉情 | 夜色视频在线观看 | 涩涩视频网 | 最新中文在线视频 | 天天操狠狠干 | 日本免费观看视频 | 超碰在线网站 | 国产传媒在线播放 | 伦乱天堂 | 很色的网站 | 日韩在线视频观看 | 亚洲欧美国产精品专区久久 | 中国女人一级一次看片 | 国产中文字幕网 | 国产成人精品综合久久久久99 | 公肉吊粗大爽色翁浪妇视频 | 俄罗斯美女一级爱片 | 国产在线色 | 91成人免费版 | 华人永久免费视频 | 亚洲逼逼 | 啪啪福利 | 最新日韩在线视频 | 免费视频国产 | 日美女逼逼 | 一卡二卡在线 | 午夜视频在线免费看 | 精品人妻一区二区三区香蕉 | 欧美性猛交 xxxx | 一级裸体片 | 中国少妇高潮 | 在线播放无码后入内射少妇 | av国产片 | 秋霞国产精品 | 久久av一区二区三区漫画 | 国产中文在线观看 | 高h捆绑拘束调教小说 | 他揉捏她两乳不停呻吟动态图 | 国产麻豆一区二区三区在线观看 | 成人精品视频一区二区 | 一区国产精品 | 久久国产视频网站 | 欧美视频一二三 | 制服av在线 | 黄网地址 | 国产女人18毛片水真多1 | 日韩视频一区在线观看 | 91极品在线 | 国产视频手机在线播放 | 色偷偷网站 | 男人添女人下部高潮全视频 | 成人乱人乱一区二区三区 | h片在线播放 | 日韩二三区| 国产精品国产一区二区 | 色网站女女 | 夜色一区二区三区 | 亚洲精品乱码久久久久久蜜桃欧美 | 黄色欧美在线观看 | 亚洲欧美日韩精品在线 | 69xxx少妇按摩视频 | 老司机一区二区三区 | 日韩社区| 亚洲图片一区二区 | 国产美女无遮挡永久免费 | 亚洲美女视频在线观看 | 亚洲aaa| www.亚色| 成人精品一区二区 | 夜夜夜网站 | 97超碰人人模人人人爽人人爱 | 日本一区二区高清不卡 | 成人看片黄a免费看视频 | 一区二区三区视频在线观看 | 国产精品视频一二区 | 理论黄色片 | 国产主播啪啪 | 在线日本中文字幕 | 久久夜色精品亚洲 | 91精品亚洲一区 | 两性视频久久 | 日本视频免费在线播放 | 中文精品一区二区三区 | 日本美女毛茸茸 | 99爱这里只有精品 | 精品日韩在线观看 | 性生生活大片又黄又 | 日韩一区二区影院 | 国产原创在线视频 | 国产精品免费一区二区三区在线观看 |