亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > AJAX > 正文

詳解原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法

2024-09-01 08:33:44
字體:
供稿:網(wǎng)友
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法,作者根據(jù)jQuery中一些對AJAX請求的處理方式來用原生API實(shí)現(xiàn),需要的朋友可以參考下
 

在這篇文章,我使用 Node.js作為后端。沒錯,這就可以全棧(瀏覽器和服務(wù)器)JS了。Node.js 是很簡潔的,我鼓勵你能在 Github下載demo,并關(guān)注該項(xiàng)目。下面是服務(wù)器端的代碼:

// app.jsvar 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);  }}

該代碼段通過檢測請求 URL,確定該app返回的相應(yīng)內(nèi)容。如果該請求來自 scripts 目錄,那么服務(wù)器將返回內(nèi)容類型(content type)為 application/javascript 的相應(yīng)文件。如果請求頭部的 x-requested-with 被設(shè)為 XMLHttpRequest,那么該請求是 Ajax 請求,然后返回相應(yīng)數(shù)據(jù)。除了以上兩種情況,服務(wù)器將會返回 views/index.html。

下面我將會展開上一代碼段處理 Ajax 請求的注釋部分進(jìn)行深入講解。在 Node.js端,我已處理了 render 和 httpHandler 的體力活:

// app.jsfunction 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);  }};


render 函數(shù)異步讀取被請求文件的內(nèi)容。該函數(shù)向被作為回調(diào)函數(shù)的 httpHandler 傳遞一個引用。
httpHandler 函數(shù)檢測 error 對象是否存在(如:被請求文件不能被打開,該對象就會存在)。另外,指定類型是好的做法,那么服務(wù)器返回的文件內(nèi)容就會擁有適當(dāng)?shù)?HTTP 狀態(tài)碼(status code)和內(nèi)容類型(content type)。

測試 API
讓我們?yōu)楹蠖薃PI編寫一些單元測試,從而確保它們能正確運(yùn)行。對于這類測試,我會請求 supertest 和 mocha幫助。

// test/app.request.jsit("responds with html", function(done){  request(app)    .get("/")    .expect("Content-Type", /html/)    .expect(200, done);});it('responds with javascript', function (done) {request(app)  .get('/scripts/index.js')  .expect('Content-Type', /javascript/)  .expect(200, done);});it('responds with json', function (done) {request(app)  .get('/')  .set('X-Requested-With', 'XMLHttpRequest')  .expect('Content-Type', /json/)  .expect(200, done);});

這些測試確保了我們的 app 對于不同請求能返回正確的內(nèi)容類型(content type)和HTTP 狀態(tài)碼(status code)。一旦你安裝了這些依賴,那么你就能使用命令 npm test 運(yùn)行這些測試。

界面
現(xiàn)在,讓我們看看用戶界面的 HTML 代碼:

// views/index.html<h1>Vanilla Ajax without jQuery</h1><button id="retrieve" data-url="/">Retrieve</button><p id="results"></p>

上述的 HTML 代碼看起來很簡潔。沒錯,正如你所看到的,所有令人興奮的事情都發(fā)生在 JavaScript。

onreadystate vs onload
如果你看過任何一本權(quán)威的、關(guān)于 Ajax 的書,你可能會發(fā)現(xiàn) onreadystate 在書上隨處可見。該回調(diào)函數(shù)需要通過嵌套的 ifs 或多個 case 語句完成,這使得難以記憶。讓我們再次回顧 onreadystate 和 onload 事件。

(function() {  var retrieve = document.getElementById('retrieve'),    results = document.getElementById('results'),    toReadyStateDescription = function(state) {      switch (state) {        case 0:          return 'UNSENT';        case 1:          return 'OPENED';        case 2:          return 'HEADERS_RECEIVED';        case 3:          return 'LOADING';        case 4:          return 'DONE';        default:          return '';      }    };  retrieve.addEventListener('click', function(e) {    var oReq = new XMLHttpRequest();    oReq.onload = function() {      console.log('Inside the onload event');    };    oReq.onreadystatechange = function() {      console.log('Inside the onreadystatechange ev![此處輸入圖片的描述][1]ent with readyState: ' +        toReadyStateDescription(oReq.readyState));    };    oReq.open('GET', e.target.dataset.url, true);    oReq.send();  });}());

上述代碼會在 控制臺(console) 輸出以下語句:

JavaScript,jQuery,AJAX

onreadystatechange 事件能在請求的任何過程中被觸發(fā)。如能在每個請求前、請求末。但根據(jù)文檔,onload 事件只會在請求成功后觸發(fā)。又因?yàn)?onload 事件是一個常見的 API,所以你能在很短時間內(nèi)掌握它。onreadystatechange 事件可作為后備(原文是backwards compatible 向后兼容?)方案。而 onload 事件應(yīng)該是你的首選。而且 onload 事件與 jQuery 的 success 回調(diào)函數(shù)類似,難道不是嗎?

###設(shè)置請求頭部
jQuery 私下幫你設(shè)置請求頭部了,所以后端能檢測這是一個 Ajax 請求。一般來說,后端并不關(guān)心 GET 請求是從哪而來,只要能返回正確的響應(yīng)即可。當(dāng)你相用同樣的 web API 返回 Ajax 或 HTML 時,這就派上用場了。讓我們看看如何通過原生 JavaScript 設(shè)置請求頭部:

var oReq = new XMLHttpRequest();oReq.open('GET', e.target.dataset.url, true);oReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');oReq.send();

與此同時,我們在 Node.js 做一個檢測:


 

if (req.headers['x-requested-with'] === 'XMLHttpRequest') {  res.writeHead(200, {'Content-Type': 'application/json'});  res.end(JSON.stringify({message: 'Hello World!'}));}

正如你所看到的,原生 Ajax 是一個靈活且現(xiàn)代化的前端 API。你可以利用請求頭部做很多事情,其中一種是版本控制。例如,我想讓某個 web API 支持多個版本。但我又不想利用 URL,取而代之的是:通過設(shè)置請求頭部,使客戶端能選擇它們想要的版本。所以,我們能這樣設(shè)置請求頭部:

oReq.setRequestHeader('x-vanillaAjaxWithoutjQuery-version', '1.0');

然后,在后端寫上相應(yīng)代碼:


 

if (req.headers['x-requested-with'] === 'XMLHttpRequest' &&  req.headers['x-vanillaajaxwithoutjquery-version'] === '1.0') {  // Send Ajax response}

我們能利用 Node.js 為我們提供的 headers 對象進(jìn)行相應(yīng)檢測。而唯一需要注意的地方是:以小寫字母讀取它們。

響應(yīng)類型
你可能想知道為什么 responseText 返回的是字符串,而不是能被我們操作的普通 JSON(Plain Old JSON)。原來是因?yàn)槲覜]有設(shè)置合適的 responseType 屬性。該 Ajax 屬性會很好地告訴前端 API 所期望服務(wù)器返回的數(shù)據(jù)類型。所以,我們要好好利用它:

var oReq = new XMLHttpRequest();oReq.onload = function (e) {  results.innerHTML = e.target.response.message;};oReq.open('GET', e.target.dataset.url, true);oReq.responseType = 'json';oReq.send();

哇,這樣我們就不必再對返回的純文本解析為 JSON 了,我們能告訴 API 我們期待接收的數(shù)據(jù)類型。該特性幾乎得到了所有最新主流瀏覽器的支持。當(dāng)然,jQuery 會自動幫我們轉(zhuǎn)為適當(dāng)?shù)念愋?。但現(xiàn)在的原生 JavaScript 也具有方便的、完成同樣事件的方法。 原生 Ajax 已經(jīng)支持很多其它響應(yīng)類型,如 XML。

但遺憾的是,到 IE11 為止,開發(fā)團(tuán)隊仍未對 xhr.responseType='json' 進(jìn)行支持。雖然該特性目前在 Microsoft Edge 得到支持。但這個 Bug 提出幾乎兩年了。我堅信 Microsoft 團(tuán)隊一直在努力地改進(jìn)瀏覽器。讓我們期待 Microsoft Edge、aka Project Spartan 當(dāng)初提出的承諾。
當(dāng)然,你可以這個解決這個 IE 問題:

oReq.onload = function (e) {  var xhr = e.target;  if (xhr.responseType === 'json') {    results.innerHTML = xhr.response.message;  } else {    results.innerHTML = JSON.parse(xhr.responseText).message;  }};

避免緩存
對 Ajax 請求進(jìn)行緩存的瀏覽器特性都快被我們忘記了。例如,IE 就默認(rèn)是這樣。我還曾因此導(dǎo)致我的 Ajax 不執(zhí)行而苦惱了幾個小時。幸運(yùn)的是,jQuery 默認(rèn)清除瀏覽器緩存。當(dāng)然,你能在純 Ajax 達(dá)到該目的,而且相當(dāng)簡單:

var bustCache = '?' + new Date().getTime();oReq.open('GET', e.target.dataset.url + bustCache, true);

查看 jQuery 文檔,可知道 jQuery 在每個請求(GET)后面追加一個時間戳作為查詢字符串。這在某個程度上讓請求變得獨(dú)一無二,并避免瀏覽器緩存。每當(dāng)你觸發(fā) HTTP Ajax 請求,你能看到類似如下請求:

JavaScript,jQuery,AJAX

OK!這就沒有戲劇性的事情發(fā)生了。

總結(jié)
我希望你能喜歡這篇關(guān)于原生 Ajax 的文章。Ajax 在過去某段時間里,被人們看作是一種可怕的怪獸。而事實(shí)上,我們已經(jīng)覆蓋了原生 Ajax 所有基礎(chǔ)知識。

最后,我會留給你一個簡潔的方式進(jìn)行Ajax調(diào)用:

var oReq = new XMLHttpRequest();oReq.onload = function (e) {  results.innerHTML = e.target.response.message;};oReq.open('GET', e.target.dataset.url + '?' + new Date().getTime(), true);oReq.responseType = 'json';oReq.send();


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
无码av中文一区二区三区桃花岛| 国产精品久久久久久吹潮| 糖心vlog精品一区二区| wwwjizzjizzcom| 激情综合久久| 69成人在线| 视频在线你懂的| 四虎免费在线视频| 图片区日韩欧美亚洲| 亚洲精品一卡二卡三卡四卡| 日韩久久免费视频| 欧美不卡视频在线观看| 久久成人av网站| 国产91热爆ts人妖在线| 成人毛片视频免费看| 青青热久免费精品视频在线18| 日韩在线第二页| 密臀av在线播放| 97av视频在线| 一级一片免费看| 免费网站成人| se01亚洲视频| 国产精品美女久久久久高潮| 午夜视频久久久| 亚洲一区免费| 国产精品一级在线观看| jizzjizzjizz欧美| 欧美三级午夜理伦三级中视频| 国产黄色免费电影| 国产亚洲欧美精品久久久久久| 久久尤物电影视频在线观看| 欧美另类黑人巨大videos| 欧美性猛交xx乱大交| 国产精品美女久久久久久久久久久| 大胆人体色综合| 精品国产欧美日韩不卡在线观看| 亚洲电影有码| 国产精品视频一区二区三区四蜜臂| 国产sm在线观看| 精品少妇无遮挡毛片| 免费高清视频在线观看| 欧美一区二区黄| 九九久久免费视频| 日本免费在线观看视频| 色婷婷一区二区三区四区| 国产又大又粗又爽| 少妇毛片一区二区三区| 国产精品porn| 电影久久久久久| seba5欧美综合另类| 久久久成人精品视频| 插吧插吧综合网| 97人妻精品一区二区三区免费| 黄色小视频在线播放| 亚洲成人动漫在线观看| 人人妻人人澡人人爽精品欧美一区| 国产麻豆剧果冻传媒观看hd高清| 成人免费视屏| 成人污网站在线观看| 中文字幕日韩在线视频| 成年女人免费视频| 亚洲国产视频a| 国产精品入口麻豆九色| 日韩av电影在线网| 国产乱妇乱子| 欧美一级欧美一级在线播放| xnxx国产精品| 欧美大胆成人| 亚洲国产一区二区在线| 一区在线观看免费| 久久精品国产99国产精品| 国产永久精品大片wwwapp| 一区二区在线| 欧美日韩一区二区三区视视频| 日韩成人在线播放| 日韩精品无码一区二区三区免费| 首页亚洲欧美制服丝腿| 欧美一级欧美一级在线播放| 亚洲国内在线| 在线观看视频h| 精品国产aⅴ| 亚洲图片欧美午夜| 国产成人福利av| 成人h动漫精品一区二区器材| 91视频精品在这里| 精品一区免费av| 三级视频在线看| 亚洲一级Av无码毛片久久精品| 影音日韩av| 嫩草嫩草嫩草嫩草| 亚洲熟女乱色一区二区三区久久久| 亚洲美免无码中文字幕在线| 99国产精品视频免费观看| 男人久久天堂| 人妻少妇精品无码专区久久| 成人不卡视频| 免费视频一区| 裸体丰满少妇做受久久99精品| 第三区美女视频在线| 一级性生活视频| 日本亚洲精品在线观看| yy6080午夜| 99热手机在线观看| 不要播放器的av网站| 亚洲视频综合| 自己做鸭怎么接单寻找客源| 欧洲精品视频在线| 国产精品一在线观看| 色一情一伦一子一伦一区| 7777女厕盗摄久久久| 色欲无码人妻久久精品| 国产伦精品一区二区三区免费优势| 久久国产精品亚洲人一区二区三区| 菠萝菠萝蜜在线观看| 国产porn视频| 免费男女羞羞的视频网站中文子暮| 亚洲高清久久久久久| 国产三级国产精品国产专区50| 国产精品视频最多的网站| 视频免费在线观看| 免费看黄色网址| 在线观看日韩一区| 国产精品10p综合二区| 久久久久久久久国产一区| 久久久久久久久久久妇女| 午夜精品在线播放| 污污的网站在线看| 日韩经典在线观看| 欧美在线视频不卡| 亚洲图区在线| 日本人成精品视频在线| 伊人久久大香线蕉综合四虎小说| 66m—66摸成人免费视频| 北岛玲精品视频在线观看| 人妻在线日韩免费视频| 欧美大片aaaa| 亚洲成人激情视频| 国产一级二级三级精品| 精品国产a一区二区三区v免费| h1515四虎成人| 国产这里有精品| 不卡的av一区| 曰本人一级毛片免费完整视频| 偷拍欧美精品| jizzjizzjizzjizz日本老师| 亚洲欧美日韩国产一区| www.日韩在线| 免费在线中文字幕| 久久黄色片视频| 成人字幕网zmw| 亚洲色图19p| 影音先锋久久资源网| 美女脱光内衣内裤视频久久网站| 中文天堂在线视频| 亚洲人成电影在线观看天堂色| 女女调教被c哭捆绑喷水百合| 国产精品美乳一区二区免费| av日韩在线网站| 亚洲国产欧美另类丝袜| 欧美亚洲激情视频| 亚洲经典视频在线观看| 黄色91av| 美日韩中文字幕| 中文在线官网天堂| 亚欧洲精品在线视频免费观看| www.色婷婷.com| 在线视频欧美日韩精品| 91亚洲成人| 青青青国产在线观看| 国产精品任我爽爆在线播放| 久久91亚洲精品中文字幕奶水| 成年片费网站色大全免费视频| 男人的天堂成人| 国产精品jizz| 性色88av老女人视频| 日本一二三四高清不卡| 国产深夜精品福利| 亚洲精品v欧美精品v日韩精品| 国产精品第1页| 国产污视频在线| 亚洲精品国产嫩草在线观看| 日韩亚洲欧美视频| 欧美性受xxxx黒人xyx性爽| www.四虎.com| 午夜视频在线免费播放| 天天干在线视频论坛| 精品国产一区二区三区日日嗨| 久久大大胆人体| 成年网站在线观看| 久久无码精品丰满人妻| 韩国午夜理伦三级不卡影院| 国产精品久久久久91| 国产麻豆9l精品三级站| 欧美性videos高清精品| 亚洲一区在线视频观看| 日韩欧美国产免费播放| 国产精品视频午夜| 亚洲精品午夜视频| 日本视频免费| 亚洲午夜精品一区二区三区| 久久视频一区二区三区| 日本三级中国三级99人妇网站| 黄页在线观看视频| 欧美激情 国产精品| 欧美黄色大片网站| 欧美人妻一区二区| 日韩在线视屏| 中文字幕亚洲精品一区| 久久久影院一区二区三区| 风间由美一区| 欧美va天堂va视频va在线| 免费污片软件| 欧美在线黄色| 在线观看亚洲| 五月天婷婷综合| 超碰97在线播放| 一区二区成人国产精品| 国产精品视频免费看| 日本不良网站在线观看| 亚洲AV无码一区二区三区少妇| 老太脱裤子让老头玩xxxxx| 亚洲专区区免费| 欧美99在线视频观看| 天天操,天天操| 伊人国产精品| 亚洲国产欧美另类| 亚洲色图20p| 欧美另类videos黑人极品| 日皮视频免费观看| 亚洲一区二区三区四区在线免费观看| 国产精品日本一区二区三区在线| a级免费在线观看| x88av蜜桃臀一区二区| 亚洲国产日韩一区无码精品久久久| 韩国av一区二区三区四区| 国产一区二区中文字幕免费看| 成人一级片在线观看| 欧美美女啪啪| 欧美a视频在线| 99pao成人国产永久免费视频| 国产精品国产三级国产aⅴ中文| 无码人妻精品一区二区蜜桃色欲| 欧美日韩一区二区三区高清| 免费在线观看视频a| 欧美福利视频| 国产1区2区3区中文字幕| 深田咏美中文字幕| 黄色片在线观看网站| 成年网站在线视频网站| 国产精品一二三区在线观看| 国产精品探花在线| 中文一区一区三区免费| 日韩国产欧美精品在线| 翔田千里一区二在线观看| 精品人妻一区二区三区日产乱码卜| 国模私拍视频| 97色在线视频观看| 印度午夜性春猛xxx交| 色欲一区二区三区精品a片| 亚洲欧美制服中文字幕| 竹内纱里奈兽皇系列在线观看| 亚洲天堂资源在线| 天堂资源在线亚洲视频| 精品人妻一区二区三区日产乱码卜| 久久国产精品99国产| 国产黄色一级电影| 性色av无码久久一区二区三区| 日韩中文字幕区一区有砖一区| 激情亚洲另类图片区小说区| 粉嫩91精品久久久久久久99蜜桃| 黄一区二区三区| 欧美巨大另类极品videosbest| 亚洲精品中文字幕在线播放| 91av一区| √天堂资源在线| 日韩在线中文字幕| 极品粉嫩美女露脸啪啪| 136av视频导航| 亚洲精品女人久久久| 国产久卡久卡久卡久卡视频精品| 天海翼一区二区三区免费| 日韩视频中文字幕| aaaaaaaa毛片| 久久久国产欧美| 国产精品毛片无遮挡高清| 国产美女精品免费电影| 四虎亚洲成人| 欧美精品亚洲精品| 亚洲国产天堂网精品网站| zzijzzij亚洲日本少妇熟睡| 精品精品国产毛片在线看| 欧美日本一道本在线视频| 亚洲第一综合色| 一级 黄 色 片一| 中文字幕二区三区| 影音先峰男人站| 中文 欧美 日韩| 亚洲精品乱码久久久久久蜜桃91| 亚洲精品日韩在线| 亚洲狠狠婷婷综合久久久| 久久草视频在线看| a级日韩大片| 热久久最新地址| 91精品办公室少妇高潮对白| 天堂午夜影视日韩欧美一区二区| 黑粗硬长欧美在线视频免费的| 国产又粗又大又爽视频| 日韩欧美电影一区二区| 天堂8中文在线| 在线看无码的免费网站| 男人天堂新网址| 国产三区精品| 妞干网免费视频| 国产污污在线观看| 国产精品最新| 欧美三级视频在线观看| 最近的2019中文字幕免费一页| 日日日日人人人夜夜夜2017| 岛国av一区二区在线在线观看| 六月丁香激情综合| 91成人福利在线| 国产精品一区二区不卡视频| 亚洲色图17p| 婷婷激情5月天| 日日骚一区二区网站| 欧美日韩国产一级二级| av资源网一区| 亚洲成人动漫在线观看|